文档介绍:第四章语法制导翻译生成中间代码
语法制导翻译是处理语义的基本方法,它以语法分析为基础,在语法分析得到语言结构的结果时,对附着于此结构的语义进行处理,如计算表达式的值、生成中间代码等。
与语法分析部分的讨论不同,本章的内容更注重于实际方法的讨论。
主要内容包括:
<1> 语法制导翻译的基本概念
<2> 中间代码简介
<3> 符号表简介
<4> 典型声明语句与可执行语句的翻译
<5> 上机作业-第三部分:语法制导翻译绘制函数图形
1
语法制导翻译简介 语法与语义
<1> 语法与语义的关系
语法是指语言的结构、即语言的“样子”;语义是指附着于语言结构上的实际含意,即语言的“意义”。
对于语法和语义:
语义不能离开语法独立存在;
语义远比语法复杂;
同一语言结构可包含多种含意,不同语言结构表示相同含意;
语法与语义之间没有明确的界线。
例1:猫吃老鼠与老鼠吃猫
例2:程序设计语言中的分情况结构:
condition is
case1: stat1;
case2: stat2;
...
end case;
(condition) {
case condition1:stat1;
case condition2:stat2;
...
}
break;
break;
2
语法与语义(续1)
<2> 语义分析的两个作用
检查是否结构正确的句子所表示的意思也合法;
执行规定的语义动作,如:
表达式求值
符号表填写
中间代码生成等
<3> 语义分析的方法
语法制导翻译
3
属性与语义规则
<1> 语法制导翻译的基本思想
通俗地讲:以语法分析为基础,伴随语法分析的各个步骤,执行相应的语义动作。
具体方法:
将文法符号所代表的语言结构的意思,用附着于该文法符号的属性表示;
用语义规则规定产生式所代表的语言结构之间的关系(即属性之间的关系),即用语义规则实现属性计算。
语义规则的执行:在语法分析推导或归约的每一步骤中,执行附着在对应产生式上的语义规则,实现对语义的处理,如查添符号表、生成中间代码、发布错误信息等。
4
属性与语义规则(续1)
<2> 属性的抽象表示
.attr
例如:(值)
(类型)
(代码序列)
(存储空间)
<3> 对文法的约定
本章关注的是语法分析的基础上的语义处理,忽略语法分析。
为了简单,本章的文法一般为二义文法。默认解决二义的方法是规定常规意义下的优先级和结合性。
5
属性与语义规则(续2)
对于产生式A→α,其中α是由文法符号X1X2...Xn组成的序列,它的语义规则可以表示为()所示关于属性的函数:
b := f(c1, c2, ..., ck) ()
语义规则中的属性存在下述性质与关系。
(1) 若b是A的属性,c1, c2, ..., ck是α中文法符号的属性,或者A的其它属性,则称b是A的综合属性。
(2) 若b是α中某文法符号Xi的属性,c1, c2, ..., ck是A的属性,或者是α中其它文法符号的属性,则称b是Xi的继承属性。
(3) 称()中属性b依赖于属性c1, c2, ..., ck。
(4) 若语义规则的形式如下述(),则可将其想像为产生式左部文法符号A的一个虚拟属性。属性之间的依赖关系,在虚拟属性上依然存在。
f(c1, c2, ..., ck) () ■
()中属性之间的依赖关系,实质上反映了属性计算的先后次序,即所有属性ci被计算之后才能计算属性b。
E→E1+E2 :=+
E→E1+E2 print()
<3> 属性的定义**
6
语义规则的两种形式
<1> 语法制导定义
用抽象的属性和运算符号表示的语义规则;(公式,做什么)
<2> 翻译方案
用具体属性和运算表示的语义规则。(程序段,如何做)
语义规则也被习惯上称为语义动作。
忽略实现细节,二者作用等价。(设计与实现)
7
语义规则的两种形式(续1)
将中缀形式的算术表达式转换为后缀表示的语法制导定义和翻译方案。虚拟属性print():=print()。
产生式
L→E
E→E1+E2
E→num
语法制导定义
print()
:=
||||'+';
:=;
翻译方案1
print_post(post)