- 1、本文档共69页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
语义分析的位置和作用
紧跟在语法分析和语法分析之后,编译程序要做的工
作就是进行静态语义检查和翻译。
编译器必须要检查源程序是否符合源语言规定的语法
和语义要求。这种检查称为静态检查,检查并报告程
序中某些类型的错误。
语法树 语法树
中间代码
记号流 语法分析器 类型检查器 中间表示
静态语义检查
静态语义检查通常包括:
类型检查:如果操作符作用于不相容的操作数,编译
器应该报错
控制流检查:引起控制流从某个结构中跳转出来的语
句必须能够决定控制流转向的目标地址
唯一性检查:有时,有的对象只能被定义一次。比如,
同一case语句的标号不能相同,枚举类型的元素不能
重复。
与名字相关的检查:有时候要求同一名字在特定位置
出现两次或多次 (如,标识结构的开始和结尾)
中间语言
源语言的中间表示方法
抽象语法树
后缀式
三地址代码 (包括三元式、四元式、间接三元式)
DAG 图表示
后缀式
后缀式表示又称逆波兰表示法。
这种表示法是:把运算量 (操作数)写 面,把算符写在
后面 (后缀)。
一个表达式的后缀形式可以如下定义:
如果E是一个变量或常量,则E的后缀式是E 自身
如果E是E opE 形式的表达式,这里op是任何二元操作符,则E
1 2
的后缀式为E ’E ’op 。这里E ’和E ’分别是E 和E 的后缀式。
1 2 1 2 1 2
如果E是(E )形式的表达式,则E 的后缀式就是E 的后缀式
1 1
这种表示法用不着使用括号。
只要知道每个算符的目数,对于后缀式,无论从那一端进行
扫描,都能对它正确的进行唯一分解
后缀式
表达式翻译为后缀式的语义规则描述:
产生式 语义规则
E→E op E E.code := E .code || E .code || op
1 2 1 2
E→(E ) E.code := E .code
1 1
E→id E.code := id
其中E.code表示E的后缀式,op表示任何二元操作符, “||”表
示后缀形式的连接
图表示法
图表示法主要包括DAG( Directed Acyclic Graph )与抽象语法树
语法树描述了源程序的自然层次结构。DAG 以更紧凑的形式给出了相同的
信息。两者不同的是:
在一个DAG 中代表公共子表达式的结点具有多个父结点
在一颗抽象语法树中公共子表达式被表示为重复的子树。
assign assign
a +
a +
* *
*
b uminus b uminus b uminus
c c
c
a:= b*-c + b*-c
文档评论(0)