语法如下:
E->a
E->E+E
E->S,E
E->(E)
S-> bS'
S'-> ;bS'
S'->
我不知道如何删除左递归,因为 E 包含终结符和非终结符。并且有左递归和右递归。
首先让我解释一下什么是左递归: 形式的任何语法
A → Aα<sub>1</sub> | Aα<sub>2</sub> |...|Aα<sub>n</sub> | β<sub>1</sub> |β<sub>2</sub>|...|β<sub>n</sub>
被称为包含左递归,因为非终结符 A 出现在产生式的左侧,并且也是产生式右侧的第一个符号。 通过应用以下转换,可以将这样的文法转换为无左递归的等价形式:
A → β<sub>1</sub>A' |β<sub>2</sub>A'|...|β<sub>n</sub>A' <br/>
A' → α<sub>1</sub>A' | α<sub>2</sub>A' |...|α<sub>n</sub>A'
将你的语法放在相同的形式中,我们得到
E → E+E | a | S,E | (E) <br/>
S → bS'<br/>
S' → ;bS' | ε
我们可以看到左递归只发生在 E 产生式的情况下,并且也只发生在右边是 E+E 的情况下 所以我们可以在这里进行如下匹配:
α is equivalent to +E <br/>
β<sub>1</sub> is equivalent to a<br/>
β<sub>2</sub> is equivalent to S,E<br/>
β<sub>3</sub> is equivalent to (E)<br/>
现在我们可以直接代入得到如下
E → aE' | S,EE' | (E)E' <br/>
E' → +EE' | ε
注意与S和S'相关的产生式保持不变。 这个文法没有左递归。