编译原理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个主要功能,第一个功能是对输入的布尔语句进行递归下降的分析,从而得出从文法到该布尔语句的推导过程,第二个功能是使用递归下降的方法,该布尔语句的四元式序列,第三个功能对四元式序列进行扫描并分析每个四元式的结构特点,并据此将四元式转化为逆波兰式。

第18讲 布尔表达式的翻译

第18讲 布尔表达式的翻译

视频区域
emit(E.place ‘:=’ E 1.place ‘and’ E2.place)}
E→not E1 { E.place:=newtemp;
emit(E.place ‘:=’ ‘not’ E 1.place) }
E→(E1) { E.place:=E1.place }
关于布尔表达式的数值表示法的翻译模式
(1) (>, C, D, T1) (2) (and, B, T1, T2) (3) (or, A, T2, T3)
(1) T1 := C>D (2) T2 := B and T1 (3) T3 := A or T2
计算布尔表达式的两种方法
带优化的翻译法
把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 视频区域
emit(‘if’ id1.place relop. op id2. place ‘goto’ nextstat+3);
emit(E.place ‘:=’ ‘0’);
emit(‘goto’ nextstat+2); emit(E.place‘:=’ ‘1’) }
视频区域
E→id { E.place:=id.place }
E→E1 or E2 { E.place:=newtemp; emit(E.place ‘:=’ E 1.place ‘or’ E2.place)}
E→E1 and E2 { E.place:=newtemp; emit(E.place ‘:=’ E 1.place ‘and’ E2.place) }

编译原理常用术语英汉对照表

编译原理常用术语英汉对照表

编译原理常用术语英汉对照表Lecture 1compiler编译器interpreter解释器preprocessor预处理器assembler汇编器linker链接器loader加载器analysis (analyze)分析lexical词法scanner扫描器syntax(syntactical)语法parser语法分析器semantic语义intermediate中间code generator代码生成器code optimizer代码优化器token词法单元symbol符号,字符source源target目标front (back) end前(后)端pass遍Lecture 2Instruction命令eliminate消除whitespace空白comments注释optional可选的attribute value属性值abstract抽象unit单元operator操作符identifier标识符punctuation标点符号synthesis综合pattern模式lexeme词素sequence序列character符号,字符instance实例buffer缓冲器pointer指针forward向前recognize识别regularexpression正则表达式Finite Automata有穷自动机convert转换alphabet字母表string字符串prefix前缀suffix后缀substring子字符串subsequence子序列union合集intersection交集concatenation链接closure闭包recursive递归inductive (induction)归纳algebraic代数的regular definition正则定义accept接受initial开始transitionfunction转换函数state状态deterministic确定的nondeterministic不确定的consume消耗Lecture 3-1context-free上下文无关terminal终结符号nonterminal非终结符号start symbol开始符号synonym同义词denote表示distinguish区别,成为convention惯例derive(derivation)推倒replace(ment)代替precise准确rewrite重写sentential form句型sentence句子equivalent等价leftmost/rightmost最左/最右graph图形,图order顺序interior内部label标号,标牌leaf (leaves)叶子final最终的constitute组成yield结果frontier边缘distinct不同的desirable期望的convenient方便的immediate立即alternative两者选一的propose提出Lecture 3-2predictive parse预测分析current symbol当前符号predictive parsetable预测分析表appear出现endmarker结束标记assume假设condition条件proper合适的。

《编译原理》(陈火旺版)课后作业参考答案ch6-10

《编译原理》(陈火旺版)课后作业参考答案ch6-10

第6章 属性文法和语法制导翻译7. 下列文法由开始符号S 产生一个二进制数,令综合属性v al 给出该数的值:试设计求S.val 的属性文法,其中,已知B 的综合属性c, 给出由B 产生的二进位的结果值。

例如,输入101.101时,S.val=5.625,其中第一个二进位的值是4,最后一个二进位的值是0.125。

【答案】11. 设下列文法生成变量的类型说明:(1)构造一下翻译模式,把每个标识符的类型存入符号表;参考例6.2。

【答案】第7章 语义分析和中间代码产生1. 给出下面表达式的逆波兰表示(后缀式):3. 请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。

【答案】间接码表:(1)→(2)→(3)→(4)→(1)→(5)→(6)4. 按7.3节所说的办法,写出下面赋值句A:=B*(-C+D ) 的自下而上语法制导翻译过程。

给出所产生的三地址代码。

