- 1、本文档共129页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
hh语法制导翻译和中间代码生成
第8章 语法制导翻译和中间代码生成;源程序经词法分析、语法分析后, 还需进行语义分析, 即审查每个语法成分的静态语义。如果静态语义正确, 则生成与之等效的中间代码或目标代码。;静态语义检查涉及以下几个方面:
(1)类型检查: 如操作数类型是否相容
(2)控制流检查: 用以保证控制语句有合法的转向点。如C语言中不允许goto语句转入case; break语句需寻找包含它的最小switch、while或for语句。
(3)一致性检查: 如在相同作用域中标识符只能说明一次、case标号不能相同等。;由于语义是上下文有关的, 故语义的形式化描述很困难。目前较常见的是利用属性文法作为语义描述工具, 并采用语法制导翻译法对语法成分进行翻译。;语法制导翻译分为自下而上和自上而下两类, 下面介绍自下而上语法制导翻译。 ;;算术表达式文法及语义动作:
(0) S→E { print val[TOP] }
E→E(1)+E(2)
{ val[TOP] = val[TOP]+val[TOP+2]}
(2) E→E(1)*E(2)
{ val[TOP]=val[TOP]*val[TOP+2]}
(3) E→(E(1))
{ val[TOP]= val[TOP+1] }
(4) E→i { val[TOP]=lexval }
(注: lexval为i的整型内部值);E·val=52;表8.1 表达式7+9*5#的语义分析过程;8.1 属 性 文 法;文法符号的属性可分为两类:
继承属性: 由父结点的属性计算得到, 即沿语法树自上向下传递信息。
综合属性: 由子结点的属性计算得到, 即沿语法树自下向上传递信息。;例 简单算术表达式求值的语义描述:
产生式 语义规则
(0) ?S?→E print (E.val)
(1) ?E→E(1)+T E.val = E(1).val+T.val
(2) ?E→T E.val = T.val
(3) ?T→T(1)*F T.val = T(1).val*F.val
(4) ?T→F(1) T.val = T(1).val
(5) ?F→(E) F.val = E.val
(6) ?F→i F.val = i.lexval;例 说明语句中各变量类型信息的语义规则。
说明语句文法:
G[D]: D → int L | float L
L → L, id | id;T有一个综合属性T.type, 值为int或float;
L有一个继承属性L.in, 值由T.type决定;
属性L.in被确定后将随语法树的逐步生成而传递到下边有关结点。;8.2.1 抽象语法树
抽象语法树是一种较流行的中间语言表示形式。在抽象语法树中, 每个叶结点表示常量或变量这样的运算对象, 而内部结点表示运算符。
抽象语法树不同于语法树, 它展示了一个操作过程并同时描述了源程序的层次结构。;例如, 赋值语句x=a+b的抽象语法树如图(a), 其普通语法树如图(b)所示:;说明:
语法规则中包含的某些符号可能起标点符号作用, 也可能起解释作用。
例如, 赋值语句S→V=E中, 赋值号仅起标点符号作用, 其目的是把V与E分开。;当把语法规则的本质部分抽象出来、把非本质部分去掉后, 便得抽象语法规则。
赋值语句和条件语句的抽象语法规则为:
(1) 赋值语句: 左部 表达式
(2) 条件语句: 表达式 语句1 语句2
这种去掉不必要信息的做法可以获得高效的中间表示。;assign;上述普通语法树的结点为14个, 而抽象语法树的结点为7个且每个内部结点最多只有两个分支。
因此, 赋值语句或表达式可表示为一棵二叉树。对于含多元运算的语法成分, 其抽象语法树为一棵多叉树, 但可转为二叉树。;逆波兰表示法是由波兰科学家提出的一种表达式表示方法, 这种方法把运算量写在前、把运算符写在后, 又称后缀表示法。;在逆波兰表示中, 操作数的出现顺序与原来一致, 而把运算符按运算先后顺序放在相应操作数后。;2. 程序语句的逆波兰表示
为了用逆波兰式表示一些控制语句, 定义转移操作如下:
(1) BL: 转向某标号
(2) BT: 条件为真时转移
(3) BF: 条件为假时转移
(4) BR: 无条件转移;部分程序语句的逆波兰表示如下:
赋值语句
左部=表达式的逆波兰表示为
左部表达式=
例如, x=a+b*c的逆波兰式为 xabc*+=;(3) 条件语句
BR表示无
文档评论(0)