第八章 语法制导翻译 中间代码生成

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
产生式 EE+T E T
翻译规则
E=ET+ E=T T=TF T=F F=E F=a
T TF
T F F (E) F a
• 确定输入a+aa的输出: (E,E)(E+T,ET+) (T+T,TT+) (F+T,FT+) (a+T,aT+) (a+TF,aFF+) (a+FF,aFF+) (a+aF,aaF+) (a+aa,aaa+)
动态语义 程序单位描述的计算 • 编译程序的语义处理工作 静态语义审查 解释执行动 态语义(计算)生成代码...
概述
语义形式化 语义建模 • 文法模型---- 属性文法 • 命令式或操作式模型 ----- 操作语义学 • 应用式模型-----指称语义学 • 公理式模型-----公理语义学
属性文法
在一个属性文法中,对应于每个产生式A都有一 套与之相关联的语义规则,每条规则的形式为 b:=f(c1,c2…ck) 这里,f是一个函数,而且或者 (1)b是A的一个综合属性并且c1,c2…ck 是产生式 右边文法符号的属性;或者 (2)b是产生式右边某个文法符号的一个继承属性 并且c1,c2…ck 是A或产生式右边任何文法符号的属 性。 在两种情况下,我们都说属性b依赖于属性c1,c2…ck 。
语法制导的翻译
• 直观地说,一个语法制导翻译的基础是一个文法, 其中翻译成分依附在每一产生式上。 • 例8.4: 下列翻译模式,它定义翻译,即对每个输入x, 其输出y是x的逆转。定义此翻译的规则是
产生式
翻译规则
(1)s0s (2)s1s (3)s ε
(1)s=s0
(2)s=s1 (3)s=ε
输入输出对可由(,)表示,其中是输入句子形式 而是输出句子形式。 (S,S)开始用产生式s0s来扩展得到(0S,S0). 再用一次规则(1),得到(00S,S00)。 再用规则(2),就得到(001S,S100). 然后应用规则(3)并得到(001,100)。
• 例8.5: 把下述产生式定义的算术表达式映射到后缀波兰表 示:
定义: 若T= (N,,, R,S)是SDTS,(T)则称为语法制导的翻 译(SDT),文法Gi=(N, ,P,S),其中P={A|A,属 于R),称为SDTS T的基础(或输入)文法。文法 G0=( N, ,P,S), ,其中P ={A | A,属于R} ,称 为T的输出文法。 把语法制导的翻译方法看成是将输入文法Gi中的 推导树变换成输出文法G0中的推导树。给了输入句子x, 可以按如下方式得到x的一个翻译:先为推导x构造一 棵推导树,再变换该树到输出文法中的一棵树,然后 取此输出树的边缘作为x的一个翻译。

Valuation[101] 表示把Valuation施用于101 Valuation[N] ------ 把它施用于N 定义: Valuation(用四个方程)因为有四个形式numeral Valuation[0] 0 Valuation[1] 1 Valuation[N0] 2Valuation [N] Valuation[N1] 2Valuation [N]+1 所以: Valuation[110]=2 Valuation[11] = 2 (2 Valuation[1]+1) =2 (2 1+1) =6
属性文法和语法制导翻译
虽然形式语义学(如指称语义学、公理语义 学、操作语义学等)的研究已取得了许多 重大的进展,但目前在实际应用中比较 流行的语义描述和语义处理的方法主要 还是属性文法和语法制导翻译方法
属性文法
属性文法(attribute grammar)是一个三元 组:A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与文法的一个终结符或 非终结符相连,这些属性代表与文法符号相关信 息,如它的类型、值、代码序列、符号表内容 等等 .ຫໍສະໝຸດ Baidu性与变量一样,可以进行计算和传递。 属性加工的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称 为语义规则) . 断言或语义规则与一个产生式相 联,只引用该产生式左端或右端的终结符或非终 结符相联的属性.
+
T.val=4 F.val=4 F.val=5 digit.lexval=4 digit.lexval=5
T.val=15 T.val=3
*
F.val=3 digit.lexval=3
3*5+4的带注释的分析树
继承属性
• 一个结点的继承属性值是由此结点的父结点和/或兄弟 结点的某些属性来决定的。 例8.2 继承属性L.in
公理语义
一个语言的每个语法成分的含义定义为公理和演绎规则, 用于推导出该成分执行的效果。 公理语义概念是随着程序正确性的证明而发展的。当正 确性证明能构造时表明程序执行它的规格说明所描述 的计算。在一个证明中,每一个语句之前之后都有一 个逻辑表达式对程序的变量进行约束,以此说明这个语 句的含义。 一般的记号 {P} S {Q} 如果在语句S执行前P为真,则在语句S执行并终止后Q为 真。
属性有两种 继承的和综合的属性
属性通常分为两类:综合属性和继承属性。简单地说,综 合属性用于“自下而上”传递信息,而继承属性用于 “自上而下”传递信息。 出现在产生式左边的继承属性和出现在产生式右边的综合 属性不由所给定的产生式的属性计算规则进行计算,它 们由其它产生式的属性规则计算或者由生计算器的参数 提供。 AX1 X2 …Xn A的综合属性,计算 S(A):=f(I(X1),…,I(Xn)) Xj的继承属性,计算 T(Xj):=f(I(A),... I(Xn)) 1)非终结符既可有综合属性也可有继承属性,但文法开始 符号没有继承属性. 2)终结符只有综合属性.
指称语义
• 指称语义的基本概念是给每一段程序实体定义一个数 学意义上的对象,和一个从实体实例向数学意义对象 的映射的函数 • 特点: 不但对全部程序赋予全文而且对程序设计语法 每一个语法成分短语(表达式,命令,声明…) 都给予含义。 每一个语法成分(短语)的含义是以它的自 成分的含义的术语来定义的。 即 语义结构 平行于语法结构。 • 语义函数: 程序设计语言的语义利用映射函数来证 明。 语义函数将短语映射到它的指称。
生 产 式 D TL
语 义 规 则 L.in:=T.type
T int T real L L1,id
L id
T.type=integer T.type:=real
L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in)
Real id1,id2,id3
var x;var y;x:=e;
P D dl={x,y} S dl={x,y}
var V
x
; D dl={y}
var V y
V
:= e ;
y
S