【答案】5. 按照7.3.2节所给的翻译模式,把下列赋值句翻译为三地址代码: A[i, j]:=B [i, j] + C[A [k, l]] + d [ i+j] 【答案】6. 按7.4.1和7.4.2节的翻译办法,分别写出布尔式A or ( B and not (C or D) )的四元式序列。

【答案】用作数值计算时产生的四元式: 用作条件控制时产生的四元式:其中:右图中(1)和(8)为真出口,(4)(5)(7)为假出口。

7. 用7.5.1节的办法,把下面的语句翻译成四元式序列: While A<C and B<D do if A=1 then C:=C+1else while A ≦D do A:=A+2; 【答案】第9章 运行时存储空间组织4. 下面是一个Pascal 程序:当第二次( 递归地) 进入F 后,DISPLAY 的内容是什么?当时整个运行栈的内容是什么? 【答案】第1次进入F 后,运行栈的内容: 第2次进入F 后,运行栈的内容:第2次进入F 后,Display 内容为:5. 对如下的Pascal 程序,画出程序执行到(1)和(2)点时的运行栈。

07-第7章-中间代码生成-编译原理PDF精讲课件-中国科技大学(共13讲)

07-第7章-中间代码生成-编译原理PDF精讲课件-中国科技大学(共13讲)

7.2 声 明 语 句
sort readarray exchange quicksort partition readarray 表头 i 空 sort 表头 指向readarray 指向exchange quicksort 表头 k v partition partition a x readarray exchange quicksort exchange 表头
7.2 声 明 语 句
7.2.2 作用域信息的保存 • 所讨论语言的文法
P D; S D D ; D | id : T | proc id ; D ; S sort var a:…; x:…; readarray var i:…; exchange quicksort var k, v:…; partition var i, j:…; 图6.14的程序 参数被略去
E E1 E2 E.nptr = mkNode( ‘’, E1.nptr, E2.nptr) E.nptr = mkUNode( ‘uminus’, E1.nptr) E E1 E (E1) F id E.nptr = E1.nptr E.nptr = mkLeaf (id, id.entry)
7.2 声 明 语 句
本节介绍 • 为局部名字建立符号表条目 • 为它分配存储单元 • 符号表中包含名字的类型和分配给它的存储 单元的相对地址等信息
7.2 声 明 语 句
7.2.1 过程中的声明
7.2 声 明 语 句
计算被声明名字的类型和相对地址 P {offset = 0} D; S DD;D D id : T {enter ( id.lexeme, T.type, offset); offset = offset + T.width } T integer {T.type = integer; T.width = 4 } T real {T.type = real; T.width = 8 } T array [ num ] of T1 {T.type = array (num.val, T1.type); T.width = num.val T1.width} T T1 {T.type = pointer (T1.type); T.width = 4 }

编译原理术语中英文对照表

编译原理术语中英文对照表
间接地址
In direct left recurs ion
间接左递归
In directly recursive date type
间接地归数据类型
In direct register address ing
间接寄存器地址
In duct ion proof
归纳证明
Infinite loops
无限循环
In herited attribute
Delayed evaluati on mecha nism
计算延迟机制
Delimiter
分界符
Dependency graph
依赖图
Derivati on
派生
Determi nistic finite automata
确定性有限自动机
Digit
数字
Directed acyclic graph
有向无环图

Character classes
字符类
Characters
字符
Child link
儿子链接
Chomsky hierarchy
乔姆斯语法层次
Closure
闭包
Code gen erati on
代码生成
Collisio n resoluti on
冲突解决方法
Comme nt delimiter
注释分隔符
中间表示
In terpreter
解释器
ISO(i ntern ati onal sta ndard orga ni zati on)
国际标准组织
Item

No.
English
Chinese
chapter

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

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

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的四元式) … (p) goto (q) (p+1) (关于S2的四元式) … (q) // E.true
例7.2 翻译布尔表达式 a<b or c<d and e<f
100: 101: 102: 103: 104: 105: 106: 107: if a<b goto 103 T1 =0 goto 104 T1 =1 if c<d goto 107 T2 =0 goto 108 T2 =1 108: 109: 110: 111: 112: 113: if e<f goto 111 T3 =0 goto 112 T3 =1 T4 = T2 and T3 T5 = T1 or T4
7.4.2 作为条件控制的布尔式翻译
出现在条件语句 if E then S1 else S2 中的布尔表达式E, 它的作用仅在于控制 对S1和S2的选择。 无须保留E的值。
to E.true E.Code E.true: E.false: S.next: S1.code S2.code … to E.false

