7章语法制导的翻译
语法制导翻译【共41张PPT】
一个属性文法称为L-属性文法,如果对于每个产生式
int T_val, R_i, R_s; int E_val;
AX1X2Xn,其中每条语义规则中的每个属性或者
是综合属性,或者是X (1jn)的一个继承属性且这 (3) E→(E(1))
val[ntop]= val[top–1]
使用标记非终结符M和N改写为
2. 函数过程A的代码(指用符号形式表示的数据和程序)
要根据当前的输入符号来决定使用哪一个产生式。
3. 与每一个产生式有关的代码,从左到右根椐产生式右部是
终结符(单词符号)、非终结符号还是语义动作,分别处 理:
保存下来,以便以后语义子程序引用这些信息。
原LR分析器的分析栈也加以扩充,存放三类信息:分析
状态、文法符号及文法符号对应的语义值。
top
sk
Xk
Xk.val
... ... ...
s1
X1
X1.val
s0
#
_
状态 文法符号 语义值
扩充后的LR分析栈
例6-3 考虑下面的语法制导定义
产生式
语义规则
9–5+2的带语义动作的分析树
设计翻译模式(根据语法制导定义)
语法制导定义是L-属性文法 保证语义动作不会引用还没有计算的属性值。
只需要综合属性的情况
为每一个语义规则建立一个包含赋值的动作,并把这个 动作放在相应的产生式右边的末尾。
例如:T T(1)*F T.val:=T(1).val*F.val
产生式 语义规则 A LM L.i:=l(A.i)
M.i:=m(L.s) A.s:=f(M.s) A QR R.i:=r(A.i) Q.i:=q(R.s) A.s:=f(Q.s)
语法翻译法的实施步骤 (2)
语法翻译法的实施步骤1. 简介语法翻译法是一种用于将一种程序设计语言转换为另一种程序设计语言的技术。
它通过将源语言的语法规则映射到目标语言的语法规则,实现源语言程序到目标语言程序的转换。
本文将介绍实施语法翻译法的具体步骤。
2. 步骤以下是实施语法翻译法的一般步骤:步骤1: 确定源语言和目标语言在开始进行语法翻译的过程中,首先需要确定源语言和目标语言。
源语言是我们要转换的程序设计语言,目标语言是将源语言转换成的语言。
确切地了解源语言和目标语言的语法规则和语义规则非常重要。
步骤2: 词法分析词法分析是将源程序分解为一个个的单词(Token)的过程。
在这一步骤中,我们需要编写一个词法分析器,它将源代码作为输入,并识别出其中的单词。
每个单词都包含一个词法类型和一个对应的字符串值。
示例:源代码: x = 5 * 2;词法分析输出:- 词法类型: 标识符,字符串值: x- 词法类型: 赋值运算符,字符串值: =- 词法类型: 数字,字符串值: 5- 词法类型: 运算符,字符串值: *- 词法类型: 数字,字符串值: 2- 词法类型: 分号,字符串值: ;步骤3: 语法分析语法分析是将词法分析器输出的单词流转换为语法树的过程。
在这一步骤中,我们需要编写一个语法分析器,它将识别源代码中的语法规则并生成一个语法树。
语法树用于表示程序的结构和层次关系。
示例:源代码: x = 5 * 2;语法树:=/ \\x */ \\5 2步骤4: 语法制导翻译语法制导翻译是基于语法树进行语法规则的翻译过程。
在这一步骤中,我们需要根据源语言和目标语言的语法规则,编写语法制导翻译器,它将遍历语法树并根据语法规则翻译每个节点。
示例:源代码: x = 5 * 2;目标语言: Python翻译结果: x = 5 * 2步骤5: 语义分析和翻译语义分析是对源代码进行静态语义检查的过程。
在这一步骤中,我们需要编写语义分析器,它将检查源代码是否符合源语言和目标语言的语义规则。
编译原理第七章练习题
第7节习题一、单项选择题1、中间代码生成所依据的是。
a.语法规则b.词法规则c.语义规则d.等价变换规则2、四元式之间的联系是通过实现的。
a.指示器b.临时变量c.符号表d.程序变量3、后缀式ab+cd+/可用表达式来表示。
a.a+b/c+db.(a+b)/(c+d)c.a+b/(c+d)d.a+b+c/d4、表达式(┓A∨B)∧(C∨D)的逆波兰表示为。
a. ┓AB∨∧CD∨b. A┓B∨CD∨∧c. AB∨┓CD∨∧d. A┓B∨∧CD∨5所对应的表达式为。
a.A+B+C+Db.A+(B+C)+Dc.(A+B)+C+Dd.(A+B)+(C+D)6、四元式表示法的优点为。
a.不便于优化处理,但便于表的更动b.不便于优化处理,但节省存储空间c.便于优化处理,也便于表的更动d.便于表的更动,也节省存储空间7、终结符具有属性。
a.传递b.继承c.抽象d.综合解答1、选c。
2、四元式之间的联系是通过临时变量实现的,故选b。
3、选b。
4、选b。
5、选d。
6、四元式表示法的优点与间接三元式相同,故选c。
7、选d。
二、多顶选择题1、中间代码主要有。
a.四元式b.二元式c.三元式d.后缀式e.间接三元式2、下面中间代码形式中,能正确表示算术表达式a+b+c 的有 。
a .ab+c+ b .abc++ e .a+b+c3、在下面的 语法制导翻译中,采用拉链-回填技术。
a .赋值语句 b .goto 语句 c .条件语句 d .循环语句4、下列 中间代码形式有益于优化处理。
a .三元式 b .四元式 c .间接三元式 d .逆波兰表示法 e .树形表示法5、在编译程序中安排中间代码生成的目的是 。
a .便于进行存储空间的组织 b .利于目标代码的优化c .利于编译程序的移植d .利于目标代码的移植e .利于提高目标代码的质量 6、下面的中间代码形式中, 能正确表示算术表达式a .ab+c*b .abc*+c .a+b*c7、三地址代码语句具体实现通常有 表示方法。
语法制导翻译
2
4.1 语法制导翻译简介
语法与语义
1. 语法与语义的关系 语法是指语言的结构、即语言的“样子”;语义是指附着于语
言结构上的实际含意 ,即语言的“意义”。 ① 语义不能离开语法独立存在; ② 语义远比语法复杂; ③ 同一语言结构可包含多种含意,不同语言结构可表示相
② 若b是α中某文法符号Xi的属性,c1, c2, ..., ck是A的属性, 或者是α中其它文法符号的属性,则称b是Xi的继承属性。
③ 称(4.1)中属性b依赖于属性c1, c2, ..., ck。
④ 若语义规则的形式如下述(4.2),则可将其想像为产生式左 部文法符号A的一个虚拟属性。属性之间的依赖关系,在 虚拟属性上依然存在。
k := k+1;
9
4.1 语法制导翻译简介
产生式
语法制导定义
翻译方案
L→E
print(E.post)
print_post(post);
E → E1 + E2 E → num
E.post := E1.post || post(k) := '+'; E2.post || '+'; k := k+1;
1. 编译器各阶段的完整输出,均可以被认为是源程序的某种 中间表示。
2. 本章讨论的是中间代码生成器输出的中间表示,称之为中 间代码。
3. 中间代码实际上应起一个编译器前端与后端分水岭的作用。 4. 要求中间代码具有如下特性,以便于编译器的开发移植和
代码的优化: ① 便于语法制导翻译; ② 既与机器指令的结构相近,又与具体机器无关。 5. 中间代码的主要形式:树、后缀式、三地址码等。
编译原理_国防科技大学中国大学mooc课后章节答案期末考试题库2023年
编译原理_国防科技大学中国大学mooc课后章节答案期末考试题库2023年1.对于文法G(S'),该文法识别活前缀的DFA如下图,状态I5包含的项目有G(S'):(0) S' → S(1) S → iSeS(2) S → iS(3) S → a【图片】答案:S → iSeŸS_S → ŸiSeS_S → ŸiS_S → Ÿa2.(a+b)/(c-d)对应的逆波兰式(后缀式)是答案:ab+cd-/3.表达式(a+b)/c-(a+b)*d对应的间接三元式表示如下,其中三元式表中第(3)号三元式应为间接码表三元式表(1) OP ARG1 ARG2 (2) (1) + a b (1) (2) / (1)c (3) (3) (4) (4) - (2) (3)答案:( *, (1), d)4.设AS 为文法的综合属性集, AI 为继承属性集, 则对于下面的属性文法G(P)定义中,AS和AI正确描述是产生式语义规则P → xQR Q.b:=R.d R.c:=1R.e:=Q.a Q → u Q.a:=3 R → v R.d:=R.c R.f:=R.e答案:AS={ Q.a, R.d, R.f } AI={ Q.b, R.c, R.e }5.考虑下面的属性文法G(S)【图片】过程enter(name, type)用来把名字name填入到符号表中,并给出此名字的类型type。
按照该属性文法,关于语句【图片】 , 【图片】 , 【图片】:integr的语义描述准确的是答案:说明 , , 是integer变量,把 , , 三个名字填入符号表中,并在类型栏中填上integer6.考虑下面的属性文法G(S)【图片】对于输入字符串abc进行自下而上的语法分析和属性计算,设S.u的初始值为5,属性计算完成后,S.v的值为答案:187.关于属性文法,下列说法中正确的是答案:属性文法是对上下文无关文法的扩展。
属性文法和语法制导翻译
id1
如果一属性文法不存在属性 之间的循环依赖关系,那么 称该文法为良定义的
T type
5 in L
4
real
7 in L y 8 ,
y6 id3 entry 3
9 in L y 10 ,
id2 entry 2
id1 entry 1
属性的计算顺序
无环有向图的拓扑排序
无环有向图中节点m1,m2,…,mk的拓扑排序是:若 mi→mj是从mi到mj的边,那么在此排序中mi先于mj 依赖图的任何拓扑排序都给出了一个分析树中各节点 语义规则计算的正确顺序,即在计算f之前,语义规则
real id1,id2,id3
语法制导翻译
基于属性文法的处理过程通常是:
对符号串进行语法分析,
构造语法分析树
根据需要遍历语法树并在语法树的各结点处按语义规 则进行计算。
这种由源程序的语法结构驱动的处理办法就是语法制 导翻译法。
在某些情况下,在进行语法分析的同时完成语义规则
的计算而无须明显地构造语法树或构造属性之间的依
real L.in=real ,
id3
L.in=real ,
id2
id1
产生式 D→TL T→int T→real L→L1 , id
L→id
语义规则 L.in := T.type T.type := integer T.type := real L1.in := L.in addtype(id.entry, L.in) addtype(id.entry, L.in)
为每个包括过程调用的语义规则引入一个虚综合属性b,把每条 语义规则都变成b=f(c1,c2,...,ck)的形式 依赖图的每个结点表示一个属性 边表示属性间的依赖关系。如果属性b依赖于属性c,那么从c到 b就有一条有向边
编译原理(龙书)习题(5,6,7,8)章
6.2.1 将算术表达式 a+-(b+c) 翻译成
1)抽象语法树 2)四元式序列 3)三元式序列 4)间接三元式序列
PPT课件整理
15
1)抽象语法树:
PPT课件整理
16
2)四元式序列:
3)三元式序列:
4)间接三元式序列:
PPT课件整理
17
6.4.1 向图6-19的翻译方案中加入对应于下列产生式的规则: 1) EE1*E2 2) EE1(单目加 )
第5章 语法制导的翻译
5.2.3 假设我们有一个产生式 A。BAC,D B,C,D这四个非终 结符号都有两个属性:s是一个综合属性,而i是一个继承属 性。对于下面的每组规则,指出(i)这些规则是否满足S属性 定义的要求。(ii)这些规则是否满足L属性定义的要求。(iii) 是否存在和这些规则一致的求值过程?
1)一个repeat语句,repeat S while B 2)一个for循环语句,for (S1 ; B ; S2) S3
S-->repeat S1 while B
begin=newlabel() S1.next=newlabel() B.true=begin B.false = S.next S.code=label(begin)||
《语法制导翻译 》课件
通过本课件了解语法制导翻译的概念、基本方法和实践技巧,并探讨翻译中 的难点及解决方案,让您成为语法制导翻译的专家。
什么是语法制导翻译
介绍语法制略
探讨在语法制导翻译中的思考方式和有效的翻译策略。
认识语法树
解释语法树的概念和作用,并介绍如何构建和分析语法树。
基于语法树的翻译方法
讨论使用语法树进行翻译的具体方法和步骤。
翻译实例分析
通过实际案例分析,展示语法制导翻译在不同场景下的应用和效果。
英汉语法差异
探讨英语和汉语之间的语法差异,解决在翻译中可能遇到的问题。
词形变化对翻译的影响
分析词形变化在翻译过程中的重要性和正确处理方法。
主被动语态的处理
介绍如何准确翻译主被动语态,并避免常见的翻译错误。
编译第七章语法制导翻译_OK
{PRINT E ●VAL}
• (1)E E(1) +E(2) {E●VAL=E(1)●VAL+E(2)●VAL}
• (2)E E(1) * E(2) {E●VAL=E(1)●VAL*E(2)●VAL}
• (3)E (E(1)) {E●VAL=E(1)●VAL}
• (4)E i
{E●VAL=LEXVAL}
语义子程序
• (0)S’ E
{PRINT VAL[TOP]}
• (1)E E(1) +E(2) {VAL[TOP]=VAL[TOP]+VAL[TOP+2]}
• (2)E E(1) * E(2) {VAL[TOP]=VAL[TOP]*VAL[TOP+2]}
• (3)E (E(1)) {VAL[TOP]=[TOP+1]}
语义子程序
• (1)A i=E {GEN(=,E●PLACE,_,ENTRY(i)}
• (2)E -E(1) {T=NEWTEMP;
• ----
GEN(@,E(1)●PLACE,_,T);
• ----
E●PLACE=T}
• (3)E E(1)*E(2) {T=NEWTEMP;
•
GEN(*,E(1)●PLACE,E(2)●PLACE,T);
• 2、实例:对布尔式X+Y>Z∨A∧( B∨C) 进行翻译:
SYM栈
i i= i=i=-i i=-E i=E i=E* i=E*( i=E*(i i=E*(E
PLACE栈
---------B --T1 --T1--T1---T1--C --T1--C
生成四元式
(@,B,-,T1)
❖21
编译原理分知识点习题-语法制导和翻译
编译原理分知识点习题-语法制导和翻译1.⼀般情况下,为什么语义分析部分仅产⽣中间代码解答:⼀般情况下,语义分析部分仅产⽣中间代码,其原因是:可使难点分解,分别解决。
可对语义分析产⽣的中间代码进⾏优化,以产⽣⾼效率的⽬标代码。
语义分析通常与机器⽆关,⽬标代码往往与机器有关。
把语义分析与⽬标代码⽣成分开,可让⼀个语义分析程序适⽤于多个⽬标代码⽣成程序。
2.(湖北省⾼等教育⾃学考试)什么是语法制导翻译为什么把这种⽅法叫语法制导翻译解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输⼊符号串的翻译。
由于使⽤属性⽂法时把语法规则和语义规则分开,但在使⽤语法规则进⾏推导或规约的同时⼜使⽤这些语义规则来知道翻译与最终产⽣⽬标代码,所以称为语法制导翻译。
3.给出将附值语句翻译成四元式的语法制导定义,允许右部表达式含有加法、乘法、取负、括号运算。
⽣成赋值语句X:=B*(C+D)+A 的四元式。
解答:赋值语句的⾃下⽽上的语法制导翻译过程描述为:规则语义动作(1)A::=i:=E {GEN (:=,,__,ENTRY(i) ) }(2)E::=E1+E2 {:=NEWTEMP;GEN(+,, ,}(3)E::= E1*E2 { :=NEWTEMP;GEN(*,, ,}(4)E::=-E1 { :=NEWTEMP;GEN(@,,__,}(5)E::=(E1) {:= }(6)E::=i {:= ENTRY(i) }⽣成的赋值语句X:=B*(C+D)+A的四元式为:(+,C,D,T1)(*,B,T1,T2)(+,T2,A,T3)(:=,T3,_,X)4.给出将布尔表达式翻译成四元式的语法制导定义。
解答:布尔表达式的语义⼦程序为:规则语义动作(1) E::=I {:=null;:=NXQ;GEN (Jez , ENTRY(i), __,0) }(2) E::= i1 rop i2 { :=null;:=NXQ;GEN (Jnrop,ENTRY(i1), ENTRY(i2),0)}(3) E::= (E1) {:=, :=; }(4) E::= ? E1 { :=NXQ;GEN ( J, __, __, 0); BP , NXQ);}(5) E A::=E1∧ { if =nullthen begin::=NXQ;GEN ( J, __, __, 0)End;BP ( , NXQ );:=null; := }(6) E ::= E A E2 {if ≠nullthen beginBP , NXQ);:=nullEnd:=; }(7) E0::=E1∨ { if :=nullthen begin:=NXQ;GEN ( J, __, __, 0)End;:=;BP ,NXG);}(8) E::=E0E2 { if ≠nullthen:=MERG,Else beginBP ,NXQ);:=End;:=}其中:NXQ指⽰器指向下⼀个将要形成但尚未形成的四元式的地址(编号),初值为1,每当执⾏GEN⼀次,NXQ⾃动加1。
编译原理复习题(含考试)
编译原理复习题(含考试)————————————————————————————————作者:————————————————————————————————日期:*编译原理复习题一.简答题:1) 什么是句子? 什么是语言?解答:句子——设G 是一个给定的文法,S 是文法的开始符号,如果S x (其中x ∈V T *),则称x 是文法的一个句子。
语言——语言是句子的集合。
或——设G[S]是给定文法,则由文法G 所定义的语言L(G)可描述为:L(G)={x │Sx,x ∈V T *} 。
2) DFA 与NFA 有何区别 ?解答:DFA 与NFA 的区别表现为两个方面:一是NFA 可以有若干个开始状态,而DFA 仅只有一个开始状态。
另一方面,DFA 的映象M 是从K ×∑到K ,而NFA 的映象M 是从K ×∑到K 的子集,即映象M 将产生一个状态集合(可能为空集),而不是单个状态。
3) 自顶向下的语法分析方法的基本思想是什么?解答:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。
4) 自底向上的语法分析方法的基本思想是什么?解答:从给定的输入串(终结符串)开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。
5) 一个上下文无关文法G 包括哪四个组成部分?解答:一组非终结符号,一组终结符号,一个开始符号,以及一组产生式。
6) 在自底向上的语法分析方法中,分析的关键是什么?解答:关键是寻找句柄。
7) 在自顶向下的语法分析方法中,分析的关键是什么? 解答:关键是选择候选式。
8)什么是属性文法?答:是在上下文无关文法的基础上,为每个文法符号(含终结符和非终结符)配备若干个属性值,对文法的每个产生式都配备了一组属性计算规则(称为语义规则)。
在语法分析过程中,完成语义规则所描述的动作,从而实现语义处理。
编译原理_南京邮电大学中国大学mooc课后章节答案期末考试题库2023年
编译原理_南京邮电大学中国大学mooc课后章节答案期末考试题库2023年1.左线性文法画状态转换图时,文法的开始符号对应的终止状态答案:正确2.e1= (a|b)*,e2=(a*b*)* e1和e2等价答案:正确3.一张状态转换图只包含有限个状态,其中有一个被认为是初态,最多只有一个终态。
答案:错误4.简单优先分析法是一种规范归约分析法答案:正确5.S∷=aAa | aBb| bAb| bBa A∷=x B∷=x 该文法不是LALR(1)文法答案:正确6.LL(1)文法无左递归、无二义性。
答案:正确7.文法:E∷=EE+ | EE* | aFOLLOW(E)={+,*,#}答案:错误8.LR分析栈中存放的状态是识别文法规范句型()的DFA的状态。
答案:活前缀9.已知文法A∷=BCc | gDBB∷=ε| bCDEC∷=DaB | caD∷=ε| dD E∷=gAf |cFOLLOW(B)={}答案:{ a,c,d,g,f,#}10.表达式(a+b)/(a-b)-(b*c)的四元式序列为:⑴.(+,a,b,T1)⑵.(-,a,b,T2)⑶.(/,T1,T2,T3)⑷.(*,b,c,T4)⑸.(-,T3,T4,T5)答案:正确11.编译程序与具体的机器有关。
答案:正确12.由文法的开始符经0步或多步推导产生文法符号序列是句子。
答案:错误13.如果在进行归约时,文法的某些规范句型的句柄不唯一,则称该文法是二义性文法。
答案:正确14.规范归约又称为最右归约。
答案:错误15.假设有一文法,如果文法G中没有形如A::=....BC....这样的规则,其中A、B和C都为非终结符号,则称该文法为()答案:算符文法16.递归下降分析法属于()分析方法答案:自顶向下17.由正规文法构造状态转换图,其右线性文法识别符号对应是状态转换图的初始状态。
答案:正确18.算符优先分析法是一种一种规范归约分析法答案:错误19.确定的有穷自动机只有唯一的终止状态答案:错误20.正规表达式(a|b)*和(a*b*)*不等价答案:错误21.含有优化部分的编译程序的执行效率高答案:错误22.FORTRAN语言是一种系统程序设计语言,可用来编写编译程序。
编译原理课件语法制导翻译翻译方案SDD
SDD的实际应用
示例 语义值的计算 类型检查的实现 解析默认参数
描述 计算表达式2+3操作得到的实际结果 检查赋值操作符两侧数值的类型是否一致 将默认参数设置为参数列表中未给出的实参
总结
协作
了解SDD,能更好地协作进行编 译程序开发。
应用
总结
SDD在通用编程语言中广泛应用, 掌握SDD将增加自己在编程方面 的实用性。
概念
定义高级语言和目标语言的一一 对应关系,保证编译器输出的目 标程序与原程序功能相同。
使用
将源程序的语法树根据SDD转化 为目标程序的语法树,完成上下 文有关的属性计算并生成目标代 码。
优点
灵活的特性、准确的语义描述和 高效的处理过程,使得编译器能 够更好地分析和翻译源程序。
语法制导定义
1
语法定义
使用一组语法制导规则将源程序的语法
语义定义
2
描述为翻译方案的形式。
通过为每个语法构造一个属性集合,并
定义每个属性的计算方法来定义程序语
3
翻译过程定义
义。
使用一组由语法定义和语义定义构成的
规则,将源程序转化为目标程序。
SDD表达式
翻译方案格式
语法制导翻译表达式的常规形式是: ⟨属性⟩→⟨表达式⟩
表达式的计算
通过本课程,你将掌握语法制导 翻译与SDD的概念、使用方法和 广泛应用领域,希望你能更好地 进行编译器程序的开发工作。
编译原理课件语法制导翻 译翻译方案SDD
本次课程将带领你深入了解语法制导翻译与S识。
语法制导翻译简介
1 定义
一种将语法和语义相结合的编译技术。
2 作用
通过定义翻译方案SDD,将高级语言的语法转化为目标语言的语法,并赋予其语义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
处理顺序与逆波兰式相同
4.条件语句的四元式: 条件语句的四元式: 条件语句的四元式 例:if a<b then x:=a+b else x:=a-b 对应的四元式为: - 对应的四元式为: (1) (< , a , b , T1 ) (2) (FJ , 6 , T1 ,/ ) (3) (+ , a , b , T2 ) HW:P188 1. (1)(7) (4) (:= , T2 , / , x ) 分别给出逆波兰表示 (5) (RJ , 8 , / , / ) 和四元式。 和四元式。 (6) (- , a , b , T3 ) (7) (:= , T3 , / , x ) (8) …… 5.循环语句的四元式:首先转化成等价的条件语句表示, 循环语句的四元式:首先转化成等价的条件语句表示, 循环语句的四元式 再表示成四元式,要求自己完成。 再表示成四元式,要求自己完成。
第七章 语法制导的翻译
7. 1基本概念 基本概念 1.编译系统的两类翻译: 编译系统的两类翻译: 编译系统的两类翻译 非语法制导的翻译 语法制导的翻译:以语法分析为主导的语义处理--在源程序 语法制导的翻译:以语法分析为主导的语义处理--在源程序 -- 的语法分析中嵌入语义处理。 的语法分析中嵌入语义处理。即,利用源程序的文法框架生成 中间代码或目标代码。 中间代码或目标代码。 Tips:语义学:semantics :语义学: lexeme lexicon semantic 例
例如有如下表达式: 例如有如下表达式: a+b a+b*c * 逆波兰表示 (a+b)*c *
ab+ abc*+ * ab+c* *
后缀表示法与前缀表示法及中缀表示法相比较, 后缀表示法与前缀表示法及中缀表示法相比较,其共同 的特点是: 的特点是: (1)运算符的个数不变 ; 运算符的个数不变 (2)运算量的次序和个数不变。 运算量的次序和个数不变。 运算量的次序和个数不变 可以看出后缀表示具备以下优点: 可以看出后缀表示具备以下优点: (1)无括号,形式简单清楚; 无括号,形式简单清楚; 无括号 (2)运算符的顺序与表达式的运算次序相同; 运算符的顺序与表达式的运算次序相同; 运算符的顺序与表达式的运算次序相同 在具体处理过程中, 在具体处理过程中,可以从左到右检查表达式的各符 遇到运算分量则保存,若遇到运算符, 号,遇到运算分量则保存,若遇到运算符,则取其前面的 两个分量(双目运算 或一个分量(单目运算 进行处理。 双目运算)或一个分量 单目运算)进行处理 两个分量 双目运算 或一个分量 单目运算 进行处理。
i:=1; 10: if i<=100 then begin s:=s+i; i:=i+1: goto 10 end
(1) i1:= (4) 10: (6) i100<= (9) 23FJ 逆波兰式 (11) ssi+:= (16) ii1+:= (21) 4 RJ (23)
(1) i1:= (4) i100<= (7) 21 FJ (9) ssi+:= (14) ii1+:= (19) 4 RJ (21)
写成一行: 写成一行: i1:=i100<=21FJssi+:=ii1+:=4RJ
7.2 四元式表示
一、四元式的格式: 四元式的格式: 二、举例说明: 举例说明: 1.表达式的四元式: 表达式的四元式: 表达式的四元式 例1.a*b+c/d
<分量 、<分量 为 分量1>、 分量 分量2>为 分量 <结果 参加运算的两个分量 结果>即为运算结果 结果 即为运算结果
(- , T1 , c , T2) (@ , T2 , / , T) @ (:= , T , / , x) :=
3.转向语句的四元式: 转向语句的四元式: 转向语句的四元式 仍然用RJ,TJ,FJ三个运算符号: 三个运算符号: 仍然用 三个运算符号
A为某个四元式的 为某个四元式的 序号B为条件。 序号, 为条件。 为条件
x:=a*b+c/d *
在进行具体处理时,可以采用与表达式相似的方法, 在进行具体处理时,可以采用与表达式相似的方法,不 同之处是进行运算时,栈中保存的是<左部 变量的地址, 左部>变量的地址 同之处是进行运算时,栈中保存的是 左部 变量的地址,而 不是它的直,最后的处理不是得到一个结果, 不是它的直,最后的处理不是得到一个结果,而是进行赋值 (将表达式的值送到指定的内存单元 ,所以,赋值工作完成 将表达式的值送到指定的内存单元), 将表达式的值送到指定的内存单元 所以, 应将栈顶两项(变量地址和表达式的值 退栈。 变量地址和表达式的值)退栈 后,应将栈顶两项 变量地址和表达式的值 退栈。
(6) xab+:= (11) 18 RJ
(13) xab-:= (18)
4.循环语句 循环语句: 循环语句 我们以for循环为例进行说明: 我们以 循环为例进行说明:for i:=a to b do s 循环为例进行说明 先将其展开成等价的条件语句: 先将其展开成等价的条件语句:
i:=a; 10: if i<=b then begin s; i:=i+1: goto 10 end
然后用条件语句和转向语句的逆波兰表示, 然后用条件语句和转向语句的逆波兰表示,将它 表示成逆波兰式。其它形式的循环语句, 表示成逆波兰式。其它形式的循环语句,也是首先展 开成等价的条件语句表示,然后表示成逆波兰式。 开成等价的条件语句表示,然后表示成逆波兰式。
例如: 例如: for i:=1 to 100 do s:=s+i 先将其展开: 先将其展开:
硬件或软件栈) 在计算机处理过程中可以用一个栈 (硬件或软件栈 硬件或软件栈 来计算它的值。一般的计算过程是: 来计算它的值 。一般的计算过程是:自左向右扫描后缀 每逢遇到运算量就令其入栈; 遇到K目运算符 目运算符, 式,每逢遇到运算量就令其入栈; 遇到 目运算符,则 将它作用于栈顶的K个项 并用运算结果代替这K个项 个项, 个项。 将它作用于栈顶的 个项 , 并用运算结果代替这 个项 。 实际计算时,每遇到一个K目运算符 目运算符, 实际计算时,每遇到一个 目运算符,与它有关的 K个运算量已在栈顶,运行结果在原来的 个项从栈中 个运算量已在栈顶, 个运算量已在栈顶 运行结果在原来的K个项从栈中 移出后置于栈顶。 移出后置于栈顶。 例如:ab+c* 的计值过程如下: 例如: * 的计值过程如下: 1. a入栈; 入栈; 入栈 c b E =E1*c E21=a+b a2 E1 2. b入栈; 入栈; 入栈 3. 将栈顶两项相加 移走栈顶的两个项 把和数 1置于栈顶 将栈顶两项相加, 移走栈顶的两个项, 把和数E 4. c入栈 入栈. 入栈 5. 将栈顶两项相乘 移走栈顶的两个项 把积 2置于栈顶 将栈顶两项相乘, 移走栈顶的两个项, 把积E 置于栈顶;
<序号 是指“<语句 序号1>是指 序号 是指“ 语句 对于条件语句: 布尔表达式 布尔表达式> 语句1>else <语句 语句2> 对于条件语句:if <布尔表达式 then <语句 语句 语句 2>的逆波兰表示”中第 的逆波兰表示” 的逆波兰表示 可用以下的逆波兰式表示: 可用以下的逆波兰式表示: 一个单词的序号 可以不分行书写而将 <序号 是指条件语句的 序号1>是指条件语句的 序号 <布尔表达式 的逆波兰式 它们写在一行中。 布尔表达式>的逆波兰式 它们写在一行中。 布尔表达式 后继语句的逆波兰表示 <序号 序号1> FJ 序号 中第一个单词的序号 <语句 的逆波兰式 语句1的逆波兰式 语句 的逆波兰式> <序号 序号2> RJ 序号 <序号1>:<语句 的逆波兰式> 语句2的逆波兰式 语句 的逆波兰式 (1) ab< <序号2>:…… (4) 13 FJ 例:有条件语句: 有条件语句: if a<b then 其逆波兰表示为: 其逆波兰表示为: x:=a+b else x:=a-b 或写成一行: 或写成一行 ab<13FJxab+:=18RJxab:=
@表示单目运算减 表示单目运算减
例2.-(a*b-c) -
2.赋值语句的四元式: 赋值语句的四元式: 赋值语句的四元式 把赋值看成一种运算, 分量 为空 分量2 把赋值看成一种运算,<分量 >为空 (:= , 10, / , x) 例1:x:=10 : (* , a , b , T1) * 例2:x:= -(a*b-c) : * -
(1)递归子程序法的代码生成 ) (2)利用优先矩阵的语法分析直接生成目标代码 ) (3)利用逆波兰算法进行语法、语义分析 )利用逆波兰算法进行语法、
7.2 7.2 两种编译流程
(1)语法分析-语义分析: )语法分析-语义分析: 直接生成目标代码 优点:编译相对简单, 优点:编译相对简单,时间效率高 缺点:空间代价较高 缺点: --中间代码 (2)语法分析--中间代码-优化-目标代码 )语法分析--中间代码-优化-
二、其它语法成分的逆波兰表示: 其它语法成分的逆波兰表示: 1.赋值语句 <左部 赋值语句: 左部 左部>:=<表达式 表达式> 赋值语句 表达式 赋值运算, 把‘:=’看成一个运算符号 ’看成一个运算符号——赋值运算,它为一特殊的 赋值运算 双目运算,则对应的逆波兰表示为: 双目运算,则对应的逆波兰表示为: 例:x:=100 <左部 <表达式的逆波兰表示 := 左部> 表达式的逆波兰表示 左部 表达式的逆波兰表示> 逆波兰表示为: 逆波兰表示为: x100 := 逆波兰表示为: xab*cd/+:= 逆波兰表示为: