编译原理 第八章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
义子程序。
例 算术表达式求值的语义描述
(0)L→E
print(E.val)
(1)E→ E1 + T E.val:=E1.val+T.val
(2)E→ T
E.val:=T.val
(3)T→ T1 * F T.val:=T1.val*F.val
(4)T→ F
T.val:=F.val
(5)F→(E) F.val:=E.val
2
r
r44rr44
S4
8 23
r
r
6
6
r
r
6
6
S4
93
S
10
4
S
S
6
11
r1
S7
r1
r1
r
r
3
3
r
r
3
3
r
r
5
5
r
r
5
5
LR分析输入串2+3*5
步骤 状态栈 语义栈(值栈) 符号栈
1
0
-
#
剩余输入串 归约动作
2+3*5#
2
05
--
#2
+3*5#
3
03
-2
#F
+3*5#
r6
4
02
-2
#T
+3*5#
r4
E { T1.t =T2.t}
{ T1.= int} T + T { T2.= int}
3
4
A为属性文法
如果对G中的某一输入串而言,A中的所有断言 对该输入串的语法树的结点的属性全为真,则该串 也是A语言中的句子。
编译程序的静态语义审查工作就是验证关于所编译 的程序的断言是否全部为真。
例8.2 描述说明语句中各种变量的类型信息
5
01
-2
#E
+3*5#
r2
6
016 -2-
#E+
3*5#
7
0165 -2- - #E+3
*5#
步骤 状态栈 语义栈(值栈) 符号栈 剩余输入串 归约动作
8 0163
-2-3
#E+F *5#
r6
9 0169
-2-3
#E+T *5#
r4
10 01697
-2-3-
#E+T* 5#
11 016975 -2-3-- #E+T*5 #
12 01697(10)-2-3-5 #E+T*F #
r6
13 0169
-2-(15) #E+T
#
r3
14 01
-(17) #E
#
r1
15
接受
按照上述实现办法,若把语义子 程序改为产生中间代码的动作,则可 在语法制导下生成中间代码。 (选作实验)
8.3 中间代码的形式 中间代码有多种形式,常见的有 ❖ 逆波兰式 ❖ 三元式 ❖ 四元式 ❖ 树形表示
E→ T1 + T2 { T1.t = int AND T2.t = int }
E→ T1 or T2 { T1.t = bool AND T2.t = bool }
T→ num { T.t = int }
T→ true
{ T.t = bool }
T→ false { T.t = bool }
对输入串3+4的语法树:
语义处理的环境:符号表 为语义分析提供类型、作用域等信息。 为代码生成提供类型、作用域、存储
类别、存储(相对)位置等信息。
本章引入属性文法和语法制导翻译 方法的基本思想,介绍几种典型的中间 代码形式,最后讨论一些语法成分的翻 译工作。
第8章 语法制导翻译和中间代码生成
8.1 属性文法 8.2 语法制导翻译概论 8.3 中间代码的形式 8.4 简单赋值语句的翻译 8.5 布尔表达式的翻译 8.6 控制结构的翻译 8.7 说明语句的翻译 8.8 数组和结构的翻译
源程序的结构分析 ➢ 词法分析 ch4 ➢ 语法分析 ch5、ch6、ch7
语义分析 ➢ 由语法分析程序直接调用相应的语义子程 序 ➢ 首先生成语法树(或该结构的某种表示) ,再进行语义处理
生成中间代码
前端处理
语义处理
编译中的逻辑阶段
源语言程序
词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成 目标代码(汇编或机器码)
的语义规则
要解决的问题: 1. 纪录标识符的
类型 2. 类型信息传递
产生式 (1) DTL (2) T int
语义规则 L.in := T.type T.type := integer
方法:用T.type 记录类型信息,并 传给L.in
(3) T real T.type := real (4) L L1,id L1.in := L.in;
8.1 属性文法
属性文法:语法制导翻译工具,说明程序设计语言 的意义。
属性文法构成:上下文无关文法 + 语义规则 语义规则附在文法的产生式上,在语法分析过程中,
完成附加在所使用产生式上的语义规则描述的动作, 从而实现语义处理。
定义: 一个属性文法是一个三元组: A=(G,V,F)
其中: G:上下文无关文法 V:属性的有穷集。
(6)F→digit F.val:=digit.lexval
输入串2+3*5,语义处理是计算表达式的值,采用LR 分析法,LR分析表如下:
LR分析表如下
状 态d
0S 5
1
2
3
4
S5
5
6
S5
7S 5
8
9
10
11
ACITON(动作)
GOTO(转换)
+
*
()#
E TF
S
1 23
4
S6
acc
r
S
2
7
r
r
2
每个属性与文法的某个非终结符或终结符相联 F:关于属性的断言或谓词的有穷集。
--属性的计算规则
每个断言与文法的某产生式相联。
例如 G:E→ T1 + T2 | T1 or T2 T→ num | true | false
属性文法记号中常使用N.t的形式表示与非终 结符N相联的属性。
可进行类型检查的属性文法(表达式)
在语法分析时,每应用一个产生式(推 导或归约),同时完成该产生式上所附 的语义规则描述的动作,从而完成语义 处理。
语法制导翻译的具体实现途径不难。如 有一个LR分析器,扩充它的分析栈,使得每 个文法符号都跟有语义值。同时扩充LR分析 器功能,使它不仅执行语法分析任务,且能
在用某个产生式进行归约的同时调用相应语
后端处理
语义处理的任务:
•静态语义检查 静态语义:语法结构 静态语义检查:审查静态语义
•动态语义处理 动态语义:程序单元执行的操作 动态语义处理:生成(中间/目标)代码
语义处理的实现:
属性文法:描述语义规则。--工具 语法制导翻译:在语法分析的同时,执行
语义规则描述的动作: • 检查静态语义 • 生成中间代码/目标代码
addtype(id.entry, L.in)
(5) L id addtype(id.entry, L.in)
entry id 的属性:可以是它在符号表中的地址 addtype 在符号表中为变量填加类型信息
8.2 语法制导翻译概论
语法制导翻译:
在进行语法分析的同时,完成相应的语义处理
首先,使用属性文法为工具,描述程序 设计语言的语义规则。
相关文档
最新文档