形式系统

计算机专业教学
posts - 48, comments - 150, trackbacks - 0, articles - 10
  教师博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

属性文法的设计(6.5题)

Posted on 2006-06-29 11:55 形式系统 阅读(1482) 评论(10)  编辑 收藏 引用 网摘 所属分类: 编译原理

题:对于文法:

N à D N | D

D à 0 | 1 | 2……| 9

写出一个属性文法,识别数的整数值。

分析:这里借用语法分析中的项目来说明这个问题,点号前面的表示已分析的子串,点号后面的表示未分析的子串。N1表示当前为N的结点,N表示当前结点的父结点,D表示左兄弟结点,则计算公式为

              N1.t=(N.t +D.v)*10

当输入状态为1·23时,属性t=10;当输入状态为12·3时属性t=120,如下图:
6_5.gif
解答:

首先添加产生式构造拓广文法:GS):

SàN

NàDN | D

Dà0 | 1 | ……| 9

 

引入综合属性v表示当前非终结符的整数值

引入继承属性t表示高位已求出的值。再语法树中标识左子树和上层已求出的结果,如输入123,语法树如上图。


属性文法如下:

S
à { N.t=0 } N { print(N.v) }

NàD  { N1.t=(N.t + D.v)*10 } N { N.v=N1.v }

NàD  { N.v=N.t + D.v }

Dà0  { D.v=0 }

Dà1  { D.v=1 }

……


 

Feedback

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-06-29 13:05 by yhspace
谢谢大家的支持,不足之处,多多见谅。相信失败和挫折会成为我们进步的阶梯。

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-06-30 00:39 by 谭楚荣
姚老师好,我想我们应该谢谢老师你了,这么认真的帮我们解答问题!
说真的,老师谢谢你了!!!!

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-07-04 23:22 by 鲁超
恩 确实
现在这样认真负责的老师确实不多了
值得庆幸的是我们就遇到这样一位好老师啊

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-07-05 13:28 by 03
我都觉得脸红了..马屁一打一打..希望老师不会是那种喜欢拍马屁的人..

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-07-07 15:12 by chenlansky
这道题还是不大理解哟………………

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-07-07 22:55 by yhspace
1.首先要理解,无论是自顶向下还是自底向上的语法分析,都是对语法树的遍历的过程。
2.属性文法的语义分析就是在语法分析过程中插入语义动作,把语义动作也作为非终结符同等对待,放于一棵语法树中,遍历过程中,如遇到语法结点(终结符或非终结符)则进行语法分析,如遇到语义结点,则执行语义动作。

3.这道题的特点就是综合属性和继承属性交叉应用。t是继承属性,遍历前已赋初值,遍历每深入一层,下层的N的t根据上层的t值再加上新出现的位(即D值),再乘以10,如当分析程序扫描到1,则t=1*10=10,再扫描到2,当2分析完了后,此时对应语法树已经N.t=120那个结点了,此时的t值为上层N结点的t值加左边已经扫描到的2,再乘以10,即为120。到最底层后,将t值直接加上D.v值即得N结点得v值。

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-07-09 12:46 by yingying
看上去好简洁的啊





# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-07-09 22:05 by 颜春捷
怎么跟原来在课堂上讲得不一样啊,到底哪个是正确的啊
老师,有在吗?赶快说一下啊

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-07-10 00:06 by 刘国军
姚老师
后面写到D->9{D.v=9}就可以了吧

# re: 属性文法的设计(6.5题)  回复  更多评论   

2006-07-10 05:45 by 形式系统
有D->0{D.v=0} 到9的,
可以打省略号。

只有注册用户登录后才能发表评论。