一个形如 a<b 的关系表达式可等价地写成 if a<b then 1 else 0, 并可将它翻译成如下三地址语句序列 (我们假定语句序号从100开始) (100) (101) (102) (103) (104) if a<b goto 103 T:=0 goto 104 T:= 1

编译原理 英汉对照

编译原理 英汉对照

编译原理课程英文词汇alphabet字母表symbol符号string串length长度catenation连接power方幂gather集合product乘积empty set空集closure 闭包program程序logic structure逻辑结构generating产生executing执行machine language机器语言instruction指令function函数assembler汇编程序interpreter解释程序translator翻译程序source language源语言finite有穷的source program源程序target language目标语言attribute属性possess占有preprocess预处理compiler编译程序break中断Intermediate language中间语言definition定义reconstructed重构normal正规character sequences 符号序列programming language程序设计语言operand操作数instead替换memory内存element元素high-level language高级语言object program目标程序address地址input输入output输出terminal终结符compilation编辑equivalence等价nonterminal非终结符recursion递归deterministic确定的nondeterministic非确定的Backus-Normal Form巴科斯范式syntax语法tree树expression表达式grammar文法automata自动机prefix前缀suffix后缀infix中缀identify识别identifier标识符analyses分析predigest化简symbol set符号集performed执行forecast预测state状态formula产生式conversion变换precedence优先simple简单handle句柄operator算符terminal state终态first state初态optimizer优化程序concatenation连接word单词alphabet字母表lexical词法scanner扫描器analyzer分析器syntax tree语法树symbol table符号表pass趟,遍regular expression正规表达式code generator代码生成器backdate回溯derivation推导educe推导derivation tree推导树path路径ambiguous二义性simple phrase简单短语context-sensitive上下文有关context-free上下文无关right-linear 右线形phrase-structured短语结构regular grammar文法direct derivation直接推导sentence句子sentential form句型root node根结点subtree子树semantic语义的terminal node端末结点attribute grammar属性文法canonical derivation规范推导top-down自上而下bottom-up自下而上viable prefix活前缀nondeterminate finite automata非确定的有穷自动机。

布尔表达式翻译为四元式序列

布尔表达式翻译为四元式序列

布尔表达式翻译为四元式序列布尔表达式是一种表示逻辑关系的形式,它由一系列的比较运算符和表达式构成,它们可以用来表示一个逻辑关系的真或假。

编译器可以把布尔表达式翻译成四元式序列,这种四元式序列可以让计算机更容易理解和执行程序。

本文将着重介绍如何把布尔表达式翻译成四元式序列,以及布尔表达式及其四元式序列之间的区别。

第一部分:布尔表达式布尔表达式是一种表达式,用来表达一个逻辑关系的真或假。

它由一些关键字和表达式组成,关键字包括“AND”、“OR”、“NOT”等;表达式是一个数值或者变量,用来表示逻辑关系的真或假。

比如,(A and B) (A or B)是一个布尔表达式,A和B分别代表真或假。

布尔表达式可以使用括号来表示优先级,以此来确定逻辑关系的真或假。

比如,(A and (B or C))示:A和(B或C)同时为真才为真,其中B或C优先处理。

第二部分:四元式序列四元式序列指一种表示功能的通用格式,由四个元素组成,分别是操作符、操作数和结果。

它的优点在于简洁、直观和高度可移植,可以用来快速的实现程序的目标。

将布尔表达式翻译成四元式序列,可以有效的提高程序的运行效率,同时也有助于计算机理解程序的逻辑。

一般来说,把布尔表达式翻译成四元式序列要经历以下几个步骤:1.简单的四元式表示布尔表达式中的每一个元素;2.表达式中的比较运算转换成对应的四元式形式;3.布尔表达式用括号分割,从而得到更直观的表示形式。

第三部分:布尔表达式和四元式序列的比较布尔表达式和四元式的区别在于,前者更加容易理解,主要用于表示逻辑关系;而后者则可以有效的提高程序运行的效率,只要把布尔表达式翻译成四元式就可以帮助计算机理解程序的逻辑运行了。

结论:布尔表达式是一种表示逻辑关系的形式,可以用来表示一个逻辑关系的真或假。

将布尔表达式翻译成四元式序列可以提高程序运行的效率,同时也可以更有效地帮助计算机理解程序的逻辑。

