第七章语义分析和中间代码的产生第七章语义分析和中间代码的产生紧接在词法分析和语法分析之后,编译程序要做的工作是进行静态语义检查和翻译
静态语义检查通常包括:1
操作数和操作符类型一致2
控制转移到合理的位置3
变量只能被声明一次,同一case语句的标号不能相同,枚举类型的元素不能相同4
相关名字检查
同一名字必须出现两次以上翻译为中间语言的好处(1)便于进行与机器无关的代码优化;(2)使编译程序改变目标机更容易;易于编译器的移植(3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰
主要内容•中间语言的形式–后缀式,图表方法,三元式•编译过程中不同语言的翻译或处理方法–说明语句的翻译–赋值语句的翻译–布尔表达式的翻译–控制语句的翻译7
1中间语言中间语言的形式:逆波兰表示:后缀式图表示法:DAG和AST三地址代码:四元式、三元式、间接三元式7
1后缀式后缀式表示法又称逆波兰表示法
这种方法是,把运算量(操作数)写在前面,把算符写在后面(后缀)
一个表达式的后缀式可以如下定义:(1)如果E是一个变量或常量,则E的后缀式是E自身
(2)如果E是E1opE2形式的表达式,这里op是任何二元操作符,则E的后缀式为E1’E2’op,这里E1’和E2’分别为E1和E2的后缀式
(3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式
后缀式的优点便于计算机处理,因为在后缀式中,表达式的求值顺序与运算符出现的顺序一致,这样只要用一个栈就可以实现表达式的求值
实现过程:自左向右扫描后缀表达式;遇到运算对象入栈,遇到N元运算符,就从栈顶取出N个运算对象进行计算,再将结果入栈;当全部后缀表达式扫描结束,则栈顶的值即为表达式结果
后缀式特点:•无括号•运算对象的顺序与中缀式一致•根据操作符(运算符)的优先级和结合性进