编译原理简明教程(第2版)第7章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例: FOR i=1 TO 100 DO s:=s+i 展开 i:=1; (1) i1:= 10: IF i<=100 THEN (4) 10: (6) i100<=23 BF BEGIN (11)ssi+:= s:=s+i; (16)ii1+:= i:=i+1; (21)10BL GOTO 10 (23) END
译不必要的信息)。 叶结点:表示运算对象,如常量或变量。 其它结点:表示运算符。 在语法规则中有些符号起标点符号或解释的作用。
例:赋值语句S→V:=e 条件语句 S → IF e THEN S1 ELSE S2 “:=”-------标点符号作用 “IF 、THEN、 ELSE”---------解释作用 语句的本质部分是V 、e 、Sn , 把语法规则中 的本质部分抽象出来 抽象语法树
对于表达式“12-a/b”,带有动作的语法树如下:
E T F 12 T’ ε E’ T F {writecode(‘-’)} T’ ε
E’
{writecode(‘12’)}
a {writecode(‘a’)} T’ b
/ F {writecode(‘/’)}
{writecode(‘b’)}
执行相应的子程序后打印出逆波兰式12ab/-
语义分析的基本任务
1.类型的确定:数据对象的数据类型 2.类型的检查:对运算及运算量的类型检查 3.确认含义:确认控制结构的含义 4.其它语义检查:不允许体外到体内等.
目前许多编译程序采用语法制导翻译的 方法。(不是一种形式化系统,但比较接近形
式化)
以语法分析为主导的语义处理,即在语法
分析的过程中嵌入语义处理程序,生成中间代
如:x:=a-b*cFra Baidu bibliotekS
语法树和抽象语法树如下:
assign(:=) E
E E c E * b x E a
V :=
x
a
b
*
c
抽象语法树的特点:结构紧凑、容易构造、结点数 少的图形表示。
7.2.2
逆波兰表示(后缀式)
例:a+b*c abc*+ (a+b)*c ab+c* a+b*c/(d-e) abc*de-/+ + a / * b c d e 抽象语法树 逆波兰式是抽象语法树的线性表示。 即:后序遍历抽象语法树便得到逆波兰式。
(2)属性文法:
例:G[E]属性文法:
E .t T .t E .t E .t T .r E .t | T .r E .t | T .t F .tT .t T .t * F .r T .t | / F .r T .t | F .t ( num | id ) | ( E .t )
7.2.3
四元式
1.四元式 (运算符,运算量1,运算量2,中间结果) 例: a*b+c*d (*, a, b, T1) (*, c, d, T2) (+,T1,T2,T3) 对于单目运算符 ⊕,⊖ 如+a,-a ( ⊕ ,a,_,T) ( ⊖ ,a,_,T)
2. 表达式和赋值语句的四元式
例:(1)a+b*c/d
码或目标代码。
7.1.2
属性文法技术
属性文法:给文法中的符号附上属性。 1. 增量式文法 增量式文法:文法中加入语义动作符号。 一般形式:A(α|{f(…);})*
α∈V* 语义动作 作用:在语法分析时,遇到带有语义动作的花括 号即执行语义动作,执行完后再进行下一 步分析。
例:表达式文法G[E]:
无条件转到序号如A处 B为真时转到A处 B为假时转到A处
(BR,A,_,_) (BT,A,B,_) (BF,A,B,_)
例:IF a>b THEN max:=a ELSE max:=b
四元式(1)(>,a,b,T1)
(2)(BF,5,T1,_)
(3)(:=,a,_,max)
(4)(BR,6,_,_) (5)(:=,b,_,max) (6)( )
1.三元式
三元式
(运算符,运算量1,运算量2)
例:(a+b)*c
(1)(+, a, b)
(2)(*, (1),c)
2.
表达式和赋值语句的三元式
a+b*(c-d)-e/f (1)(-, c, d ) (2)(*, b, (1)) (3)(+, a, (2)) (4)(/, e, f ) (5)(-,(3),(4))
4. 循环语句的三元式
FOR i:=1 TO 100 DO sum:=sum+i 首先展开: 三元式: i:=1 (1)(:=,1,i) 10:IF i<=100 THEN (2)(<=,i,100) BEGIN (3)(BF,(9),(2)) sum:=sum+i; (4)(+,sum,i) i:=i+1; (5)(:=,(4),sum) GOTO 10 (6)(+,i,1) END (7)(:=,(6),i) (8)(BR,(2),_) (9)
7.2
几种常见的中间语言
采用中间语言的优点: 有利于重定目标,即一种中间表示可以生成不同的目 标语言。 有利于提高目标代码的质量,因为可对中间语言进 行与机器无关的优化。
常见的中间语言有:抽象语法树、逆波兰式、四元 式、三元式。
7.2.1
抽象语法树
抽象语法树:是经变换后的语法树(去掉一些对翻
E TE E T { writecode (' ' ); } E | T { writecode (' ' ); } E | T FT T * F { writecode ('*' ); }T | / F { writecode (' /' ); }T | F ( num | id ){ writecode ( ch ); } | ( E )
三元式的优缺点
优点:无需临时变量 占用空间少 缺点:没有保存运算结果的属性, 不利于修改、优化
间接三元式
增加一个间接码表(按三元式执行顺序列出三元式的编号) 例: x:=(a-b)*c 三元式 间接码表 三元式表 b:=a-b (1)(-,a,b) (1) (1)(-,a,b) y:=c*(a-b) (2)(*,(1),c) (2) (2)(*,(1),c) (3)(:=,(2),x) (3) (3) (:=,(2),x) (4)(:=,(1),b) (1) (4)(:=,(1),b) (5)(-,a,b) (4) (5)(:=,(2),y) (6)(*,c,(5)) (2) (7)(:=,(6),y) (5)
例:a*(b-c)/d+e (1)(-, b, c ) (2)(*, a, (1)) (3)(/,(2), d ) (4)(+,(3),e ) X:=a*(b-c)/d+e (5)(:=,(4),x)
3. 转向语句和条件语句的三元式
IF a<b THEN x:=a+b ELSE x:=a-b (1)(<,a,b) (2)(BF,6,(1)) (3)(+,a,b) (4)(:=,(3),x) (5)(BR,8,_) (6)(-,a,b) (7)(:=,(6),x) (8)
2. 属性文法
(1)文法的属性: 指与文法符号相关信息,如它的类型、值、代码序列、符 号表内容等。 属性 继承属性:用于“自上而下”传递信息(非终结符可有)
综合属性:用于“自下而上”传递信息(VT或VN)
指在语言的文法中增加了属性的文法。 记号N.t表示与非终结符N相联的属性t 属性有助于更详细地指定文法中的代码生成动作。
约定几个符号: (1)BL 表示转向某标号处 (2)BT 表示条件为真转 (3)BF 表示条件为假转 (4)BR 表示无条件转
1.
赋值语句的逆波兰式
<左部>:=<表达式> <左部><表达式>:= 例: x:=a+b*c xabc*+:=
x:=a*b-c/d xab*cd/-:=
2.
GOTO语句的逆波兰式
(*,b,c,T1) (2)-b*(c+d) ( ⊖,b,_, T1) (+,c,d, T2) (*, T1, T2, T3)
(3)x:=-b*(c+d)
(⊖,b,_, T1)
(/,T1,d,T2)
(+,a,T2,T3)
(+,c,d, T2)
(*,T1 ,T2,T3)
(:=, T3,_,x)
3. 转向语句和条件语句的四元式
《编译原理简明教程》
普通高等教育“十二五”规划计算机教材
---太原理工大学 ---计算机科学与技术学院 ---冯秀芳、崔冬华、段富等
目 录
•第一章 引言 •第二章 形式语言理论基础 •第三章 自动机理论基础 •第四章 词法分析 •第五章 语法分析—自顶向下分析方法 •第六章 语法分析—自底向上分析方法 •第七章 语义分析及中间代码的生成 •第八章 代码优化 •第九章 目标代码的生成 •第十章 符号表 •第十一章 目标程序运行时的存储组织与分配 •第十二章 出错处理 •第十三章 编译程序自动生成工具简介 •第十四章 面向对象语言的编译 •第十五章 并行编译技术
数据结构的含义:主要指程序中所用标识符及 与其相关的数据对象的含义。 源程序的含义 控制结构的含义:如if语句、for循环等结构 由语言来定义。 例:int m,n; float x,y; 语义:类型------程序说明部分 值---------程序执行部分
控制结构的含义有两种确定形式
形式化: 如 E → E+T|E-T|T 先“*,/”后“+, -” T → T*F|T/F|F 左结合 …… p →(E)|i 非形式: 如 赋值语句含义,非形式化的规定 V:=e
例:if(a<b) then x:=a+b else x:=a-b (1)ab< 或: ab<13BFxab+:= (4)13BF 18BRxab-:= (6)xab+:= (11)18BR (13)xab-:= (18)
4.
循环语句的逆波兰式
For i:=m To n Do s for(i=m;i<=n;i++) {s} 首先展开, i:=m; 10: IF i<=n THEN BEGIN S; i:=i+1; GOTO 10; END
目
7.1 7.2
录
基本概念 几种常见的中间语言
7.1
7.1.1
基本概念
语义分析的概念
语义分析:分析语法结构的含义,将其表示成中 间语言或生成目标指令。 语义形式化(或形式语义学):是个专门的研究课 题,如操作语义学、公理语义学、指称语义学等。 不论哪种方法,其本身的符号系统比较繁杂,其 描述文本不易读,因此都不能成为标准的形式语 义系统。
第七章 语义分析及中间代码的生成
学习目标
语义分析的概念 常见的中间语言形式: 逆波兰表示、四元式表示、三元式表示 常见语法成分的逆波兰表示、四元式表示、 三元式表示、三地址代码表示
词法→ 语法 →语义 →中间代码 编译程序的任务:源程序 →目标程序 两者语法结构上可以不同,但语义 上是等同的
4. 循环语句
FOR i:=1 TO 100 DO s:=s+i
首先展开 四元式: (1)(:=,1 , _, i ) (2)(<=,i,100,T1)
(3)(BF,7, T1, _) (4)(+, s, i, s ) (5)(+, i, 1, i ) (6)(BR,2, _, _ )
(7)
7.2.4
GOTO <语句标号> <语句标号> BL 例: GOTO 10 10 BL
3.
条件语句的逆波兰表示
IF (e) THEN S1 ELSE S2 逆波兰式:<e的逆波兰式> <顺序号1> BF <S1的逆波兰式> <顺序号2> BR <S2的逆波兰式>
例: IF m<n THEN k:=i*j+2 ELSE k:=i*j-2 (1)mn< 或: mn<15BFkij*2 (4)15 BF 22BRkij*2-:= (6)kij*2+:= (13)22BR (15)kij*2-:= (22)