原题:

Program 4.4:

本题有两点要注意,题目要求写出递归下降分析器,而给出的文法显然是有左递归的,因此要消除左递归;
另外就是本题的Yacc程序使用了优先级策略,在写出需要处理的文法时,我们要先通过引入额外的非终结符的方式解决优先级的问题,避免歧义。
消除直接左递归有标准的解决方案:

之后就是ll文法的老套路,找first集合、follow集合,找select集合写出文法分析表。
找select集合的方法:

相关知识已经足够,接下来就是一步一步写了。
原yacc程序形式化,并去除左递归以及添加优先级处理之后的语法:
1.prog->stm
2.stm->ID ASSIGN exp stm'
3.stm->PRINT LPAREN exps RPAREN stm'
4.stm'->semi_stm stm'
5.stm'->
6.semi_stm->SEMICOLON stm
7.exps->exp exps'
8.exps'->COMMA exp exps'
9.exps'->
10.exp->term exp'
11.exp->stm COMMA exp
12.exp'->PLUS term exp'
13.exp'->MINUS term exp'
14.exp'->
15.term->factor term'
16.term'->TIMES factor term'
17.term'->DIV factor term'
18.term'->
19.factor->INT
20.factor->ID
21.factor->LPAREN exp RPAREN
nullable first follow
prog n PRINT ID \
stm n PRINT ID SEMICOLON COMMA
stm' y SEMICOLON SEMICOLON COMMA
semi_stm n SEMICOLON SEMICOLON
exps n LPAREN PRINT ID INT RPAREN
exps' y COMMA RPAREN
exp n LPAREN PRINT ID INT

本文介绍了消除直接左递归的方法,并详细讲述了如何为一个带有优先级的文法编写递归下降分析器。在解决过程中,通过找first集合、follow集合和select集合来构建文法分析表。虽然遇到困难,如空产生式的处理和优先级问题,但最终成功完成作业,耗时较长。
最低0.47元/天 解锁文章
1139

被折叠的 条评论
为什么被折叠?



