编译原理(4)语义_2(表达式及赋值语句的翻译)
表达式及赋值语句的翻译ppt课件
![表达式及赋值语句的翻译ppt课件](https://img.taocdn.com/s3/m/b7b61f05312b3169a451a4bf.png)
返填。
.
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所对应的四元式需要
回填“真”、“假”出口的四元式地址所构成的
链。这是因为在翻译过程中,常常会出现若干转
移四元式转向同一个目标但目标位置又未确定的
情况,此时可用“拉链”的方法将这些四元式链
接起来,待获得转移目标的四元式地址时再进行
编译原理实验报告总结
![编译原理实验报告总结](https://img.taocdn.com/s3/m/6a038bf376eeaeaad0f3301b.png)
学年第学期《编译原理》实验报告学院(系):计算机科学与工程学院班级:11303070A学号:***********姓名:无名氏指导教师:保密式时间:2016 年7 月目录1.实验目的 (1)2.实验内容及要求 (1)3.实验方案设计 (1)3.1 编译系统原理介绍 (1)3.1.1 编译程序介绍 (2)3.1.2 对所写编译程序的源语言的描述 (2)3.2 词法分析程序的设计 (3)3.3 语法分析程序设计 (4)3.4 语义分析和中间代码生成程序的设计 (4)4. 结果及测试分析 (4)4.1软件运行环境及限制 (4)4.2测试数据说明 (5)4.3运行结果及功能说明 (5)5.总结及心得体会 (7)1.实验目的根据Sample语言或者自定义的某种语言,设计该语言的编译前端。
包括词法分析,语法分析、语义分析及中间代码生成部分。
2.实验内容及要求(1)词法分析器输入源程序,输出对应的token表,符号表和词法错误信息。
按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误;(2)语法分析器输入token串,通过语法分析,寻找其中的语法错误。
要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。
(3)语义分析和中间代码生成输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生成中间代码。
要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。
实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。
3.实验方案设计3.1 编译系统原理介绍编译器逐行扫描高级语言程序源程序,编译的过程如下:(1).词法分析识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。
编译原理习题答案
![编译原理习题答案](https://img.taocdn.com/s3/m/3ef4e20454270722192e453610661ed9ac515555.png)
编译原理习题答案《编译原理》习题答案:第⼀次:P142、何谓源程序、⽬标程序、翻译程序、汇编程序、编译程序和解释程序?它们之间可能有何种关系?答:被翻译的程序称为源程序;翻译出来的程序称为⽬标程序或⽬标代码;将汇编语⾔和⾼级语⾔编写的程序翻译成等价的机器语⾔,实现此功能的程序称为翻译程序;把汇编语⾔写的源程序翻译成机器语⾔的⽬标程序称为汇编程序;解释程序不是直接将⾼级语⾔的源程序翻译成⽬标程序后再执⾏,⽽是⼀个个语句读⼊源程序,即边解释边执⾏;编译程序是将⾼级语⾔写的源程序翻译成⽬标语⾔的程序。
关系:汇编程序、解释程序和编译程序都是翻译程序,具体见P4 图 1.3。
P143、编译程序是由哪些部分组成?试述各部分的功能?答:编译程序主要由8个部分组成:(1)词法分析程序;(2)语法分析程序;(3)语义分析程序;(4)中间代码⽣成;(5)代码优化程序;(6)⽬标代码⽣成程序;(7)错误检查和处理程序;(8)信息表管理程序。
具体功能见P7-9。
P144、语法分析和语义分析有什么不同?试举例说明。
答:语法分析是将单词流分析如何组成句⼦⽽句⼦⼜如何组成程序,看句⼦乃⾄程序是否符合语法规则,例如:对变量 x:= y 符合语法规则就通过。
语义分析是对语句意义进⾏检查,如赋值语句中x与y类型要⼀致,否则语法分析正确,语义分析则错误。
P155、编译程序分遍由哪些因素决定?答:计算机存储容量⼤⼩;编译程序功能强弱;源语⾔繁简;⽬标程序优化程度;设计和实现编译程序时使⽤⼯具的先进程度以及参加⼈员多少和素质等等。
补充:1、为什么要对单词进⾏内部编码?其原则是什么?对标识符是如何进⾏内部编码的?答:内部编码从“源字符串”中识别单词并确定单词的类型和值;原则:长度统⼀,即刻画了单词本⾝,也刻画了它所具有的属性,以供其它部分分析使⽤。
对于标识符编码,先判断出该单词是标识符,然后在类别编码中写⼊相关信息,以表⽰为标识符,再根据具体标识符的含义编码该单词的值。
编译原理7.3-赋值语句的翻译
![编译原理7.3-赋值语句的翻译](https://img.taocdn.com/s3/m/33500b4c6d85ec3a87c24028915f804d2b1687f2.png)
在编译原理中,赋值语句的翻译是一个重要的环节。本节将介绍赋值语句的 语法规则、翻译过程以及常见错误和建议。
语法规则
赋值语句的语法规则
了解赋值语句的语法规则是翻译过程的基础。
赋值运算符的使用
掌握赋值运算符的用法,能够正确使用它们 完成赋值操作。
翻译过程
1
赋值语句的操作数
从语法角度分析赋值语句,掌握语法规则和 语法树的生成。
赋值语句的词法分析
从词法角度分析赋值语句,探讨其中的关键 词和标识符。
生成目标代码的实例
通过实例演示如何将赋值语句翻译成目标代 码,加深对翻译过程的认识。
常见错误和建议Biblioteka 1 赋值语句中常见的语法错误
2 避免的注意事项和建议
指出赋值语句中容易出现的语法错误,并 提供相应的修正建议。
给出避免翻译赋值语句时的注意事项和建 议,以提高代码的质量和性能。
总结
重述翻译赋值语句的主要内容
总结赋值语句翻译的核心内容,巩固知识点。
强调
强调赋值语句翻译的重要性,以及细节和技巧。
理解赋值语句中的操作数是生成目标代码的关键。
2
生成目标代码的方式
掌握生成目标代码的方法,能够将赋值语句翻译成机器码。
3
翻译赋值语句的步骤
介绍翻译赋值语句的具体步骤,包括词法分析、语法分析和目标代码生成。
实例分析
分析一个具体的赋值语句
通过一个实例分析,加深对赋值语句翻译过 程的理解。
赋值语句的语法分析
编译原理课后习题答案+清华大学出版社第二版
![编译原理课后习题答案+清华大学出版社第二版](https://img.taocdn.com/s3/m/a88cbf7ffab069dc51220162.png)
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。
第 2题
若 PL/0 编译程序运行时的存储分配策略采用栈式动态分配,并用动态链和静态链的方
式分别解决递归调用和非局部变量的引用问题,试写出下列程序执行到赋值语句 b∶=10
时运行栈的布局示意图。 var x,y; procedure p; var a; procedure q; var b;
begin (q)
答案:
PL/0 编译程序所产生的目标代码中有 3 条非常重要的特殊指令,这 3 条指令在 code 中的位置和功能以及所完成的操作说明如下:
INT 0 A 在过程目标程序的入口处,开辟 A 个单元的数据段。A 为局部变量的个数+3。 OPR 0 0
3
《编译原理》课后习题答案第二章
在过程目标程序的出口处,释放数据段(退栈),恢复调用该过程前正在运行的过程的数 据段基址寄存器 B 和栈顶寄存器 T 的值,并将返回地址送到指令地址寄存器 P 中,以使调 用前的程序从断点开始继续执行。
3
《编译原理》课后习题答案第一章
第6题
计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
答案:计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
言进行全盘翻译,将其变为机器代码,而是每读入一条高级语句,就用解释器将其翻译为一 条机器代码,予以执行,然后再读入下一条高级语句,翻译为机器代码,再执行,如此反 复。
《编译原理》教学大纲
![《编译原理》教学大纲](https://img.taocdn.com/s3/m/13b364d39b89680203d8255b.png)
《编译原理》教学大纲大纲说明课程代码: 3225003总学时: 64 学时(讲课 48 学时,实验16 学时)总学分: 4课程类别:学科基础课适用专业 : 计算机科学与技术(专业)预修要求: C 语言程序设计、 C++ 程序设计、数据结构课程的性质、任务及地位:《编译原理》是计算机科学与技术专业的一门重要基础课。
通过对该课程的学习,使学生掌握编译过程中的相关原理和编译技术,让学生能初步进行编译程序的开发和维护,同时促进提高学生开发软件的能力。
教学目的与基本要求:本课程的目的,通过向学生讲述编译系统的结构、工作流程及编译程序各部分的设计原理和实现技术,使学生既掌握编译技术理论的基础与基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
本课程理论性较强。
因授课对象为工科学生,所以在强调编译系统的构造原理和实现方法的同时,为培养学生的实际工作能力,通过上机实践进一步加深学生对课堂教学内容的理解。
目的是要使学生牢固掌握相关的基本理论和基本方法,并能初步利用上述理论和方法解决简单实际问题。
教学方法和教学手段的建议:在教学方法上,贯彻理论联系实际、“精讲、多练”的原则,进行案例式、启发式的教学,对于一些实际性较强的问题要多采用课堂讨论等方式,以提高学生的思辨能力和学习的主动性;引导学生读书、理解、体悟、运用相结合;提高学生的学习兴趣与热情,培养与发挥学生的提出、分析及解决问题的能力。
教学手段:运用多媒体教学手段 +黑板 +上机实验的手段。
采取课堂讲授、课堂讨论、课后练习与自学等形式。
大纲的使用说明:大纲对课程性质、目的等作简单说明,同时列出各章节要学习的知识点、重点、难点,便于教学时教授重点的安排和学生自学安排。
大纲正文第一章引论学时: 4 学时(讲课 4 学时,实验 0 学时)了解编译的概念;理解编译程序的各组成部分及功能。
本章讲授要点:介绍程序设计语言与编译程序间的关系,主要内容包括:各级程序设计语言的定义、源程序的执行、编译程序的构造、编译程序的分类、形式语言理论与编译实现技术的联系。
第17讲 赋值语句的翻译
![第17讲 赋值语句的翻译](https://img.taocdn.com/s3/m/94bdcf0ba32d7375a41780dc.png)
E.type:=integer else E.type:=real }
产生式E→E1 +E2 的语义动作
{ E.place:=newtemp;
if E1.type=integer and E2.type=integer then begin
函数newtemp的功能是,每次调用它时,将返 回一个不同的临时变量名字,如T1,T2,…
赋值语句生成三地址代码的S-属性文法
产生式 S→id:=E E→E1+E2
E→E1*E2
E→-E1
E→ (E1)
E→id
语义规则 S.code:=E.code || gen(id.place ‘:=’ E.place)
(6) L→id { L.place:=id.place; L.offset:=null }
A[i1,i2,…,ik] ((…i1 n2+i2)n3+i3)…)nk+ik) ×w + base-((…((low1 n2+low2)n3+low3)…)nk+lowk)×w
带数组元素引用的赋值语句翻译模式
L.offset
若L为简单变量,null 若L为下标变量,指存放可变部分的临时变量的名字
((…i1 n2+i2)n3+i3)…)nk+ik)×w + base-((…((low1 n2+low2)n3+low3)…)nk+lowk)×w
带数组元素引用的赋值语句
(1) S→L:=E (2) E→E+E (3) E→(E) (4) E→L (5) L→Elist ] (6) L→id (7) Elist→ Elist, E (8) Elist→id [ E
编译原理复习资料(试题)
![编译原理复习资料(试题)](https://img.taocdn.com/s3/m/92dce2b1c1c708a1294a4425.png)
一、单项选择题(将正确答案的字母填入括号,每题1.5分,共30分)1、一般程序设计语言的定义都涉及到( 1.2.3)3个方面。
(1)语法(2)语义(3)语用(4)程序基本符号的确定2、程序语言一般分为( 1 )和( 2 )。
(1)高级语言;(2)低级语言;(3)专用程序语言;(4)通用程序语言3、面向机器语言指的是( B )。
A.用于解决机器硬件设计问题的语言B.特定计算机系统所固有的语言C.各种计算机系统都通用的语言D.只能在一台计算机上使用的语言4.面向机器语言的特点是( D )。
A.程序的执行效率低,编制效率低,可读性差B.程序的执行效率高,编制效率高,可读性强C.程序的执行效率低,编制效率高,可读性强D.程序的执行效率高,编制效率低,可读性差5、程序设计语言常见的数据类型有:1.2.3.4(1)数值型数据(2)逻辑数据(3)字符数据(4)指针类型6、下列程序设计语言中是应用式语言的是:BA、PASCALB、LISPC、VBD、PROLOG7、任何语法结构都可以用( C )来表示。
A、语法树B、树C、抽象语法树D、二义文法树8、字母表是符号的有穷集合,由( C )组成词和句子。
A、字符串B、字符C、符号D、语言9、下列符号是终结符的是( A)。
A、cB、AC、SD、β10、语法树用( C )关系说明了句子中以操作符为核心的操作顺序,同时也说明了每一个操作符的操作对象。
A、上下B、先后C、层次D、关联11、循环语句的语法树为( D )A、 B、 C、 D、12、表达式中间代码的生成可采用( B )。
A 、三地址代码B 、四元式C 、三元式D 、间接三元式13、下列文法中,赋值语句的文法是( C )。
A 、B 、C 、D 、E →E op E 14、词法分析的任务是( A )A 、识别单词B 、分析句子的含义C 、识别句子D 、生成目标代码15、常用的中间代码形式中不含( D )A 、三元式B 、四元式C 、 逆波兰式D 、语法树16、代码优化的目的是( C )A 、节省时间B 、节省空间C 、节省时间和空间D 、把编译程序进行等价转换17、代码生成阶段的主要任务是( C )A 、把高级语言翻译成汇编语言B 、把高级语言翻译成机器语言C 、把中间代码变换成依赖具体机器的目标代码D 、把汇编语言翻译成机器语言18、词法分析器的输入是( B )A 、单词符号串B 、源程序C 、语法单位D 、目标程序19、中间代码的生成所遵循的是( C )A 、语法规则B 、词法规则C 、语义规则D 、等价变换规则20、编译程序是对( D )A 、汇编程序的翻译B 、高级语言程序的解释并执行C 、机器语言的执行D 、高级语言的翻译21、语法分析应遵循( C )A 、语义规则B 、语法规则C 、构词规则D 、等价变换规则22、编译程序各阶段的工作都涉及到( B )A 、语法分析B 、表格管理、出错处理C 、语义分析D 、词法分析23、编译程序工作时,通常有( 1.2.3.4 )阶段。
编译原理(4)语义-2(表达式及赋值语句的翻译)
![编译原理(4)语义-2(表达式及赋值语句的翻译)](https://img.taocdn.com/s3/m/6a0ca39a0066f5335b81218c.png)
计算布尔表达式的值有两种方法:
1、按照优先级和各变量的值,一步步求出结果;
2、优化计算: b = true; a = b ∨ c ; (不计算c, a=true)
b = false; a = b ∧ c ; (不计算c, a=false)
4.4 表达式及赋值语句的翻译
2、布尔表达式的计算
所以,按照优化方式计算布尔表达式,需要给出整个表达式 的真假出口。
练习布尔表达式 a∧b∨c≥d 的真假出口。
4.4 表达式及赋值语句的翻译
布尔表达式中,每个布尔分量一般至少对应两个四元式。
例如:E = E(1)∨E(2) = a∨b
if(a || b) c=1;
对应: (1)(jnz, a,_,真出口)
(2)(j,_,_,3)
(3)(jnz, b,_,真出口)
4.4 表达式及赋值语句的翻译 (3) 其它需要说明的问题:
1、对于每个非终结符E,我们需要为它赋予两个语义值 E.tc和E.fc,分别用来记录E所对应的四元式的真链和假链。 也就是说,为每个非终结符E添加两个属性:tc和fc;因此, 规约的时候,再次扩充语义栈,添加tc栈和fc栈;
2、nxq:这是一个int变量,翻译工作开始之前,初始值 是1,翻译工作开始之后,每执行一次emit(),nxq自增1, 即: nxq = 四元式个数+1;
Backpatch(p, int t){ Q=p; while(Q!=0) { q=四元式Q的第四区段内容; 把t填进四元式Q的第四区段; Q=q;
} // while } //Backpatch
(q) (_ , _ , _ , r) (p) (_ , _ , _ , q)
(r) (_ , _ , _ , t) (q) (_ , _ , _ , t) (p) (_ , _ , _ , t)
编译原理 第4章 new1语义分析和中间代码生成
![编译原理 第4章 new1语义分析和中间代码生成](https://img.taocdn.com/s3/m/e0e99e21a5e9856a561260d8.png)
(3) E→(E(1))
(4) E→i
val[TOP]= val[TOP+1]
val[TOP]=lexval (注:lexval为i的整型内 部值)
文法的LR分析表见表3.20。
第4章 语义分析和中间代码生成
扩充分析栈工作的总控程序功能,使其在完成语法 分析的同时也能完成语义分析工作(这时的语法分析栈 已成为语义分析栈);即在用某一个规则进行归约之后, 调用相应的语义子程序完成与所用产生式相应的语义动 作,并将每次工作后的语义值保存在扩充后的“语义值” 栈中。
语义规则的左部符号E、T、F等的属性值的计算由其
各自相应的右部符号决定,这种属性也称为综合属性。 与产生式S→E关联的语义规则是一个函数print(E.val), 其功能是打印E产生式的值。S在语义规则中没有出现, 可以理解为其属性是一个虚属性。
第4章 语义分析和中间代码生成 简单变量类型说明的文法G[D]如下:
(2) 控制流检查,用以保证控制语句有合法的转向点。如C 语言中不允许goto语句转入case语句流;break语句需寻找包含它 的最小switch、while或for语句方可找到转向点,否则出错。 (3) 一致性检查,如在相同作用域中标识符只能说明一次、 case语句的标号不能相同等。
第4章 语义分析和中间代码生成
同,因此很容易将其翻译成四元式形式。
第4章 语义分析和中间代码生成
考虑以下文法G[A]:A→i=E
E→E+E∣E*E∣−E∣(E)∣i 在此,非终结符A代表“赋值句”。 为了实现由表达式到四元式的翻译,需要给文法 加上语义子程序,以便在进行归约的同时执行对应的
语义子程序。
第4章 语义分析和中间代码生成
第4章 语义分析和中间代码生成
编译原理分知识点习题-语法制导和翻译
![编译原理分知识点习题-语法制导和翻译](https://img.taocdn.com/s3/m/6332ce9a85868762caaedd3383c4bb4cf7ecb70f.png)
编译原理分知识点习题-语法制导和翻译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。
编译原理分知识点习题-语法制导和翻译
![编译原理分知识点习题-语法制导和翻译](https://img.taocdn.com/s3/m/e72821a6aa00b52acec7ca4c.png)
1.一般情况下,为什么语义分析部分仅产生中间代码解答:一般情况下,语义分析部分仅产生中间代码,其原因是:可使难点分解,分别解决。
可对语义分析产生的中间代码进行优化,以产生高效率的目标代码。
语义分析通常与机器无关,目标代码往往与机器有关。
把语义分析与目标代码生成分开,可让一个语义分析程序适用于多个目标代码生成程序。
2.(湖北省高等教育自学考试)什么是语法制导翻译为什么把这种方法叫语法制导翻译解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输入符号串的翻译。
由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或规约的同时又使用这些语义规则来知道翻译与最终产生目标代码,所以称为语法制导翻译。
3.'4.5.给出将附值语句翻译成四元式的语法制导定义,允许右部表达式含有加法、乘法、取负、括号运算。
生成赋值语句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)6.给出将布尔表达式翻译成四元式的语法制导定义。
解答:布尔表达式的语义子程序为:规则语义动作(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 =null】then begin::=NXQ;GEN ( J, __, __, 0)End;BP ( , NXQ );:=null; := }(6) E ::= E A E2 {if ≠null,then 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。
精品文档-编译原理基础(第二版)(刘坚)-第4章
![精品文档-编译原理基础(第二版)(刘坚)-第4章](https://img.taocdn.com/s3/m/f8057474284ac850ac024292.png)
第4章 语法制导翻译生成中间代码
4.1.3 语义规则的两种形式 根据属性表示的抽象程度,语义规则可以有两种表示方
式。用抽象的属性和运算符号表示的语义规则称之为语法制导定 义,而用具体属性和运算表示的语义规则称之为翻译方案,语义 规则也被习惯地称为语义动作。
本章的重点是语义分析,为了突出重点并使分析过程 简单明了,许多的文法都采用简化了的二义文法,而默认解决 二义性的方法是为文法符号规定常规意义下的优先级和结合性。 例如表达式中算符的优先级是乘除法高于加减法,if-thenelse语句中else是右结合(移进先于归约)等等。
第4章 语法制导翻译生成中间代码
第4章 语法制导翻译生成中间代码
语法制导定义仅考虑“做什么”,用抽象的属性 表示文法符号所代表的语义,如用.post表示表达式的后缀 式;并用抽象的算符表示语义的计算,如用“||”表示两 个子表达式后缀式的连接运算。属性和运算的具体实现细 节不在语法制导定义的考虑范围。根据定义4.1可知.post 是一个综合属性。
第4章 语法制导翻译生成中间代码 【例4.1】 为下述文法所描述的中缀形式的算术表达式
加上适当的语义,得到表达式的后缀表示。其语法制导定义和翻 译方案可分别表示如下。
产生式
语法制导定义
翻译方案
L→E E → E1 + E2
E → num
print(E.post) E.post := E1.post || E2.post || '+';
第4章 语法制导翻译生成中间代码
产生式 L→E E → E1 + E2 E → num
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本讲目标
第四章《语义分析和中间代码生成》
4.4
表达式及赋值语句的翻译
简单算术表达式和赋值语句的翻译 布尔表达式的翻译(难点)
重点掌握
算术表达式语义子程序 布尔表达式的真假出口
布尔表达式的语义子程序
根据翻译图得到布尔表达式的四元式
4.4
表达式及赋值语句的翻译
4.4.1 简单算术表达式和赋值语句的翻译
{ E.place=newtemp( ); emit(*,E(1).place, E(2).place,E.place); }
(2) E→ E(1)+E(2)
(3) E→ E(1)*E(2)
(4) E→−E(1)
{ E.place=newtemp( ); emit(uminus, E(1).place,_, E.place); }
4.4
表达式及赋值语句的翻译
(2) 回填算法:把链首p所链接的每个四元式的第四区段(result) 都改写为地址t。 (r) (_ , _ , _ , 0)
Backpatch(p, int t){ Q=p; while(Q!=0) { q=四元式Q的第四区段内容; 把t填进四元式Q的第四区段; Q=q; } // while } //Backpatch
(j) ( _ , _ , _ , 0)
(k) ( _ , _ , _ , 0)
注意:(k)为链首,(i)为链尾,链尾result=0
4.4
表达式及赋值语句的翻译
(1) 拉链算法: p1 ,p2各自是两个链首,将它们合并成一个以p2为链首的新链
merge(p1 ,p2){ if(p2==0) return(p1); else { p=p2; while(四元式p的第四区段内容不为0) p=四元式p的第四区段内容; 把p1填进四元式p的第四区段; return(p2); } // else } // merge
2、∧和∨服从左结合
3、运算符的优先级:算术 ⋗关系⋗布尔⋗“=”
4.4
表达式及赋值语句的翻译
(2)运算对象(三种):
布尔变量 布尔常量(false、true) 关系表达式
1、运算符rop : <、<=、==、!=、>=、> 2、运算对象:算术表达式
3、返回值类型:bool类型
例:bool a,b,c; int x,y,z a = b ∨ c ∧ true ∨ (x+y >= z) a = b ∨ c ∧ true ∨ x+y >= z 思考:运算顺序??
4.4
表达式及赋值语句的翻译
布尔表达式中,每个布尔分量一般至少对应两个四元式。
例如:E = E(1)∨E(2) = a∨b
对应: (1)(jnz, a,_,真出口) (2)(j,_,_,3) (3)(jnz, b,_,真出口) (4)(j,_,_,假出口)
if(a || b) c=1;
(5)(=,c,_,1)
(2) 优化的布尔表达式文法: G[E]: E→EAE | EBE | ┐E | (E) | i | i rop i EA→E∧ EB→E∨ 好处:在句子中,如果出现 “a∨b”或“a ∧ b”之类的
表达式,当扫描到“a∨”或“a ∧”之后就立即可以进行规约, 不用去关系b的取值。
4.4
表达式及赋值语句的翻译
规约的时候,再次扩充语义栈,添加tc栈和fc栈;
2、nxq:这是一个int变量,翻译工作开始之前,初始值 是1,翻译工作开始之后,每执行一次emit(),nxq自增1, 即: nxq = 四元式个数+1;
4.4
表达式及赋值语句的翻译
5、布尔表达式的翻译
1、文法:
G[E]: E→EAE | EBE | ┐E | (E) | i | i rop i EA→E∧ EB→E∨
计算布尔表达式的值有两种方法:
1、按照优先级和各变量的值,一步步求出结果;
2、优化计算:
b = true; a = b ∨ c ; (不计算c, a=true) b = false; a = b ∧ c ; (不计算c, a=false)
4.4
表达式及赋值语句的翻译
2、布尔表达式的计算
i = i, 使用E →i规约,得到:
i = E(符号栈) _ _ b(语义栈) 所以,E.Place中必须保存b在符 号表中的入口地址; x=b 翻译为( =, b, _ , x)
4.4
表达式及赋值语句的翻译
1.设计6个产生式的语义子程序 (1) A→ i=E { p=lookup(); if(p==NULL) error( ); else emit(=,E.place,_,p);
4.4
表达式及赋值语句的翻译
2、布尔表达式的计算
了解1:对布尔运算、关系运算、算术运算的运算对象的类型
可不区分布尔型或算术型,假定不同类型的变换工作将在需 要时强制执行。 思考:C语言的强制转换?? 了解2:布尔表达式在程序语言中不仅用作计算布尔值,还作 为控制语句(如if-else、while等)的条件表达式,用以确定程序 的控制流向。无论布尔表达式的作用如何,按照程序执行的 顺序,都必须先计算出布尔表达式的值。
(r1) ( _ , _ , _ , 0)
(q1) ( _ , _ , _ , r1) (p1) ( _ , _ , _ , q1) (r2) ( _ , _ , _ , 0) (q2) ( _ , _ , _ , r2)
(p2) ( _ , _ , _ , q2)
算法执行完,其实就是将(r2) 中的result变为p1,最终形成一个链
2、语义子程序: (1) E→i (布尔值) { E.tc=nxq; E.fc=nxq+1; emit(jnz,entry(i),_,0);
表4.2(2) 赋值语句X=−B*(C+D)的翻译过程
4.4
表达式及赋值语句的翻译
4.4.2 布尔表达式的翻译
1、布尔表达式的组成
布尔表达式:由运算符与运算对象组成。
定义布尔变量
A、B、C、D
A = bop1 B bop2 C bop3 D
(1)运算符:非┐(单目)、与∧ (双目)、或∨ (双目) 注意:1、优先级: ┐ ⋗ ∧ ⋗ ∨
(q) (_ , _ , _ , r) (p) (_ , _ , _ , q)
(r) (_ , _ , _ , t) (q) (_ , _ , _ , t)
(p) (_ , _ , _ , t)
4.4
表达式及赋值语句的翻译
(3) 其它需要说明的问题: 1、对于每个非终结符E,我们需要为它赋予两个语义值 E.tc和E.fc,分别用来记录E所对应的四元式的真链和假链。 也就是说,为每个非终结符E添加两个属性:tc和fc;因此,
(d) 定义语义函数newtemp( ),即每次调用newtemp( )时都将回 送一个代表新临时变量的整数码;临时变量名按产生的顺序可 设为T1、T2……
4.4
表达式及赋值语句的翻译 { E.place= E(1).place ;}
(5) E→(E(1))
(6) E→i
{ p=lookup(); if(p!=NULL) E.place=p; else error ( ); }
4.4
表达式及赋值语句的翻译
1.设计6个产生式的语义子程序 (1) A→ i=E { p=lookup(); if(p==NULL) error( ); else emit(=,E.place,_,p);
}
(a)对非终结符E定义语义变量E.place,即用E.place表示存放E 值的变量名在符号表中的入口地址或临时变量名的整数码 例如,赋值语句 x = b 刚开始读入到符号栈中,显示为
4.4
表达式及赋值语句的翻译
非终结符A代表“赋值句” 非终结符E代表“表达式”
考虑以下文法G[A]: A→ i = E
E→ E+E | E*E | −E | (E) | i
显然,文法G[A] 是一个二义文法,但通过确定运算符的结合 性及规定运算符的优先级就可避免二义性的发生。 用该文法作为示例的目的:为了更简要地说明语义子程序的 设计过程以及赋值语句的语法制导翻译过程。 如,对于赋值语句x=-b*(c+d),已经预先规定运算顺序
4、解决“真”、“假”出口问题的方法:拉链和回填
(1) 拉链:在同一个表达式内,每个四元式产生的时候,强制 其出口为0,若后面一个四元式和它出口相同,用前面产生式 的序号去填充后面产生式的跳转位置(result),从而将不同
的四元式链接起来,俗称“拉链”。
假如下面三个四元式都是真出口: (i) ( _ , _ , _ , 0) (i) (_ , _ , _ , 0) (j) (_ , _ , _ , i) (k) (_ , _ , _ , j)
(6){if语句后面的四元式}
在这个例子中,真出口和假出口不能在生成四元式的当时产 生;假如a和b并不是简单的布尔变量,或者条件语句后执行 的语句并不是仅仅一句,所有的真假出口都无法给定。
4.4
表达式及赋值语句的翻译
3、布尔表达式的文法:
(1) 普通布尔表达式文法:
G[E]: E→E∧E | E∨E | ┐E | (E) | i | i rop i
4.4
表达式及赋值语句的翻译
2、布尔表达式的计算
(1) 假出口:
若E(1)为假,则E为假; 若E(2)为假,则E为假; 所以E的假出口有两个: E(1)的假出口和E(2)的假出口。