当前位置:文档之家› 语法制导翻译技术

语法制导翻译技术


t中是类型值
Id n
n中变量名
填表动作符号也可带有属性:
@set_table↓t1 , n1
↓t1,n1
<变量表> ↓t 2
↓t2
可从前面得到称为继承属性, 继承前面的值
同上
属性翻译文法: 1.<说明> → Typet idn @set_table↓t1,n1 <变量表> ↓t2 2.<变量表> ↓t2 → ,id n @set_table↓t1,n1 <变量表>↓t3 3.< 变量表 > ↓t1 → ε
用相应的翻译文法推导,可得: E T T*F@* F*F@* (E)*F@*
(E+T@+)*F@* * (i@i+i@i @+)*i@i@*
(i@i+i@i @+)*i@i@*
活动序列:由翻译文法推导出的符号串,由终结符和动作 符号组成。 ●从活动序列中,抽去动作符号则得输入序列(i+i)*i ●从活动序列中,抽去输入序列,则得动作序列,执行动
5.1 翻译文法和语法制导翻译
有上下无关文法G[E]:
1. E →E+T
4. T →F
2. E →T
5. F →(E)
3. T →T*F
6. F →I
此文法是一个中缀算术表达式文法
翻译的任务是: 中缀表达式 逆波兰表示 a+b*c abc*+
假如我们的翻译任务是要将中缀表达式简单变换为波兰后 缀表示,只需在上述文法中插入相应的动作符号。
翻译文法所定义的翻译是由输入序列和动作序列组成的对偶集 如:(i+i)*i, @i@i@+@i@* →ii+i*
i+i*i @i@i@i@*@+ 因此,给定一个翻译文法,就给定了一个对偶集
5.2 属性翻译文法
在翻译文法的基础上,我们可以进一步定义属性文法, 翻译文法中的符号,包括终结符、非终结符和动作符号 均可带有属性,这样能更好的描述和实现编译过程。
翻译文法:
1. <说明> → Type id @set_table <变量表> 2. <变量表> → ,id @set_table <变量表>
3. < 变量表 > → ε
填表时需要的信息?类型,名字,以及位置(可以用全程变量 的指针)如何得到?
类型和名字在词法分析时得到,可设两个综合属性。
Type t
3. <变量表> → ε
其中
Type: 类型名,值为integer,real,boolean等,词法分析程序返回的类型的类
别码。
id 变量(值:标识符本身)
上述文法的说明语句:integer A,B1
该文法向上翻译任务:将声明的变量填入符号表
符号表
完成该工作的动作符号:@set_table
A整型
B1整型
作序列,则完成翻译任务: @i@i@+@i@* ii+i*
定义5.1 翻译文法是上下文无关文法,终结符号集由输入符号
和动作符号组成。由翻译文法所产生的终结符号串称为活 动序列。
以上例题中的翻译文法为: GT=(Vn, Vt, P, E) Vn={E, T, F} Vt={i, +, *, (, ), @ +, @ *, @i} P={E→E+T@ +, E→T,T→T*F@*,T→F,F→(E), F→i@i}
属性可以分为两种:
综合属性
பைடு நூலகம்继承属性
5.2.1 综合属性
基本操作数带有属性的表达式文法G[E]
1.E→E+F
4.T→F
2.E→T
5.F→(E)
3.T→T*F
6.F→i C
其中↑C综合属性符号,↑为综合属性标记,c为属性变量 或者属性值
此文法能够产生如下的输入序列: (i 3 +i 9)*i 2
下面给出输入文法和翻译文法的概念:
输入文法:未插入动作符号时的文法。 由输入文法可以通过推导产生输入序列。
翻译文法:插入动作符号的文法。 由翻译文法可以通过推导产生活动序列 输入序列 动作序列
例:( i+i ) * i 可以用输入文法推出: E T T*F F*F (E)*F (E+T)*F * (i+i)*i
根据给定的文法,可写出该输入序列的语法树
E
E 24
T
T 24
T*F
F
i 2
(E)
自底向上 的属性计算
T 12 * F 2
F 12
i 2
( E 12 )
E +T TF F i 9 i 3
所以用表示属性计 算是自底向上的, 称为综合属性。
E 3 + T 9
T 3
F 9
F 3
i 9
i 3
为了形式地表示上述表达式的属性求值过程,我们可以改写上述文法:
6.F p1
i q1
说明:
• p,q,r为属性变量名
• 属性变量名局部与每个产生
式,可使用不同的名字。
p 1 :=q 1 ;
•求值规则:综合属性是自右向左,自底 向上
5.2.2 继承属性
考虑到下列文法:G[<说明>]:
1. <说明> → Type id <变量表> 2. <变量表> → , id <变量表>
1. E →E+T 2. E →T 3. T →T*F
4. T →F 5. F →(E) 6. F →i
1. E →E+T@+ 2. E →T 3. T →T*F @*
4. T →F 5. F →(E) 6. F →i@i
其中: @+,@*,@i 为动作符号。@为动作符号标记,后面为字符串。 在该具体例示中,其对应语义子程序的功能是要输出打印动作 符号标记后面的字符串。 所以:产生式1:E→E+T@+ 的语义是分析E, +和T输出+ 产生式6:F→i @ i 分析i输出i
符号串翻译文法:输入文法中的动作符号对应的语义子程序 是输出动作符号标记@后的字符串的文法。
语法制导翻译:按翻译文法进行的翻译。 给定一输入符号串,根据翻译文法获得翻译该符号串的动作 序列,并执行该序列所规定的动作过程。
语法导制翻译的实现方法:
在文法的适当位置插入语义动作符号,当按文法分析到动作 符号时就调用相应的语义子程序,完成翻译任务
产生式
求值规则
1.E p4
E + T q5
r2
(q 5:=p 3;) p 4:=q 5+r 2 ;
2.E p2
T q4
p 2:=q 4 ;
3.T p2
T q3 * F r1
p 2:=q 3*r 1 ;
4.T p2
F q2
p 2:=q 2 ;
5.F p1
(E ) q1
p 1 :=q 1 ;
5.0 本章导言
词法分析,语法分析:解决单词和语言成分的识别 及词法和语法结构的检查。语法结构可形式化地用 一组产生式来描述。给定一组产生式,我们能够很 容易地将其分析器构造出来。
本章要介绍的是语义分析和代码生成技术。
程序语言的语义形式化描述目前有三种基本描述方 法,即:
• 操作语义 • 指称语义 • 公理语义
相关主题