原题:
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 RP