第23节课第五章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
T.Val ‘+’ E.Val …
• 为了能在语法分析过程中平行地
进行语义处理,可在语法分析栈
E
…
旁边并行地设置一个语义信息栈。
#
E (Val=56) E (Val=49)
E (Val=15) T (Val=15) number (Val=15) +
+
T (Val=7)
number (Vwenku.baidu.coml=7)
• 波兰逻辑学家J.Lukasiewicz于1929年提出了另
一种表示表达式的方法。按此方法,每一运算 符都置于其运算对象之后,故称为后缀表示。 • 特点:表达式中各个运算是按运算符出现的顺 序进行的,故无须使用括号来指示运算顺序,
因而又称为无括号式。
• 下面我们对照地给出一些表达式的两种表示:
中缀表示 A+B 后缀表示 AB+
–使编译程序更易于编写与调整;同时
–为代码优化和程序的可移植性提供了条件。
• 本章要讨论的中间代码生成,是指把单词符号
串形式的源程序转换为另一种等价的便于代码 优化处理和目标代码生成的表示形式。 • 目前常见的中间语言有逆波兰表示、三元式、 四元式等等。 • 遗憾的是,中间代码生成与语言的语义密切相 关,而语义的形式化描述是一个非常困难的;
成:
e’ p1 BZ S1’ p2 BR S2 ’ 其中, p1表示S2 ’在数组POST中的起始位 置; p2表示位于S2 ’之后那个符号的位置。 p p1 POST p2
e’
p1 BZ S1’ p2 BR
S2’
为了在语义上能够对其进行区分,可添加不同
的上标。
文法符号及其语义属性
• 例如,文法G[E]:
产生式
语义子程序
语法分 语义分 析栈 析栈
E→E(1)+T { E.Val=E(1).val+T.val;} T E→T { E.Val=T.Val;} + T→number { T.Val=number;}
• 逆波兰表示还可用于表示其它的语法结构。此
时,运算符不再限于算术、关系和逻辑运算符, 每个运算符的操作对象也可以不止两个。 • 为了用后缀式表示一些控制语句,我们假定将 后缀式的各符号存放在一个一维数组POST[n]
中。还需引入一些转移操作符:
• p BR—无条件转至POST[p](从POST[p] 继续 执行);
• 每遇一运算对象,就把它压入栈顶暂存起来; • 每遇一个二元(或一元)运算符时,就取出栈 并用运算结果去替换栈顶的这两(或一)个运 算对象; • 继续扫视余留的符号,直到扫视完整个表达式 为止。 • 当上述过程结束时,整个表达式的值将留于栈
顶的两个(或一个)运算对象进行相应的运算,
顶。
逆波兰表示的扩充
• e’ p BZ—e’是e的后缀表示,当e’之值为零时, 转向POST[p]; • e1’ e2’ p BL—e1’和e2’分别是e1和e2的后缀表 示,当 e1’< e2’时,转向POST[p];
• 类似地,我们还可以定义BN(非零转)、BP(正
号转)、BM(负号转)等等。
• 于是,条件语句IF e THEN S1 ELSE S2 可写
第五章 语法制导翻译及中间代码生成
5.1 引言
• 词法分析与语法分析仅仅是编译程序的一小 部分。 • 在早期的一些编译程序中,是在语法分析的 基础上根据源程序中各语法成份的语义,直
接产生机器语言或汇编语言形式的目标代码。
• 现在的编译系统一般都将经过语法分析的源 程序先翻译为某种形式的中间语言代码,然 后再将其翻译为目标代码。 • 优点: –使编译程序各组成部分功能更单一; –使得编译程序的逻辑结构更为清晰,从而
• 存在一种称为语法制导翻译的模式,这种模式
实际上是对前后文无关文法的一种扩充。 • 方法:对文法中的每个产生式都附加一个语义 动作或语义子程序,在语法分析过程中,每当 需要使用一个产生式进行推导或归约时,语法
分析程序除执行相应的语法分析动作外,还要
执行相应的语义动作或调用相应的语义子程序。
• 这种模式既把语法分析与语义处理分开,又令
A+B*C
(A+B)*(C+D) x/y^z-d*e
ABC*+
AB+CD+* xyz^/de*-
(a=0b>3)(ex<>y)
a0=b3>exy<>
逆波兰式的特点
①在两种表示中,运算对象出现的顺序相同;
②在后缀表示中,运算符按实际计算顺序从左
到右排列,且每一运算符总是跟在其运算对象 之后。 • 由于后缀表示中的各个运算是按顺序执行的, 因此,它的计值需从左到右依次扫视表达式中 的各个符号。
T (Val=34) number (Val=34)
5.3 常见中间语言简介
• 在着手讨论各种语法结构的语法制导翻译之 前,我们首先应介绍一下目前经常使用的几 种中间语言的形式。 • 这是因为,语义子程序的设计,不仅依赖于
相应语法结构中各个量的语义,而且还取决
于要产生什么形式的中间代码。
5.3.1 逆波兰表示
其平行地进行,让其在同一遍扫描中同时完成 语法分析和语义处理两项工作。 • 由此可见,抽象文法符号的具体语义信息,是 在与语法分析同步的语义处理过程中获取和加 工的。
• 文法符号X的语义信息我们称之为语义属性或
简称为属性(Attributes)。 • 我们用形如X.ATTR的记号来表示文法符号X 的相关语义属性。 • 如果一个文法符号X在一产生式中多次出现,