编译原理虎书作业4.2 记录&总结

原题:

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值