Compiler construction 编译器设计与左递归消除

Compiler construction 编译器设计与左递归消除,compiler-construction,programming-languages,grammar,Compiler Construction,Programming Languages,Grammar,比如说 E -> E+T | T 会是 E -> T E' E' -> +T E' | null 如果我有生产 B -> B == C | C 这些是正确的产品吗 B -> C B' B' -> ==C B' | null 我遇到麻烦的另一个接线员是“!”,我知道除了“()”之外,它比我语法中的任何东西都有更高的优先级 我想到了这个,但不确定它是否正确 T -> U T' T' -> *U T' | /U T' | null U -&g

比如说

E -> E+T | T
会是

E -> T E'
E' -> +T E' | null
如果我有生产

B -> B == C | C
这些是正确的产品吗

B -> C B'
B' -> ==C B' | null
我遇到麻烦的另一个接线员是“!”,我知道除了“()”之外,它比我语法中的任何东西都有更高的优先级 我想到了这个,但不确定它是否正确

T  -> U T'
T' -> *U T' | /U T' | null
U  -> ! ident | F
F  -> (A) | idlit | ftncall
ftncall -> ident(params)

我认为这两种方法都是正确的,除了在第二种方法中,您还必须定义
params
id list

比如:

参数->id | id,参数

为了弄清楚语法是否有(不明确的)左递归,最简单的方法是将语法提供给bison,parse generator,如果语法不明确,它将发出警告/错误消息

正如@同上所提到的,bison正确解析了无歧义的左递归语法。
有几个在线教程(开始时,您可以使用:)

Bison不会警告左递归-事实上,对于Bison,您希望在它自然出现的地方使用左递归。@同上,很抱歉,我被模糊的左递归语法弄糊涂了。