免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2885 | 回复: 4
打印 上一主题 下一主题

执行语义动作的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-29 14:22 |只看该作者 |倒序浏览
书上说语义动作可以在产生式右部的任何地方执行,比如这样的文法
1、E ==> TR
2、R ==> addop T {print1 (addop.lexeme)}R1
3、T ==> num{print(num.val)}
在上面第2个产生式的 print 的执行发生在 T 的规约结束后、R1 的规约开始前。
问题是这里在 T 规约后整个产生式还没有最终确定,怎么能确定使用 R ==> addop T {print1 (addop.lexeme)}R1 这个产生式对应的语义动作?
比如还有一个产生式
4、F ==> addop T {print2 (addop.lexeme)}R2
岂不是有二义性了?怎么区分到底执行print1还是print2?望达人指点

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2007-10-29 15:00 |只看该作者
你以上的文法中,(E,R,T,F)
当只遍历到addop T的时候,因为addop T的非唯一性是无法判断到底是R还是F的,执行动作(print1,print2)必须要发生在R/F分清楚之后

论坛徽章:
0
3 [报告]
发表于 2007-10-29 15:20 |只看该作者
谢谢
那是说print1 的执行不可能发生在 T 的规约结束后、R1 的规约开始前,必须是
2、R ==> addop T {print1 (addop.lexeme)}R1
整个产生式形成后?

加入R1也有相关的语义动作
R1 ==> M{print3}
怎么保证print1在print3之前执行?

论坛徽章:
0
4 [报告]
发表于 2007-10-30 09:50 |只看该作者
看到这样的解释:
用户有时希望把一个动作放在产生式的其它地方,而不是最右端。例如,在对条件语句Stmt→if Expr then {/*action1*/}Stmt{/*action2*/} 进行处理时,为了能够及时回填Expr的真出口,需在then后“嵌入”语义动作。一般说来,解决此类问题的方法,是对原文法进行语法变换。除此而外,YACC还提供了一种更简单的处理方法,即允许用户自由地在产生的右部的任何位置嵌入所希望的语义动作。但需指出,YACC将自动为其增加ε-产生式,以保证“动作”在进行“归约”时才被执行
这样的语法递归下降即可分析,不过yacc用的是自底向上LALF(1)

[ 本帖最后由 cjaizss 于 2007-10-30 13:19 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-10-30 12:52 |只看该作者

回复 #5 hotelcn2007 的帖子

???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP