编译原理之消除算术表达式文法的左递归
现在给定如下算术表达式文法:
expr -> expr + term
| expr - term
| term
term -> term * factor
| term / factor
| factor
factor -> ( expr )
| number
| id
很明显,上诉文法中,expr
和 term
都有左递归。
为了消除上诉文法的左递归,可以将插入新的非终结符号,转换为右递归。
先假定有如下产生式(α 和 β 是不以 A 开头的终结符号/非终结符号):
A -> A α | β
因为 A -> β
,所以有 A -> β ε
因为 A -> β
以及 A -> A α
,所以有 A -> β α
又因为 A -> β ε
和 A -> β α
。
所以有 A -> β (α | ε)
让 R -> α | ε
,既有 R -> αR | ε
最终文法如下:
A -> β R
R -> αR | ε
让我们回到具体的算术表达式的文法上:
expr -> expr + term
| expr - term
| term
因为 expr -> term
,所以又 expr -> term ε
因为 expr -> term
以及 expr -> expr + term
,所以有 expr -> term + term
又因为 expr -> term ε
和 expr -> term + term
。
所以有 expr -> term ( + term | ε)
让 R -> + term | ε
,既有 R -> + term R | ε
得出文法如下:
expr -> term R
R -> + term
| - term
| ε
更加详细的消除左递归可以看看龙书。
下面给出本文给定算术表达式消除左递归后的文法:
expr -> term trest
trest -> + term
| - term
| ε
term -> factor frest
frest -> * factor
| / factor
| ε
factor -> NUMBER
| ( expr )