第六、七章 属性文法、语法制导翻译与中间代码
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最简单的翻译程序---有限变换器
a1
a2
…
an
只读输入磁带
有限控制器
b1 b2 b3
只写输出磁带
• 定义: 一个有限变换器M是一个六元组(Q,Σ,∆, δ,q0 ,F),其中 (1) Q是状态的有限集. (2) Σ是有限的输入字母表. (3) ∆是有限的输出字母表. (4) δ是从Q×(Σ ∪{ε})到Q× ∆* 的一些有限子集 * 的映射。 (5) q ∈Q是初始状态。 0 (6) F⊆Q是终态集。
• 类型相容性 变量先声明后引用 名称相关要求 • 解释执行动态语义(计算)生成代码...
如 i f B t h e n S 1 e l s e S2
B Y S1
N
S2
B 的代码 条 件 假转 S1 的 代• • • • 文法模型---- 属性文法 命令式或操作式模型 ----- 操作语义学 应用式模型-----指称语义学 公理式模型-----公理语义学 规格说明模型-----代数数据类型
+/e
+/e q2 a/a +/e
•
q0
-/e
-/e
a/+a q1 a/-a
-/e
-/e
a/-a q4 -/e q3
+/e
+/e
• M的一个组态为三元组 的一个组态为三元组(q,x,y),其中 的一个组态为三元组 , (1)q∈Q是有限控制器的当前状态 ∈ 是有限控制器的当前状态 * (2)x∈Σ 是输入磁带上尚存的输入符号串,且x ∈ 是输入磁带上尚存的输入符号串, 的最左边那个符号在输入头底下。 的最左边那个符号在输入头底下。 * (3)y∈∆* 是到此时为止已发出的输出符号串。 ∈ 是到此时为止已发出的输出符号串。
翻译程序----下推变换器
一个下推变换器(PDT)是一个八元组 (Q,Σ,Γ,∆, δ,q ,Z0,F),其中除∆是有限的输出字 母表及δ是由Q×(Σ ∪ {ε}×Γ到Q×Γ*×∆*的一些 有限子集的映射以外,其余所有符号与PDA的 符号含意相同。 定义P的一个组态为四元组(q,x,α,y), 其中q,x和α与PDA的情形一样,而y是此刻为 止已发出的输出符号串。
公理语义
•
公理语义概念是随着程序正确性的证明而发展的。 当正确性证明能构造时表明程序执行它的规格说明所 描述的计算。在一个证明中,每一个语句之前之后都 有一个逻辑表达式对程序的变量进行约束,以此说明这 个语句的含义。 • 一般的记号 {P} S {Q} • 程序正确性的证明 1. 给定P,什麽是它的规格说明S 2.给定规格说明S,开发实现此规格说明的程序P 3.S和 P执行同样的功能吗
语义制导翻译中的规则A→α,β
对应于每一个文法产生式A 关联的一套语义描述β α 都有与之相
第六、七章属性文法、语法制导翻译和中 间代码 • 1语义处理 • 2语义形式化
• 3语法制导翻译 • 4中间代码 • 5一些语句的翻译
语义处理
语 法 分 析 后 的 源 程 序 ⇒ 语义处理
• 程序设计 语言的语义 • 静态语义是对程序约束的描述,这些约束无法通过抽 象语法规则来妥善地描述,它可以分为类型规则和作 用域/可见性规则两大类 类型相容性 变量先声明后 引用 名称相关要求 动态语义 程序单位描述的计算 • 编译程序的语义处理工作 静态语义审查 解释执行动 态语义(计算)生成代码...
{x>3} x=x-3 {x>0}, (x>5)⇒(x>3), {x>0}⇒{x>0} -----------------------------------------------------------------------{x>5} x=x-3 {x>0} While 循环 (I and B) S {I} -----------------------------------------------------------------{I} while B do S end {I and (not B)} I是循环不变式。 if--then--else {B and P} S1 {Q}, {(not B) and P} S2 {Q} ------------------------------------------------------------------{P} if B then S1 else S2{Q}
指称语义
• 指称语义的基本概念是给每一段程序实体定义一个数 学意义上的对象,和一个从实体实例向数学意义对象 的映射的函数 • 特点: 不但对全部程序赋予全文而且对程序设计语法 特点: 每一个语法成分短语(表达式,命令,声明…) 都给予含义。 每一个语法成分(短语)的含义是以它的自 成分的含义的术语来定义的。 即 语义结构 平行于语法结构。
操作语义
• 描述一段程序的含义是通过执行该段程序所改变的 计算机(无论是真实计算机还是虚拟计算机)状态来反 映。计算机里所有的寄存器的值和存储单元的值作为计 算机的状态。 • For (expr1;expr2;expr3){ expr1; ... Loop:if expr2=0 goto out } … expr3; goto loop out: ...
• 语义函数: 程序设计语言的语义利用映射函数来证 语义函数: 明。 语义函数将短语映射到它的指称。
• 例: 二进制数语言 110或10101 语法实体 指称(十进制数) 6 或 21 语义实体 二进制数文法 Numeral::=0 ::=1 ::= Numeral 0 ::=Numeral 1 自然数 Natrual={0,1,2,3,…} 语义函数 Valuation:Numeral→Natural
•
Valuation[101] 表示把Valution施用于101 Valuation[N] ------ 把它施用于N 定义: 定义 Valuation(用四个方程)因为有四个形式numeral Valuation[0] ≡0 Valuation[1] ≡1 Valuation[N0] ≡2×Valution [N] Valuation[N1] ≡2×Valution [N]+1 所以: 所以: Valuation[110]=2 × Valuation[11] = 2 × (2 × Valuation[1]+1) =2 ×(2 × 1+1) =6
产生式 E→E+T E →T T →T∗F T →F F →(E) F →a 翻译成分 E=ET+ E=T T=TF∗ T=F F=E F=a
• 确定输入a+a∗a的输出: (E,E)⇒(E+T,ET+) ⇒(T+T,TT+) ⇒(F+T,FT+) ⇒(a+T,aT+) ⇒(a+T∗F,aFF∗+) ⇒(a+F∗F,aFF∗+) ⇒(a+a∗F,aaF∗+) ⇒(a+a∗a,aaa∗+)
• 定义: 若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的一个翻译。
规格说明模型-代数数据类型
描述实现一个程序的各种函数间的关系。 如表明一个实现服从任何两个函数间的这 种关系,则可以声明这个实现是此规格 说明的正确实现。
语法制导的翻译
• 一个翻译是符号串对的一个集合。在一个编译程 序定义的翻译中,符号串对是源程序和目标程序。 各个编译阶段定义一个翻译,词法分析:(字符 串,单词串)语法分析:(单词串,语法树)代 码生成(语法树,汇编语言) • 设Σ是输入字母表且∆是输出字母表。定义由语言 L1⊆ Σ*到语言L2 ⊆ ∆*的一个翻译是由Σ*到 ∆*的 一个关系T,使得T的定义域为L1且T的值域为L2 。 使(x,y) ∈T的句子y叫做x的一个输出.
语法制导的翻译
直观地说,一个语法制导翻译的基础是一个文法, 其中翻译成分依附在每一产生式上。 • 例: 下列翻译模式,它定义翻译,即对每个输入x, 其输出是x的逆转。定义此翻译的规则是 •
产生式 翻译成分
(1)s→0s (2)s→1s (3)s→ ε
(1)s=s0 (2)s=s1 (3)s=ε ε
例:
设计一个有限变换器来识别由产生式 S→a+S | a-S | +S | -S | a 生成的算术式,并从这些算术式中去掉多余的 一元运 算符。例如,我们会把- a + - a - + - a翻 译成- a - a +a . 令M=(Q, Σ,∆, δ,q ,F), 其中 (1)Q={q0 ,q1 ,q2 , q3 ,q4 }. (2)Σ={a,+,–}. Σ (3)∆= Σ. (4) δ由下面的转移图定义。在由qi 结点到qj 结点的一条边上,标记x/y表示δ (qi ,x)含有 (qj ,y)。 (5)F={q1 }.
• 以- a + - a - + - a为输入,M会作下列移动序列: 为输入, 会作下列移动序列 会作下列移动序列: 为输入 (q0,- a + - a + - a,ε)|—(q4, a+ -a - + - a, ε) ε |—(q1, + - a - + - a, - a) |—(q2, - a - + - a, - a) |—(q3, a - + - a, - a) |—(q1, - + - a, - a - a) |—(q3, + - a, - a - a) |—(q3, - a, - a - a) |—(q2, a, - a - a) |—(q1, ε, - a - a + a)
输入输出对可由(α,β)表示,其中α是输入句子形式 而β是输出句子形式。 (S,S)开始用产生式s→0s来扩展得到(0S,S0). 再用一次规则(1),得到(00S,S00)。 再用规则(2),就得到(001S,S100). 然后应用规则(3)并得到(001,100)。
• 例: 把下述产生式定义的算术表达式映射到后缀波兰表 示:
0
• 例: 设P是下推变换器 ({q},{a, +, ∗},{+, ∗ ,E},{a, +, ∗}, δ, q, E,{q}) 其中δ的定义如下: δ(q,a,E)={(q, ε,a)} δ(q,+,E)={(q,EE+, ε) δ(q,∗,E)={(q, EE*,+)} δ(q,e,+)={(q, ε, ∗)} δ(q,e, ∗)={(q, ε , ∗)}
属性文法
表达式文法 E—>T+T| T or T T—>n | b E→T1 + T2 { T1.type = int T2.type= T1.type E.type :=int} E → 1 or T2 →T { T1.type = bool T2.type= T1.type E.type :=bool} T → n { T.type := int} T → b { T.type := bool}
• 定义: 一个语法制导的翻译模式是一个五元组T=(N,Σ,∆, R,S),其中 (1) N是非终结符的有限集。 (2) Σ是有限的输入字母表。 (3) ∆是有限的输出字母表。 (4) R是形如A→α,β的规则的有限集,其中 α∈(N∪ Σ)*,β∈(N∪∆ )*且β中那组非终结符是α中那 组非终结符的置换。 (5) S是N中一个特别的非终结符,即起始符。
第六七章属性文法语法制导翻译和中间代码5一些语句的翻译语义处理程序设计语言的语义静态语义是对程序约束的描述这些约束无法通过抽象语法规则来妥善地描述它可以分为类型规则和作用域可见性规则两大类类型相容性变量先声明后引用名称相关要求动态语义程序单位描述的计算编译程序的语义处理工作静态语义审查解释执行动态语义计算生成代码
• 以+∗aaa为输入,P作如下移动序列: (q, +∗aaa ,E, ε) |—(q, ∗aaa, EE+, ε) |—(q, aaa, EE∗E+, ε) |—(q, aa, E∗E+, a) |—(q, a, ∗ E+,aa ) |— (q, a, E+,aa∗) |—(q, ε,+,aa∗a) |—(q, ε, ε, aa∗a+)