消除E:= EE + | EE- | id的左递归

The*_*One 3 compiler-construction grammar parsing lexical-analysis context-free-grammar

如何消除以下语法的左递归?

E := EE+|EE-|id
Run Code Online (Sandbox Code Playgroud)

使用常用程序:

A := Aa|b
Run Code Online (Sandbox Code Playgroud)

翻译为:

A := b|A'
A' := ?| Aa 
Run Code Online (Sandbox Code Playgroud)

将其应用于原始语法我们得到:

A = E, a = (E+|E-) and b = id
Run Code Online (Sandbox Code Playgroud)

因此:

E := id|E'
E' := ?|E(E+|E-)
Run Code Online (Sandbox Code Playgroud)

但这个语法似乎不正确,因为

?E+ -> ? id +
Run Code Online (Sandbox Code Playgroud)

将是有效的,但这是一个不正确的后缀表达式.

Kon*_*lph 10

你的"共同程序"被引错了.从龙书中取出:

A := A? | ?
Run Code Online (Sandbox Code Playgroud)

A  := ?A?
A? := ?A? | ?
Run Code Online (Sandbox Code Playgroud)

...产生:

E  := id E?
E? := (E + | E -) E? | ?
Run Code Online (Sandbox Code Playgroud)