; D dl={ }
语法制导的翻译
• 一个翻译是符号串对的一个集合。在一个编译程 序定义的翻译中,符号串对是源程序和目标程序。 各个编译阶段定义一个翻译,词法分析:(字符 串,单词串)语法分析:(单词串,语法树)代 码生成(语法树,汇编语言) 设是输入字母表且是输出字母表。定义由语言 L1 *到语言L2 *的一个翻译是由*到 *的 一个关系T,使得T的定义域为L1且T的值域为L2 。 使(x,y) ∈T的句子y叫做x的一个输出.
定义: 一个语法制导的翻译模式是一个五元组T=(N,,, R,S),其中 (1) N是非终结符的有限集。 (2) 是有限的输入字母表。 (3) 是有限的输出字母表。 (4) R是形如A,的规则的有限集,其中 ∈(N∪ )*,∈(N∪ )*且中那组非终结符是中那 组非终结符的置换。 (5) S是N中一个特别的非终结符,即开始符。
E T T F F
T T1 * F F (E) digit
E.val:=T.val
T.val:=T1.val F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval
设表达式为3*5+4,则语义动作打印数值 19
.
L
E.val=19 E.val=15
第八章 语法制导翻译和中间代码生成
8.1概述 8.2属性文法和语法制导翻译
8.3语义分析 8.4中间代码 8.5一些语句的翻译
概述
语义处理
语 法 分 析 后 的 源 程 序 语义处理
• 程序设计 语言的语义
• 静态语义是对程序约束的描述,这些约束无法通过抽 象语法规则来妥善地描述,实质上就是语法规则的良 形式条件,它可以分为类型规则和作用域/可见性规则 两大类 类型相容性 变量先声明后引用 名称相关要 求
演绎规则的例子 规则 前驱 后继 赋值:x:=expr {P(expr)}x:=expr{P(x)} While: {P ∧ B} S {P} {P} while B do S end {P ∧ (not B)}
if--then--else {B ∧ P} S1 {Q}, {(not B) ∧ P} S2 {Q} {P} if B then S1 else S2{Q}
D T.type=real real L.in= real L.in= real , id3

L.in= real id1 id2
.
例8.3
P –> DS D –> var V; D | S –> V := E; S | V –> x | y | z 现在使用两个属性,name和dl,每当一个新的变量声明时,就把它的name 属性附给它,name属性是综合属性。 将所声明的变量都放到一个变量名字清单中(用语义函数addlist实现),用 属性dl综合声明块中声明的所有变量。然后这个dl属性又作为继承属性 传到后面的语句部分,每个语句用到的变量都要进行审查,看它是否在 变量名字清单中 P –> DS {S.dl = D.dl} D1 –> var V; D2 | {D1.dl = addlist(V.name, D2.dl)} | {D1.dl = NULL} S1 –> V := E; S2 | {check(V.name, S1.dl); S2.dl = S1.dl} V –> x | y | z {V.name = 'x'} | {V.name = 'y'} | {V.name = 'z'}
操作语义
描述一段程序的含义是通过执行该段程序所改变的计 算机(虚拟计算机)状态来反映。这个计算机的状态与 程序执行时的状态相对应:包括变量的所有值,可执行 程序本身,各种系统定义的内部数据结构。计算机里所 有的寄存器的值和存储单元的值作为计算机的状态,用 一组形式定义的操作来说明执行一条指令相应的状态怎 样变化。 For (expr1;expr2;expr3){ expr1; ... Loop:if expr2=0 goto out } … expr3; goto loop out: ...
一个属性文法的例子 例8.1 非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性, 它的值由词法分析器提供。与产生式L→En对应的语义规则仅仅 是打印由E产生的算术表达式的值的一个过程,我们可认为这条 规则定义了L的一个虚属性。某些非终结符加下标是为了区分一 个产生式中同一非终结符多次出现 产 生 语 义 规 则 式 Print(E.val) L E E.val:=E1.val+T.val E E1+T
• 例: 二进制数语言 110或10101 语法实体 指称(自然数) 6 或 21 语义实体 二进制数文法 Numeral::=0 ::=1 ::= Numeral 0 ::=Numeral 1 自然数 Natrual={0,1,2,3,…} 语义函数 Valuation:NumeralNatural
表达式文法 E—>T+T| T or T T—>n | b ET1 + T2 { T1.type = int T2.type= T1.type E.type :=int} E T1 or T2 { T1.type = bool T2.type= T1.type E.type :=bool} T n { T.type := int} T b { T.type := bool}
相关文档
最新文档