编译原理7.4布尔表达式的翻译

合集下载

布尔表达式的翻译

布尔表达式的翻译

例如,对于条件语句 if A∨B<C then S1 else S2 经翻译后,可得四元式序列: (1) (jnz, A, -, 5) (2) (j, - ,- , 3) (3) (j<, B, C, 5) (4) (j, -, -, p+1) (5) S1相应的四元式序列 (p) (j, -, -, q) (p+1) S2相应的四元式序列 (q)… 其中,表达式A的真出口为5(也是整个表达式的真出 口),假出口为3(即表达式B<C的第一四元式); B<C的真、假出口也分别是整个表达式的真、假出口。
10. 语义变量及辅助语义函数
1.NXQ全局变量,用于指示所要产生的下一四元式的 序号; 2.GEN(…)其意义同前,每次调用,NXQ++; 3.int Merge(int p1,int p2)将链首“指针”分别为 p1和p2的两条链合并为一条,并返回新链的链首 “指针”(此处的“指针”实际上是四元式的序号, 应为整型值)我们假定四元式是以一结构形式表示 (存储)的: struct _Quadruple{ int Op, arg1, arg2, Result; } QuadrupleList[]; 4.void BackPatch(int p,int t)用四元式序号t回填 以p为首的链,将链中每个四元式的Result域改写为t 的值。 函数Merge )及BackPatch )的程序见书 Merge( BackPatch(
4. 布尔表达式的出口
对于布尔表达式A 对于布尔表达式A∨(B∧(┑C∨D)),其等价的表述是 A ? 1 :(B ?((C ? 0 :1)? 1 : D ): 0 ) :(B ?((C 显然,采用此种结构可产生更为有效的中间代码。这里需假 定原布尔表达式的计算过程中不含有任何的副作用 定原布尔表达式的计算过程中不含有任何的副作用。 副作用。 在上式的计算中,根据A 在上式的计算中,根据A、B、C、D的取值不同,计算的结 果以及运算的终止点亦不同。例如,当A=1(真)时,结 果以及运算的终止点亦不同。例如,当A=1(真)时,结 果为1且终止于左边第一个‘1’处。 果为1且终止于左边第一个‘1’处。 这样终止的点我们称为该布尔表达式的出口,同时,把使布 这样终止的点我们称为该布尔表达式的出口,同时,把使布 尔表达式取值为真 出口称为真出口 尔表达式取值为真的出口称为真出口,反之称为假出口。 真出口,反之称为假出口 假出口。 对一个布尔表达式而言,它至少有一个真出口 对一个布尔表达式而言,它至少有一个真出口和一个假出口 真出口和一个假出口 (当然可以有多个)。在用于控制流程的布尔表达式E (当然可以有多个)。在用于控制流程的布尔表达式E的 计算中,这些出口 计算中,这些出口分别指出当E值为真和假时,控制所应 出口分别指出当E值为真 时,控制所应 转向的目标(即某一四元式的序号)。 转向的目标(即某一四元式的序号)。

编译原理-算术表达式赋值句数组元素的引用布尔表达式

编译原理-算术表达式赋值句数组元素的引用布尔表达式

10
一维数组元素的地址计算:
跳过前i-1个单元
addr(A[i]) = a + (i-1)*w
首首首
W首 首 首
二维数组元素的地址计算: addr(A[i1,i2])=a+((i1-1)*d2+(i2-1))*w
跳过前i2-1个单元
跳过前i1-1行
11
n维数组元素的地址计算 addr(A[i1,i2,...,in]) =a+((i1-1)*d2*d3*...*dn+(i2-1)*d3*d4*...*dn+...+ (in-1))*w =a-(d2*d3*...*dn+d3*d4*...*dn+...+dn+1)*w +(i1*d2*d3*...*dn+i2*d3*d4*...*dn+...+in-1*dn+in)*w =a–c*w+v*w 根据假设条件③w=1: addr(A[i1,i2,...,in])=a–c+v 其中: c = d2*d3*d4...*dn+d3*d4*d5...*dn+*d4*d5*d6...*dn...+dn+1 = (d2+1)*d3*...*dn+d4*d5...*dn+...+dn+1 =((d2+1)*d3+1)*d4*d5...*dn+...+dn+1 ...... = (...((d2+1)*d3+1)*d4...+1)*dn+1 同理: v = (...((i1*d2+i2)*d3+i3)*d4...+in-1)*dn+in

程序设计语言编译原理第三版第7章

程序设计语言编译原理第三版第7章

N→ Є
D →id: T { enter(top(tblptr), , T.type, top(offset)); top(offset):= top(offset) +T.width } 24
§7.2
说明语句
2.含嵌套说明的翻译模式:
(1)语义规则中的操作: Mktable (previous): 创建一张新符号表,并返回指向新表的一个指针; Enter (table, name, type, offset):
(2)置相对地址为当前offset之值, (3)使offset加上该名字所表示的数据对象的域宽。
20
§7.2 说明语句
3. 相应的翻译模式:
PD { offset:=0 } { enter (, T.type,offset);
DD;D
Did:T
offset:=offset+t.width } Tinteger
(0) (1) (2) (3) (4) (5)
(2) (3) (4)
16
§7.1 中间语言
4.间接三元式:便于代码优化处理
方法:间接码表+三元式表
按运算的先后顺序列出有关三元式在三元表中的位置 例: 语句X:=(A+B)*C;Y:=D↑(A+B)的间接三元式表示如下所示: 间接代码 三元式表 (1) (2) (3) (1) (4) (5)
30
已归约串
PLACE
输入串
语义动作
# #X # X:= # X:= # X:= # X:= # X:=
X:= -B*(C+D)# X := -B*(C+D)# X_ -B*(C+D)# X__ B*(C+D)# -B X__B *(C+D)# -E X__B *(C+D)# { E.place:=p=<B>} E1 X_T1 *(C+D)# {E1.place:=newtemp=T1; 生成四元式(1) } … … … … # X:=E*(C X_T1__C +D)# # X:=E*(E1 X_T1__C +D)# { E1.place:=p=<C> } … … … …

布尔表达式的翻译(2)

布尔表达式的翻译(2)

E (Ltrue, Lfalse)
E (Ltrue, Lfalse)
(Ltrue, L1) E or (L2, Lfalse) E and E (Ltrue, Lfalse)
a< b
c< d e< f
6
产生式
语义规则
考虑如下表达式: E→id1 relop id2
E.code:=gerenl(o‘ipfg.’oeipdn1(i.‘dpg2lo.aptcolae’cEe.‘fgaolsteo)’ E.true) ||
(2) E→E1 and M E2
{ backpatch(E1.truelist, M.quad);
E.truelist:=E2.truelist;
E.falselist:=merge(E1.falselist,E2.falselist) }
21
a<b or c<d and e<f
(5) E→id1 relop id2 { E.truelist:=makelist(nextquad); E.falselist:=makelist(nextquad+1); emit(‘j’ relop.op ‘,’ id 1.place ‘,’ id 2.place‘,’ ‘0’); emit(‘j, -, -, 0’) }
作为整个布尔表达式的“真”“假”出口 (转移目标)仍待回填.
20
a<b or c<d and e<f
(5) E→id1 relop id2 { E.truelist:=makelist(nextquad);
E.falselist:=makelist(nextquad+1);
emit(‘j’ relop.op ‘,’ id 1.place ‘,’ id 2.place‘,’ ‘0’); emit(‘j, -, -, 0’) }

布尔表达式的翻译

布尔表达式的翻译




对于一个布尔表达式 E来说,它应有两条链: 真出口链(称为T链,记作TC)和假出口链(称为 F 链,记作 FC) 。它们就是非终结符 Expr 的两 个属性Expr.TC及Expr.FC。 例如,对于上述if语句中的布尔式E=A∨B<C, 在翻译过程中形成的T链和F链如右图所示。 其中,每条链都是利用四元式中的Result域连 接的, Result >0时,它给出本链的后继四元式 的序号, Result =0时表示本四元式是链尾结 点。
7. 条件语句的翻译结果
在设计布尔表达式翻译算法(即编写语义动作) 时,可定义和使用如下三类四元式:
(jnz, A1, ,p) 当A1为真(非零)时,转向第p四元 式; (jrop,A1,A2,p)当关系A1 rop A2 成立时,转向 第p四元式; (j, , ,p) 无条件转向第p四元式
例如,对于条件语句 if A∨B<C then S1 else S2 经翻译后,可得四元式序列: (1) (jnz, A, -, 5) (2) (j, - ,- , 3) (3) (j<, B, C, 5) (4) (j, -, -, p+1) (5) S1相应的四元式序列 (p) (j, -, -, q) (p+1) S2相应的四元式序列 (q) … 其中,表达式A的真出口为5(也是整个表达式的真出 口),假出口为3(即表达式B<C的第一四元式); B<C的真、假出口也分别是整个表达式的真、假出口。
1. 概述




布尔表达式是布尔运算量和逻辑运算符按一定 语法规则组成的式子。 逻辑运算符通常有∧、∨、﹃三种(在某些语 言中,还有≡(等价)及→(蕴含)等等); 逻 辑 运 算 对 象 可 以 是 逻 辑 值 ( True 或 False )、布尔变量、关系表达式以及由括号 括起来的布尔表达式。 不论是布尔变量还是布尔表达式,都只能取逻 辑值 True 或 False 。在计算机内通常用 1 (或 非零整数)表示真值(True),用0表示假值 (False)。

编译原理(4)语义_2(表达式及赋值语句的翻译)

编译原理(4)语义_2(表达式及赋值语句的翻译)

表达式,当扫描到“a∨”或“a ∧”之后就立即可以进行规约, 不用去关系b的取值。
4.4
表达式及赋值语句的翻译
5、解决“真”、“假”出口问题的方法:拉链和回填

(1) 拉链:在同一个表达式内,当前i号四元式产生的时候, 强制其出口为0,若j号(j>i)四元式和它出口相同,用i去 填充 j 号四元式的(result),从而将不同的四元式链接起

表达式及赋值语句的翻译
4.4.2 布尔表达式的翻译
1、布尔表达式的组成

布尔表达式:由运算符与运算对象组成。
定义布尔变量
A、B、C、D
A = bop1 B bop2 C bop3 D

(1)运算符:非┐(单目)、与∧ (双目)、或∨ (双目) 注意:1、优先级: ┐ ⋗ ∧ ⋗ ∨
2、∧和∨分别服从左结合
赋值语句的四元式中间代码:
(1)(*,2, 3.1416,T1) (2)(*,T1, r, (3)(+,h, r, (4)(*,T2, T3, (5)(=,T4, _, T2) T3) T4) s)
4.4
表达式及赋值语句的翻译
非终结符A代表“赋值句” 非终结符E代表“表达式”
考虑以下文法G[A]: A→ i = E
规约的时候,再次扩充语义栈,添加tc栈和fc栈;
2、nxq:这是一个int变量,翻译工作开始之前,初始值 是1,翻译工作开始之后,每执行一次emit(),nxq自增1, 即: nxq = 四元式个数+1;
4.4
表达式及赋值语句的翻译
例4.3 试给出布尔表达式a∧b∨c≥d作为控制条件的四元式中
间代码。
4.4

表达式及赋值语句的翻译

表达式及赋值语句的翻译ppt课件

表达式及赋值语句的翻译ppt课件

返填。
.
13
例如,假定E的四元式需要回填“真”出口的有p、 q、r这三个四元式,则它们可链接成如图4–6所示 的一条真值链(记作tc)。
(p) (x, x, x,0) …
(q) (x , x, x,p) …
(r) (x, x, x,q)
0是链尾标志 地址(r)是E.tc的链首
.
14
为了处理E.tc和E.fc这两项语义值,我们 需要引入如下的语义变量和函数:
(7) EB→E(1)∨ {Backpatch(E(1).fc,nxq);
EB.tc = E(1).tc; }
(8) E→EBE(2) {E.fc = E(2).fc;
E.tc = merge(EB.tc,E(2).tc);}
注意: EA 、EB是与E不同的非终结符, E(1) 、E(2)是与E相同的非终结符。
算术表达式:
– 算术运算符: +、-、*、/、^等 – 运算对象:操作数 – 算术运算符的运算顺序一般为^、 *、/、 +、-,
且满足左结合,其运算优先级高于布尔运算符, 且高于任何关系运算符。
.
9
为简单起见,我们遵循以上运算约定讨论下 述文法G[E]生成的布尔表达式:
G[E]:E→E∧E∣E∨E∣┐E∣(E)∣i∣i rop i
对于每个非终结符E,我们需要为它赋予两个语义
值E.tc和E.fc,以分别记录E所对应的四元式需要
回填“真”、“假”出口的四元式地址所构成的
链。这是因为在翻译过程中,常常会出现若干转
移四元式转向同一个目标但目标位置又未确定的
情况,此时可用“拉链”的方法将这些四元式链
接起来,待获得转移目标的四元式地址时再进行

布尔表达式的翻译程序设计

布尔表达式的翻译程序设计

学号:0120910680328课程设计题目布尔表达式的翻译程序设计学院计算机学院专业软件工程班级0903姓名陈银指导教师何九周2012 年 1 月 2 日布尔表达式的递归下降翻译程序设计1引言“编译原理”是一门研究设计和构造编译程序原理和方法的课程,是计算机各专业的一门重要的专业基础课。

编译原理这门课程蕴含着计算机学科中解决问题的思路、形式化问题和解决问题的方法,对应用软件和系统软件的设计与开发有一定的启发和指导作用。

“编译原理”是一门实践性较强的课程,要掌握这门课程中的思想,就必须要把所学到的知识付诸实践。

而课程设计是将理论与实践相互联系的一种重要方式。

2概述2.1设计题目布尔表达式的递归下降翻译程序设计2.2设计目的课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。

通常,设计题中的问题比平时的练习题要复杂,也更接近实际。

编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。

2.3设计任务内容布尔表达式的文法:B → TB′B′→ and T B′|εT → FT ′T′→ or FT′|εF → not F |true|false |(B)| i rop i设计布尔表达式文法,给出该文法的属性文法,用递归下降分析法实现对布尔表达式的翻译,给出翻译的逆波兰式结果。

3设计环境与工具Visual C++4设计原则4.1基本方法在本程序中,输入一段布尔语句,使用递归下降的方法得到其推到过程,并利用递归下降翻译的方法的到四元式序列,最终根据生成的四元式序列分析得到逆波兰式。

4.2属性文法B → TB′ B’.in=T.typeB′→ and T B′ B’.in=T.type addtype(and,entry,B.in)B′→ε B’.val=εT → FT T.in=F.type.T′→ or FT′ T’.in=F.type addtype(or,entry,B.in)T′→ε T’val=εF → not F F.val= not.F.valF → true F.val=trueF → false F.val=falseF →(B) F.val=B.valF →i rop i F.val=i.lexval rop i.lexval addtype(i,entry,l.in)5简要的分析与概要设计在该程序中,总共包括3个主要功能,第一个功能是对输入的布尔语句进行递归下降的分析,从而得出从文法到该布尔语句的推导过程,第二个功能是使用递归下降的方法,该布尔语句的四元式序列,第三个功能对四元式序列进行扫描并分析每个四元式的结构特点,并据此将四元式转化为逆波兰式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2. 采取某种优化措施, 只计算部分表达式
把A or B解释成 if A then
true else
B
把A and B解释成 if A then
B else
false
把not A解释成 if A then
false else
true
布尔表达式的两个作用
1. 计算逻辑值 1 or(not 0 and 0)or 0 2. 用做改变控制流语句中的条件表达式
if-then if-then-else while-do 以上对应两种不同的翻译方案
7.4.1 数值表示法
从左到右按类似算术表达式的求值方法来计算
例如,对于布尔表达式: a or b and not c
将被翻译成如下三地址序列:
T1 := not c T2 := b and T1 T3 := a or T2
2020/9/23
布尔运算符: or 、and 、 not 关系运算符: relop:<、≤、=、≠、>和≥ 布尔常量: true和false 布尔变量: id3
计算布尔表达式的值通常有两种办法
1. 如同计算算术表达式,一步不差地从表达式 各部分的值计算出整个表达式的值。
1 or (not 0 and 0) or 0 = 1 or (1 and 0) or 0 = 1 or 0 or 0 = 1 or 0 =1
100 if A<B goto 102 101 goto 106 102 if C<D goto 104 103 goto 106 104 t:= y+z 105 x:= t 106 …
2020/9/23
while (A<B) do if (C<D) then X := Y+Z
100 if A<B goto 102 101 goto 107 102 if C<D goto 104 103 goto 100 104 T∶=Y+Z 105 X∶=T 106 goto 100 107 …
一个形如 a<b 的关系表达式可等价地写成 if a<b then 1 else 0, 并可将它翻译成如下三地址语句序列 (我们假定语句序号从100开始) (100) if a<b goto 103 (101) T:=0 (102) goto 104 (103) T:= 1 (104)
T - 临时变量,存放布尔表达式a<b的值第七章 语义分析和 Nhomakorabea间代码生成
7.1 中间语言 7.2 说明语句 7.3 赋值语句的翻译 7.4 布尔表达式的翻译 7.5 控制语句的翻译 7.6 过程调用的处理 7.7 类型检查
7.4 布尔表达式的翻译
布尔表达式文法G EE1 or E2 | E1 and E2 | not E1 | ( E1 ) | id1 relop id2 | true | false | id3
if a<b or c<d and e>f then S1 else S2 的四元式序列
(1) if a<b goto (7)
(2) goto (3) (3) if c<d goto (5)
(4) goto (p+1) (5) if e>f goto (7)
(6) goto (p+1) (7) (关于S1的四元式)
例7.3 考虑表达式 : a<b or c<d and e<f
假定整个表达式的真假出口已分别置为Ltrue和 Lfalse,则按生成如下的代码:
if a<b goto Ltrue goto L1
L1 : if c<d goto L2 goto Lfalse
L2 : if e<f goto Ltrue goto Lfalse

(p) goto (q) (p+1) (关于S2的四元式)
… (q)
// E.true
// E.false // E.true // E.false
回填 : (1)和(5)的转移地 址为(7), 它是在整个 布尔表达式的四元式 序列生成之后才回填 的地址。
2020/9/23
if A<B and C<D then x:=y+z
相关文档
最新文档