已知文法 exp→ exp + factor | factor, factor → (exp)|number;请用BNF消除左递归并且设计一个消除左递归后的文法的L-SDD来求表达式的值
时间: 2024-02-16 10:00:19 浏览: 114
消除文法的左递归
5星 · 资源好评率100%
消除左递归后的文法为:
exp → factor exp'
exp' → + factor exp' | ε
factor → (exp) | number
其中,exp → factor exp' 是为了消除左递归,exp' → ε 是为了处理 exp 后面没有加号的情况。
L-SDD 代码如下:
```
exp → factor { $$ = $1; }
exp' → + factor { op = '+'; } exp' { $$ = $3 + $2; }
exp' → ε { $$ = 0; }
factor → ( exp ) { $$ = $2; }
factor → number { $$ = atoi($1); }
```
其中,exp 产生式的语义动作计算 factor 的值,并将其赋值给 $$. exp' 产生式的第一个语义动作记录加号的操作符,并将 factor 的值赋值给 $2,exp' 的值赋值给 $3;第二个语义动作将 $2 和 $3 相加并将结果赋值给 $$. factor 产生式的第一个语义动作返回括号内表达式的值,第二个语义动作将数字字符串转换为整型并返回。
阅读全文