布尔表达式和四元式的区别在于,前者更加容易理解,而后者则可以提高程序运行的效率。

编译原理作业集第七章

编译原理作业集第七章

编译原理作业集第七章第七章语义分析和中间代码产⽣本章要点1. 中间语⾔,各种常见中间语⾔形式;2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译;3. 过程调⽤的处理;4. 类型检查;本章⽬标掌握和理解中间语⾔,各种常见中间语⾔形式;各种语句到中间语⾔的翻译;以及类型检查等内容。

本章重点1.中间代码的⼏种形式,它们之间的相互转换:四元式、三元式、逆波兰表⽰;3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式;4.各种控制流语句的翻译及其中间代码格式;5.过程调⽤的中间代码格式;6.类型检查;本章难点1. 各种语句的翻译;2. 类型系统和类型检查;作业题⼀、单项选择题:1. 布尔表达式计算时可以采⽤某种优化措施,⽐如A and B⽤if-then-else可解释为_______。

a. if A then true else B;b. if A then B else false;c. if A then false else true;d. if A then true else false;2. 为了便于优化处理,三地址代码可以表⽰成________。

a. 三元式b. 四元式c. 后缀式d. 间接三元式3. 使⽤三元式是为了________:a. 便于代码优化处理b. 避免把临时变量填⼊符号表c. 节省存储代码的空间4. 表达式-a+b*(-c+d)的逆波兰式是________。

a. ab+-cd+-*;b. a-b+c-d+*;c. a-b+c-d+*;d. a-bc-d+*+;5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表⽰是_______。

a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=;6. 在⼀棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。

第7讲 语法制导翻译和中间代码生成

第7讲 语法制导翻译和中间代码生成

(jnz,A,,0) (j , , ,102) (jnz,B, ,0) (j , , , 0)
查看语义子程序
③ 句 型:
执 行: 属 性:
E∨B∧C>D => E∨EB∧C>D
Sub1; NXQ=104 E∨.TC = 100;
( E∨.TC = 100; )
EB.TC = 102;
EB.FC = 103;
{ E .TC = E2.TC ;
E.FC = Merge( E∧.FC, E2.FC ) }
E.TC
E.FC
NXQ
100 101 102 103 104 105 106
(jnz,A,,104) (j , , ,102) (jnz,B, ,104) (j , , , 105) (j>,C,D,0) (j , , , 0)
如何确定一个布尔表达式的“真出口”和“假出口” 呢?
优 化 计 算
①A∧ B ②A∨ B ③ ~A
解释为: if A then B else FALSE 解释为: if A then TRUE else B 解释为: if A then FALSE else TRUE
① E→E1∧E2
E1的“真出口”就是E2的第一个四元式编号; E1的“假出 口”就是E的“假出口”; E2的“真/假出口”就是E的 “真/假出口”
⑤ 句 型: 执 行: 属 性:
E∨E∧C>D => E∨E∧ E2 Sub2; NXQ=106
E∨.TC = 100; E∧.FC = 103; E2.TC = 104; E2.FC = 105; E∧.FC = 103; )
( E∨.TC = 100;
(2) E → i1 rop i2 { E.TC = NXQ;

编译原理中间代码生成7

编译原理中间代码生成7

7.1 中 间 语 言
7.1.4 静态单赋值形式 • 一种便于某些代码优化的中间表示 • 和三地址代码的主要区别
– 所有赋值指令都是对不同名字的变量的赋值 – 一个变量在不同路径上都定值的解决办法
if (flag) x = 1; else x = 1; y = x a; 的条件语句改成 if (flag) x1 = 1; else x2 = 1;
assign
assign
a
+
a
+
+
+
uminus c
d
uminus
c
d
c
d
b (a) 语法树
b (b) dag
a = (b + cd) + cd的图形表示
7.1 中 间 语 言
构造赋值语句语法树的语法制导定义
产生式
语义规则
S id =E S.nptr = mkNode(‘assign’, mkLeaf (id, id.entry), E.nptr)
a = (b + cd ) + cd 语法树的代码
t1 = b t2 = c d t3 = t1 + t2 t4 = c d t5 = t3 + t4 a = t5
uminus
7.1 中 间 语 言
三地址代码是语法树或dag的一种线性表示
a = (b + cd ) + cd
语法树的代码 dag的代码
7.2 声 明 语 句
P M D; S {addWidth (top (tblptr), top (offset) ); pop(tblptr); pop (offset) }
  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
相关文档
最新文档