编译原理波兰式和四元式
- 格式:doc
- 大小:107.00 KB
- 文档页数:7
1、给出下面语言的相应文法。
L1={a n b n c i|n≥1,i≥0}从n,i的不同取值来把L1分成两部分:前半部分是anbn:A→aAb|ab后半部分是ci:B→Bc|ε所以整个文法G1[S]可以写为:G1(S):S→AB;A→aAb|ab;B→cB|ε3、构造一个DFA,它接受 ={a,b}上所有包含ab的字符串。
(要求:先将正规式转化为NFA,再将NFA确定化,最小化)4、对下面的文法G:E →TE ’ E ’→+E|ε T →FT ’ T ’→T|εF →PF ’ F ’ →*F ’|ε P →(E)|a|b|∧(1)证明这个文法是LL(1)的。
(2)构造它的预测分析表。
(1)FIRST(E)={(,a,b,^}FIRST(E')={+,ε}FIRST(T)={(,a,b,^}FIRST(T')={(,a,b,^,ε}FIRST(F)={(,a,b,^}FIRST(F')={*,ε}FIRST(P)={(,a,b,^}FOLLOW(E)={#,)} FOLLOW(E')={#,)}FOLLOW(T)={+,),#}FOLLOW(T')={+,),#}FOLLOW(F)={(,a,b,^,+,),#}FOLLOW(F')={(,a,b,^,+,),#}FOLLOW(P)={*,(,a,b,^,+,),#} (2)考虑下列产生式:'→+'→'→'→E E T T F F P E a b ||*|()|^||εεεFIRST(+E)∩FIRST(ε)={+}∩{ε}=φ FIRST(+E)∩FOLLOW(E')={+}∩{#,)}=φ FIRST(T)∩FIRST(ε)={(,a,b,^}∩{ε}=φ FIRST(T)∩FOLLOW(T')={(,a,b,^}∩{+,),#}=φ FIRST(*F')∩FIRST(ε)={*}∩{ε}=φFIRST(*F')∩FOLLOW(F')={*}∩{(,a,b,^,+,),#}=φFIRST((E))∩FIRST(a) ∩FIRST(b) ∩FIRST(^)=φ 所以,该文法式LL(1)文法. (3)+*()a b ^ #EE TE →'E TE →' E TE →' E TE →'E' '→+E E'→E ε'→E εTT F T →'T F T →' T F T →' T F T →'T' '→T ε'→T T '→T ε '→T T '→T T '→T T '→T εFF P F →'F P F →' F P F →' F P F →'F' '→F ε '→'F F * '→F ε '→F ε '→F ε '→F ε '→F ε '→F εPP E →()P a → P b → P →^5、考虑文法: S →AS|b A →SA|a (1)列出这个文法的所有LR(0) 项目。
编译原理四元式什么是编译原理四元式编译原理四元式是编译器中的一种数据结构,用于将源代码转化为计算机能够理解和执行的中间代码。
它由四个字段组成:操作符、操作数1、操作数2和结果。
四元式可以描述源代码中的各种数学和逻辑运算,以及赋值和控制流等操作。
四元式的优点1.易于生成:四元式的生成比解析源代码直接生成目标代码更容易,因为四元式是对源代码的直接翻译。
2.易于优化:通过对四元式进行优化,可以减少生成的目标代码的长度和运行时间。
3.易于理解:四元式是一种中间表示形式,可以帮助开发人员更好地理解和调试源代码。
4.易于扩展:可以通过添加新的操作符和操作数类型来扩展四元式的功能。
四元式的组成四元式由四个字段组成:操作符、操作数1、操作数2和结果。
操作符表示进行的操作,如加法、乘法等;操作数1和操作数2是参与操作的数值或变量;结果是操作的结果。
四元式的形式如下:<操作符, 操作数1, 操作数2, 结果>四元式的生成过程四元式的生成过程可以分为词法分析、语法分析和语义分析三个步骤。
1.词法分析:将源代码分割成一个个的词法单元,如标识符、关键字、操作符等。
2.语法分析:根据源代码的语法规则,生成语法树。
语法树是一个由节点和边组成的树状结构,每个节点表示一个语法单元,例如表达式、语句等。
3.语义分析:遍历语法树,并根据语义规则生成四元式。
语义规则定义了源代码中各个语法单元的含义和操作。
四元式的生成过程既可以手动实现,也可以通过编译器生成器生成。
四元式的应用四元式主要用于编译器的各个阶段,在优化和生成目标代码过程中起到关键作用。
1.优化:通过对四元式进行优化,可以减少生成的目标代码的长度和运行时间。
常见的优化技术包括常量折叠、公共子表达式消除和无用代码删除等。
2.目标代码生成:通过对四元式进行目标代码生成,可以将中间代码转化为目标机器代码。
目标机器代码是计算机能够直接执行的二进制指令。
四元式还可以用于源代码的调试和性能分析。
《编译原理》试卷A 参考答案注意事项:1. 请考生按要求在试卷装订线内填写姓名、学号和年级专业。
2. 请仔细阅读各种题目的回答要求,在规定的位置填写答案。
3. 不要在试卷上乱写乱画,不要在装订线内填写无关的内容。
4. 满分100分,考试时间为120分钟。
题号一二三四总分统分人得分一、单项选择题(每小题2分共20分)1.中间代码生成所依据的是语言的(C )。
A: 词法规则B: 语法规则C: 语义规则D: 产生式规则2.词法分析器的加工对象是(C )。
A: 中间代码B: 单词C: 源程序D: 元程序3.同正则表达式a*b*等价的文法是(C )。
A: G1: S aS|bS|εB: G2: S aSb|εC: G3: S aS|Sb|εD: G4: S abS|ε4.文法G[A]:A→b A→bH H H →BA B→Ab H →a 不是(B ):A: 2型文法B: 正规文法C: 0型文法D: 1型文法5.算符优先分析每次都是对(算符优先分析每次都是对( B B B )进行规约。
)进行规约。
A: A: 短语短语短语 B: B: B: 最左素短语最左素短语最左素短语 C: C: C: 素短语素短语素短语 D: D: D: 句柄句柄6.一个LR (1)文法合并同心集后,如果不是LALR(1)文法必定存在(B ):A: 移进-归约冲突B: 归约-归约冲突C: 识别句型D: 收集类型信息7.下列不属于类型检查范畴的描述是(C )。
A: 运算符的分量类型的相容性B: 形参和实参类型的相容性C :形参和实参的个数的一致性D: 赋值语句的左右部类型的相容性8.( B B )不是)不是DFA 的成分。
A:A:有穷字母表有穷字母表有穷字母表 B: B: B:初始状态集合初始状态集合C:C:终止状态集合终止状态集合终止状态集合 D: D: D:有限状态集合有限状态集合9.若B 为非终结符,则A α.B β为(为( B B B )项目。
一填空题1.编译程序首先要识别出源程序中每个,然后再分析每个并翻译其意义。
单词,句子2.编译器常用的语法分析方法有和两种。
自底向上,自顶向下2.通常把编译过程分为分析与综合两大阶段。
词法、语法和语义分析是对源程序的分析,中间代码生成、代码优化与目标代码的生成则是对源程序的综合。
前端,后端4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即方案和分配方案。
静态存储分配,动态存储5.对编译程序而言,输入数据是,输出结果是。
源程序,目标程序6.文法G包括四个组成部分:一组终结符号,一组非终结符号,一组,以及一个开始符号。
产生式7.文法按产生式的形式分为四种类型,它们是:0型文法,又称短语文法;1型文法,又称上下文有关文法;2型文法,又称;3型文法,又称。
上下文无关文法,正规文法8.最右推导称为,由规范推导产生的句型称为规范句型。
规范推导9.设G是一个文法,S是它的开始符号,如果S=>*α,则称α是一个。
仅由终结符号组成的句型是一个。
句型,句子10 对于一个文法G而言,如果L(G)中存在某个句子对应两棵不同,那么该文法就称为是二义的。
语法树11.通常程序设计语言的单词符号分为五种:基本字、、常数、算符、界限符。
标识符12.在自底向上分析法中,LR分析法把“可归约串”定义为。
句柄13.编译中常用的中间代码形式有逆波兰式、三元式、和四元式等。
树代码14.对中间代码优化按涉及的范围分为,和全局优化。
局部优化,循环优化15.局部优化主要包括、利用公共子表达式和删除无用赋值等内容。
合并已知量16.为了构造不带回溯的递归下降分析程序,我们通常要消除和提取左递归,左公共因子17.计算机执行用高级语言编写的程序主要有两种途径:和。
解释执行,编译执行18.扫描器是词法分析,它接收输入的,对源程序进行词法分析并识别出一个个,供语法分析器使用。
源程序,单词符号19.自下而上分析法采用,,和等四种操作。
编译原理期末总结复习编译原理期末总结复习篇一:一、简答题1.什么是编译程序?答:编译程序是一种将高级语言程序(源程序)翻译成低级语言(目标程序)的程序。
将高级程序设计语言程序翻译成逻辑上等价的低级语言(汇编语言,机器语言)程序的翻译程序。
2.请写出文法的形式定义?答:一个文法G抽象地表示为四元组 G=(Vn,Vt,P,S)–其中Vn表示非终结符号– Vt表示终结符号,Vn∪Vt=V(字母表),Vn∩Vt=φ– S是开始符号,–P是产生式,形如:α→β(α∈V+且至少含有一个非终结符号,β∈V*)3.语法分析阶段的功能是什么?答:在词法分析的基础上,根据语言的语法规则,将单词符号串分解成各类语法短语(例:程序、语句、表达式)。
确定整个输入串是否构成语法上正确的程序。
4.局部优化有哪些常用的技术?答:优化技术1—删除公共子表达式优化技术2—复写传播优化技术3—删除无用代码优化技术4—对程序进行代数恒等变换(降低运算强度)优化技术5—代码外提优化技术6—强度削弱优化技术7—删除归纳变量优化技术简介——对程序进行代数恒等变换(代数简化)优化技术简介——对程序进行代数恒等变换(合并已知量)5.编译过程分哪几个阶段?答:逻辑上分五个阶段:词法分析、语法分析、语义分析与中间代码生成、代码优化、目标代码生成。
每个阶段把源程序从一种表示变换成另一种表示。
6. 什么是文法?答:文法是描述语言的语法结构的形式规则。
是一种工具,它可用于严格定义句子的结构;用有穷的规则刻划无穷的集合;文法是被用来精确而无歧义地描述语言的句子的构成方式;文法描述语言的时候不考虑语言的含义。
7. 语义分析阶段的功能是什么?答:对语法分析所识别出的各类语法范畴分析其含义,进行初步的翻译(翻译成中间代码);并对静态语义进行审查。
8.代码优化须遵循哪些原则?答:等价原则:不改变运行结果有效原则:优化后时间更短,占用空间更少合算原则:应用较低的代价取得较好的优化效果9.词法分析阶段的功能是什么?答:逐个读入源程序字符并按照构词规则切分成一系列单词任务:读入源程序,输出单词符号—滤掉空格,跳过注释、换行符—追踪换行标志,指出源程序出错的行列位置—宏展开,……10.什么是符号表?答:符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息。
编译原理A1.简要说明语义分析的基本功能。
2. 考虑文法 G[S]:S → (T) | a+S | aT → T,S | S消除文法的左递归及提取公共左因子。
3试为表达式 w+(a+b)*(c+d/(e-10)+8) 写出相应的逆波兰表示。
4. 按照三种基本控制结构文法将下面的语句翻译成四元式序列:while (A<C ∧ B<D){if (A ≥ 1) C=C+1;else while (A ≤ D)A=A+2;}。
5. 已知文法 G[S] 为S → aSb|Sb|b,试证明文法 G[S] 为二义文法。
A答案1答:语义分析的基本功能包括: 确定类型、类型检查、语义处理和某些静态语义检查。
2解:消除文法G[S]的左递归:S→(T) | a+S | aT→ST′T′→,ST′| ε提取公共左因子:S→(T) | aS′S′→+S | εT→ST′T′→,ST′| ε3答:w a b + c d e 10 - / + 8 + * +4答:该语句的四元式序列如下(其中E1、E2和E3分别对应A<C∧B<D、A≥1和A≤D,并且关系运算符优先级高):100 (j<,A,C,102)101 (j,_,_,113)102 (j<,B,D,104)103 (j,_,_,113)104 (j=,A,1,106)105 (j,_,_,108)106 (+, C, 1, C)107 (j,_,_,112)108 (j≤,A,D,110) 109 (j,_,_,112)110 (+, A, 2, A)111 (j,_,_,108)112 (j,_,_,100)1135答:证明:由文法G[S]:S→aSb|Sb|b,对句子aabbbb对应的两棵语法树为:因此,文法G[S]为二义文法。
编译原理B1.什么是句子?什么是语言 ?2. 写一文法,使其语言是偶正整数的集合,要求:(1)允许0打头;(2) 不允许0打头。
第一章引论主要内容:编译原理的基本概念、定义、编译原理的应用发展和现状。
重点:编译程序工作的基本构成及各阶段的基本任务,具体要求:理解什么是编译程序,了解各编译程序的基本构成及各阶段的基本任务,编译程序总框,了解编译程序生成过程和构造工具。
一、名词解释1、编译程序:能够把用各种高级语言书写的源程序翻译成某种等价的目标程序的翻译程序。
2、遍:指编译程序对源程序或中间代码程序从头到尾扫描一次。
3、静态分配:在编译时就能够安排好目标程序运行时的全部数据空间。
二、问答题1、简述编译程序的结构?答:编译程序包括词法分析、语法分析、中间代码生成、优化,目标代码产生五个阶段,上述各阶段中还要进行表格处理和出错处理的工作。
2、编译程序可分成哪几个阶段?它们之间的关系如何?答:编译程序可分为五个阶段:词法分析、语法分析、中间代码生成、优化、目标代码生成。
上述五个阶段之间每个阶段输出为作下一阶段的输入,第一阶段的输入是源程序,最后阶段的输出是目标代码程序。
注意:编译过程中,阶段的划分和遍的划分不一定相同第二章高级程序语言概述主要内容:程序语言定义、初等数据类型、数据结构、表达式、语句、高级语言的一般特征及程序语言的语法描述。
重点:程序语言定义具体要求:理解程序语言的词法、语法和语义等概念;熟悉高级程序语言的一般结构和主要共同特征。
一、填空题1、程序语言是由(语法)和(语义)两方面定义的。
2、一个名字的属性包括(类型)和(作用域)3、目标代码一般有三种形式:能够立即执行的机器语言代码,(待装配的机器语言模块)和(汇编语言代码)4、语义:定义一个程序的意义的(一组规则)5、2型文法又称为(上下文无关文法),3型文法又为(正规文法)二、是非题1、虽然名字都是用标识符表示的,但名字和标识符有着本质的区别(对)2、各种名字都是用标识符表示的,所以名字和标识没有本质的区别(错)3、数组元素的地址计算与数组的存储方式没有关系(错)4、语法是指程序的含义(错)5、因名字都是用标识符表示的,故名字与标识符没有区别(错)第三章词法分析主要内容:词法分析器的任务、词法分析器的设计、正规表达式与有限自动机、词法分析器的自动生成。
编译原理复习题一、填空题:1、编译方式与解释方式的根本区别在于(是否生成目标代码)。
2、对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。
3、如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段:(编译阶段)和(运行阶段)。
4、如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分成三个阶段:(编译阶段)、(汇编阶段)和(运行阶段)。
5、自顶向下语法分析方法会遇到的主要问题有(回溯)和((左递归带来的)无限循环)。
6、LL(k)分析法中,第一个L的含义是(从左到右进行分析),第二个L的含义是(每次进行最左推导),“k”的含义是(向输入串中查看K个输入符号)。
7、LL(1)分析法中,第一个L的含义是(从左到右进行分析),第二个L的含义是(每次进行最左推导),“1”的含义是(向输入串中查看1个输入符号)。
8、自顶向下语法分析方法的基本思想是:从(识别符号)出发,不断建立(直接推导),试图构造一个推导序列,最终由它推导出与输入符号相同的(符号串)。
9、自底向上语法分析方法的基本思想是:从待输入的符号串开始,利用文法的规则步步向上进行(直接归约),试图(归约)到文法的(识别符号|开始符号)。
10、LR(0)分析法的名字中,“L”的含义是(从左到右进行分析),“R”的含义是(采用最右推导的逆过程---最左归约),“0”的含义是(向貌似句柄的符号串后查看0个输入符号)。
11、LR(1)分析法的名字中,“L”的含义是(从左到右进行分析),“R”的含义是(采用最右推导的逆过程---最左归约),“1”的含义是(向貌似句柄的符号串后查看1个输入符号)。
12、SLR(1)分析法的名字中,“S”的含义是(简单的),“L”的含义是(从左到右进行分析),“R”的含义是(采用最右推导的逆过程---最左归约),“1”的含义是(向貌似句柄的符号串后查看1个输入符号)。
13、在编译过程中,常见的中间语言形式有(逆波兰表示)、(三元式)、(四元式)和(树形表示)。
中间语言与语法制导翻译重点与难点重点:语法制导翻译的基本思想,属性文法,翻译模式,说明语句的翻译方案。
三地址码,各种语句的目标代码结构、属性文法与翻译模式。
难点:属性的意义,对综合属性,继承属性,固有属性的理解,属性计算,怎么通过属性来表达翻译。
布尔表达式的翻译,对各种语句的目标代码结构、属性文法与翻译模式的理解。
基本要求掌握语法制导翻译的基本思想,属性文法,综合属性,继承属性,固有属性,属性计算,S_属性文法,L_属性文法,说明语句的翻译方案,翻译模式、属性文法的实现掌握中间语言与语义分析的基本概念;熟练掌握语法(结构)树、三地址代码、赋值与控制语句的翻译、说明语句的翻译;掌握组合数据说明的翻译、过程调用翻译。
例题解析例1 给定文法 E --> T { R.i := T.p }R { E.p := R.s }R --> addopT { R1.i := mknode( addop.val, R.i, T.p ) }R { R.s := R1.s }R --> { R.s := R1.s }T --> ( E ) { T.p := E.p }T --> id { T.p := mkleaf( id, id.entry ) }T --> num { T.p := mkleaf( num, num.val ) }(1) 指出文法中的各非终结符具有哪些综合属性和哪些继承属性⑵画出按本翻译模式处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树【解】(1)E的综合属性 p,R的继承属性i,综合属性s;T的综合属性p(2) 处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树如下+(ID, a) +(NUM, 20) -( ID, b) (NUM, 10)例2 定义一个计算器的属性文法,完成一个输入表达式值的计算和显示, 【解】计算器的文法L → EE → E1 + T | TT → T1 * F | FF → ( E ) | digit引进属性val,计算器的属性文法:L → E print( E.val )(L的虚属性)E → E1 + T E.val := E1.val + T.valE → T E.val := T.valT → T1 * F T.val := T1.val * F.valT → F T.val := F.valF → ( E ) F.val := E.valF → digit F.val := digit.lexvallexval 是单词 digit 的属性例3给出对输入串6-3 3*5+4 的分析树与属性计算【解】3*5+4 的分析树与属性计算例4定义一个说明语句的属性文法【解】说明语句的文法D → T LT → intT → realL → L1,idL → id要解决的问题:记录标识符的类型和类型信息传递方法:引进属性type,和in,用T.type记录类型信息,并传给L.in,说明语句的属性文法如下:D → T L L.in := T.typeT → int T.type := ‘integer’T → real T.type := ‘real’L → L1,id L1.in := L.inaddtype( id.entry, L.in )L → id addtype( id.entry, L.in )entry 单词 id 的属性addtype 在符号表中为变量填加类型信息例5 给出输入串real id1,id2,id3 的分析树和属性计算例6 设下列文法生成变量的类型说明D → id LL → , id L | : TT → integer | real试构造一个翻译模式,把每个标识符的类型存入符号表。
一、单项选择题概述部分1.构造编译程序应掌握 。
DA. 源程序B. 目标语言C. 编译方法D. 以上三项都是2.编译程序绝大多数时间花在 上。
DA. 出错处理B. 词法分析C. 目标代码生成D. 表格管理3.编译程序是对 。
DA. 汇编程序的翻译B. 高级语言程序的解释执行C. 机器语言的执行D. 高级语言的翻译4. 将编译程序分成若干“遍”,是为了 。
BA. 提高程序的执行效率B. 使程序的结构更为清晰C 利用有限的机器内存并提高机器的执行效率D. 利用有限的机器内存但降低了机器的执行效率词法分析部分1.DFA M(见图1-1)接受的字集为 。
DA. 以0开头的二进制数组成的集合B. 以0结尾的二进制数组成的集合C. 含奇数个0的二进制数组成的集合D. 含偶数个0的二进制数组成的集合 2.词法分析器的输出结果是 。
C A. 单词的种别编码 B. 单词在符号表中的位置C. 单词的种别编码和自身值D. 单词自身值3.正规式M1和M2等价是指 。
CA. M1和M2的状态数相等B. M1和M2的有向边条数相等C. M1和M2所识别的语言集相等D. M1和M2状态数和有向边条数相等4.词法分析器的加工对象是 。
CA .中间代码B .单词C .源程序D .元程序5.同正规式(a|b )*等价的正规式为 。
DA .(a|b)+B .a*|b*C .(ab)*D .(a*|b*)+6. 两个DFA 等价是指: 。
DA. 这两个DFA 的状态数相同B. 这两个DFA 的状态数和有向弧条数都相等C. 这两个DFA 的有向弧条数相等D. 这两个DFA 接受的语言相同7. 下列符号串不可以由符号集S ={a,b}上的正闭包运算产生的是:(A )A. εB. aC. aaD. ab8.称有限自动机A1和A2等价是指________。
DA .A1和A2都是定义在一个字母表上的有限自动机B .A1和A2状态数和有向边数相等C .A1和A2状态数或有向边数相等图1-11D.A1和A2所能识别的字符串集合相等9.同正规式(a|b)+等价的正规式是_______。
一、选择1、构造编译程序应掌握()A.源程序B.目标文件C.编译方法D.以上三项2、编译程序绝大多数时间花在()上A.出错处理B.词法分析C.目标代码生成D.表格管理3、编译程序是对()A.汇编程序的翻译B.高级语言程序的解释执行C.机器语言的执行D.高级语言的翻译4、词法分析器的输出结果是()A.单词的种别编码B.单词在符号表中的位置C.单词的种别编码和自身值D.单词自身值5、正规式M1和M2等价是指()A. M1和M2的状态数相等B. M1和M22的有向变条数相等C. M1和M2所识别的语言集相等D. M1和M2状态数和有向边条数6、DFA M接受的字集为()A.以0开头的二进制数组成的集合B.以0结尾的二进制数组成的集合C.含奇数个0的二进制数组成的集合D.含偶数个0的二进制数组成的集合7、文法G[S]:S→xSx|y所识别的语言是()A.xyxB.(xyx)*C.x n yx n(n≥0)D.x n yx n8、如果文法G[S]是无二义的,则它的任何句子α()A.最左推导和最右推导对应的语法树必定相同B.最左推导和最右推导对应的语法树可能不同C.最左推导和最右推导必定相同D.可能存在两个不同的最左推导,但它们对应的语法树相同9、采用自顶向下分析,必须()A.消除左递归B.消除右递归C.消除回溯D.提取公共左因子10、设a、b、c是文法的终结符,且满足有限关系a〓b和b〓c,则()A.必有a〓cB.必有c〓aC.必有b〓aD.a~c都不一定成立11、在规范规约中,用()开刻画可归约串A.直接短语B.句柄C.最左素短语D.素短语12、若a为终结符,则A→α·aβ为()项目A.规约B.移近C.接受D.待约13、若项目集合Ik含有A→α·,则在状态k时,仅当面临的输入符号a∈FOLLOW(A)时,才采取“A→α·”动作的一定是()LR文法B.LR(0)文法C.LR(1)文法D.SLR(1)文法14、同心集合并有可能产生新的()冲突A.归约B.“移进”/“移进”C.“移进”/“归约”D.“归约”/“归约”15、四元式之间的联系时通过()实现的A.指示器B.临时变量C.符号表D.程序变量16、间接三元式表示法的优点为()A.采用间接码表,便于优化处理B.节省存储空间,不便于表的修改C.便于优化处理,节省存储空间D.节省存储空间,不便于优化处理17、表达式(┐A∨B)∧(C∨D)的逆波兰表示为()A. ┐AB∨∧CD ∨B. A┐B∨CD∨∧C.AB∨┐CD∨∧D.A┐B∨∧CD∨18、过程的DISPLAY表中记录了()A.过程的连接数据B.过程的嵌套层次C.过程的返回地址D.过程的入口地址19、过程P1调用P2是,连接数据不包含()A.嵌套层次显示表B.老SP值C.返回地址D.全局DISPLAY表地址20、堆式动态分配申请和释放存储空间遵守()原则A.先请先放B.先请后放C.后请先放D.任意21、.栈式动态分配与管理在过程返回时应做的工作有()A.保护SPB.恢复SPC.保护TOPD.恢复TOP22、如果活动记录中没有DISPLAY表,则说明()A.程序中不允许有递归定义的过程B.程序中不允许有嵌套定义的过程C.程序中不允许有嵌套定义的过程,也不允许有递归定义的过程D.程序中允许有递归定义的过程,也允许有嵌套定义的过程23、优化可生成()的目标代码A.运行时间较短B.占用存储空间较小C.运行时间短但占用内存空间大D.运行时间短且占用存储空间小24、下列()优化方法不是针对循环优化进行的A.强度削弱B.删除归纳变量C.删除多余运算D.代码外提25、基本块内的优化为()A.代码外提,删除归纳变量B.删除多余运算,删除无用赋值C.强度削弱,代码外提D.循环展开,循环合并26、在程序流图中,我们称具有下述性质()的节点序列为一个循环A.它们是非连通的且只有一个入口结点B.它们是强连通的但有多个入口结点C.它们是非连通的但有多个入口结点D.它们是强联通的且只有一个入口结点27、关于必经结点的二元关系,下列叙述中不正确的是()A.满足自反性B.满足传递性C.满足反对称性D.满足对称性28、有一语法制导翻译如下:S→bAb {print“1”} A→(B {print“2”}A→a {print“3”} B→Aa) {print“4”}若输入序列为b(((aa)a)a)b,且采用自底向上的分析方法,则输出序列为()A.32224441B.34242421C.12424243D.3444221229、错误的局部化是()A.把错误理解成局部的错误B. 对错误在局部范围内进行纠结C.当发现错误时,跳过错误所在的语法单位继续分析下去D.当发现错误时立即停止编译,待用户改正错误后再继续编译二、填空1、编译程序划分的类型_________2、编译程序是对__ 高级语言的翻译_3、若文法是无二义的,则规范推导与规范归纳的关系_________4、词法分析程序输出的单词符号通常表示成二元式的形式5、语言的目标是_______,是一个特殊的非终结符6、描述语言L={ab|n≥m ≥1}的文法为__________7、程序语言的生成系统是_________,而识别系统则是___________8、语法分析器的功能是输入_____________输出_____________9、两个自动机等价是指DFA和NFA10、文法四元组G[S]={V T V T S ξ}______________11、词法分析器的输出结果是__________________12、语法分析的方法种类_________________13、文法符号的属性种类____________________14、文法G所描述的语言是__________的集合15、为使编译程序能正确翻译,对程序设计语言必须使用___________的定义方法16、LR语法分析法是指_____________扫描输入串和________进行规范归纳17、首节点是指从它开始到控制流程图中任何一个结点都有一条通路的结点。
编译原理练习四一、填空题1.编译过程中,常见的中间语言形式有四元式、三元式、逆波兰表示和树形表示。
2、表达式x+y≤z V a>0Λ(8+z)>3的逆波兰表示为 xy+z≤a0>8z+3>ΛV。
3、在编译程序中安排中间代码生成的目的是便于代码优化和便于目标程序的移植。
4、根据所涉及程序的范围,优化可分为局部优化、循环优化和全局优化三种。
5、编译程序进行数据流分析的目的是为了进行全局优化。
6.局部优化是局限与一个基本块范围内的一种优化。
7.基本块内可进行的优化有:删除公共子表达式、删除无用代码、合并已知常量等。
8.从词法分析器到中间代码生成与被编译的源代码有关,称之为编译器的前端,而目标代码生成主要与目标机有关,称之为编译器的后端。
9.编译器通常按需要把寄存器分为三组使用:可分配寄存器、保留寄存器和零用寄存器。
10.释放寄存器的总的原则是释放代价最小的寄存器。
二、选择题1.表达式-a+b*(-c+d)的逆波兰式是 d 。
a.ab+-cd+-*b.a-b+c-d+*c.a-bc+-d+*d.a-bc-d+*+2.在编译程序中安排中间代码生成的目的是 b d 。
a.便于进行存储空间的组织b.有利于目标代码的优化c.有利于编译程序的移植d.有利于目标代码的移植e.有利于提高目标代码的质量3.-a-(b*c/(c-d)+(-b)*a)的逆波兰表示是 c 。
a.abc*cd-b-a*+/--b.a-bc*cd-b-a*+/-c.a-bc*cd-/b-a*+-d.a-bc*/cd-b-a*+-4.赋值语句X:=-(a+b)/(c-d)-(a+b*c)的逆波兰表示是 c 。
a.Xab+cd-/-bc*a+-:=b. Xab+/cd-bc*a+--:=c. Xab+-cd-/abc*+-:=d. Xab+cd-/abc*+--:=5.对任何一个编译程序来说,产生中间代码是 b .a.不可缺少的b. 不一定必要的6.逆波兰表达式ab+cd+*所代表的中缀形式的表达式是 b 。
一、填空题:〔10分,第1小题每2个1分,其余每空1分〕1、编译程序一般含有八局部,分别是、、、、、、、。
2、编译程序与解释程序的根本区别是3、一个上下文无关文法G包括四个组成局部依次为:一组_____、一个_____、一组_____、一组______。
4、设G是一个文法,S是文法的开始符号,如果S⇒* X,那么称X 是。
二、选择题〔本大题共15小题,每题1分,共15分〕1、编译程序生成的目标程序是机器语言程序。
A、一定B、不一定2、设有文法G[S]=〔{b},{S,B},S,{S→b|bB, B→bS}〕,该文法描述的语言是。
A、b i | i≥0B、b2i | i≥0C、b2i+1 | i≥0D、b2i+1 | i≥13、设有文法G[S]:S→S*S|S+S|〔S〕|a该文法二义性文法A、是B、不是C、无法判断4、汇编程序是将______翻译成______;编译程序是将_______翻译成__________。
A、汇编语言程序B、机器语言程序C、高级语言程序D、汇编语言或机器语言程序5、给定文法A→bA|cc, 下面符号串中,为该文法句子的是。
①cc ②bcbc ③bcbcc ④bccbcc ⑤bbbccA、①B、①③④⑤C、①⑤D、①④⑤E、①②③④⑤6、语法分析的常用方法是。
①自顶向下②自底向上③自左向右④自右向左A、①②③④B、①②C、③④D、①②③7、语言L={a n bb n|n≥1},那么下述文法中,可以产生语言LA、Z→aZb|aAb|b A→aAb|bB、A→aAb A→bC、Z→AbB A→aA|a B→bB|bD、Z→aAb A→aAb|b8、以下正规表达式中________与(a|b)*(c|d)等价。
A、〔a*|b*〕(c|d)B、〔a*|b*〕*(c|d)C、(ab)*(d|c)D、〔a*b*〕(cd)9、算符优先分析法每次都是对进行归约。
A、最左短语B、直接短语C、句柄D、素短语E、最左素短语10、简单优先分析法每次都是对进行归约A、最左短语B、直接短语C、句柄D、素短语E、最左素短语11、以下文法G[S] ]:S→AA A→Aa|a不是LR〔1〕文法,理由是A.、FIRST(S)∩FIRST〔A〕≠∅B、FIRST〔A〕∩FOLLOW〔A〕≠∅C、FIRST〔Aa〕∩FIRST〔a〕≠∅D、都不是12、设有文法G[E]:E→E*E|E+E|〔E〕|a 该文法LR〔1〕文法A、是B、不是C、无法判断13、对于文法G[A]:A→aABe|Ba B→dB|ε有人说,因为FIRST〔aABe〕∩FOLLOW〔A〕≠∅并且FIRST〔Ba〕∩FOLLOW 〔A〕≠∅,所以文法G[A]不是LL〔1〕文法。
1、试为表达式 w+(a+b)*(c+d/(e-10)+8) 写出相应的逆波兰表示。
2、写出表达式a+b*(c-d)/e的逆波兰式和三元序列。
3、写出表达式a:=(b+c)*e+(b+c)/f的逆波兰式和三元序列。
4、已知文法G(S)及相应翻译方案S→aAb {print “1”}S→a {print “2”}A→AS {print “3”}A→c {print “4"}输入acab, 输出是什么?5、已知文法G(S)S→bAaA→(B | aB→A a)写出句子b(aa)b的规范归约过程.6、已知文法G[S]S→S*aF | aF |*aFF→+aF | +a消除文法左递归。
1、设文法G(S):S→^ | a | (T)T→T,S | S⑴ 消除左递归;⑵ 构造相应的FIRST和FOLLOW集合;⑶ 构造预测分析表2.语句 if E then S(1)改写文法,使之适合语法制导翻译;(2)写出改写后产生式的语义动作。
4。
设某语言的for语句的形式为for i:=E(1) to E(2) do S其语义解释为i:=E(1)LIMIT:=E(2)again: if i<=LIMIT thenBeginS;i:=i+1goto againEnd;(1)写出适合语法制导翻译的产生式;(2)写出每个产生式对应的语义动作。
7。
已知文法G(S)S→a | ^ | (T)T→T,S | S(1) 给出句子(a,(a,a))的最左推导;(2) 给出句型((T,S),a)的短语, 直接短语,句柄。
8。
对于 C 语言do S while E语句(1)改写文法,使之适合语法制导翻译;(2)写出改写后产生式的语义动作.9。
已知文法G(S)S→aAcBeA→Ab| bB→d(1)给出句子abbcde的最左推导及画出语法树;(2)给出句型aAbcde的短语、素短语。
10。
设文法G(S):S→(T) | aS | aT→T,S | S⑴消除左递归和提公共左因子;⑵构造相应的FIRST和FOLLOW集合;⑶构造预测分析表。
《编译原理》常见题型一、填空题1.编译程序的工作过程一般可以划分为词法分析,语法分析,中间代码生成,代码优化(可省) ,目标代码生成等几个基本阶段。
2.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序.3.编译方式与解释方式的根本区别在于是否生成目标代码.5.对编译程序而言,输入数据是源程序,输出结果是目标程序.7.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。
8.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。
其中,词法分析器用于识别单词。
10.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。
12.产生式是用于定义语法成分的一种书写规则。
13.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x│S=>*x,x∈VT*} 。
14.设G是一个给定的文法,S是文法的开始符号,如果S*⇒x(其中x∈V*),则称x是文法的一个句型。
15.设G是一个给定的文法,S是文法的开始符号,如果S*⇒x(其中x∈V T*),则称x是文法的一个句子。
16.扫描器的任务是从源程序中识别出一个个单词符号。
17.语法分析最常用的两类方法是自上而下和自下而上分析法。
18.语法分析的任务是识别给定的终结符串是否为给定文法的句子。
19.递归下降法不允许任一非终结符是直接左递归的。
20.自顶向下的语法分析方法的关键是如何选择候选式的问题。
21.递归下降分析法是自顶向下分析方法。
22.自顶向下的语法分析方法的基本思想是:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。
23.自底向上的语法分析方法的基本思想是:从给定的终结符串开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。
实验三波兰式和四元式及计算
课程编译原理实验名称波兰式和四元式第页班级11计本学号姓名
实验日期:2013年月日报告退发(订正、重做)
一、实验目的:
将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式,并计算用逆波兰式来表示的算术表达式的值。
二、实验说明
1、逆波兰式定义
将运算对象写在前面,而把运算符号写在后面。
用这种表示法表示的表达式也称做后缀式。
逆波兰式的特点在于运算对象顺序不变,运算符号位置反映运算顺序。
采用逆波兰式可以很好的表示简单算术表达式,其优点在于易于计算机处理表达式。
2、产生逆波兰式的前提
中缀算术表达式
3、逆波兰式生成的实验设计思想及算法
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。
如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。
倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。
(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得
到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
3、逆波兰式计算的实验设计思想及算法
(1)构造一个栈,存放运算对象。
(2)读入一个用逆波兰式表示的简单算术表达式。
(3)自左至右扫描该简单算术表达式并判断该字符,如果该字符是运算对
象,则将该字符入栈。
若是运算符,如果此运算符是二目运算符,则将对栈顶部的两个运算对象进行该运算,将运算结果入栈,并且将执行该运算的两个运算对象从栈顶弹出。
如果该字符是一目运算符,则对栈顶部的元素实施该运算,将该栈顶部的元素弹出,将运算结果入栈。
(4)重复上述操作直至扫描完整个简单算术表达式的逆波兰式,确定所有
字符都得到正确处理,我们便可以求出该简单算术表达式的值。
三、实验要求
(一)准备:
1.阅读课本有关章节,
2.考虑好设计方案;
3.设计出模块结构、测试数据,初步编制好程序。
(二)上课上机:
将源代码拷贝到机上调试,发现错误,再修改完善。
第二次上机调试通过。
(三)程序要求:
程序输入/输出示例:
输出的格式如下:
(1)
(2)输入一以#结束的中缀表达式(包括+—*/()数字#)
(3)
(4)逆波兰式
备注:(1)在生成的逆波兰式中如果两个数相连则用&分隔,如28和87,中间用&分隔;
注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、数字,结束符#;
2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);
3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。
同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;
(四)代码实现
using System;
using System.Collections.Generic;
using ponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form7 : Form
{
public Form7()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
if (textBox1.Text == "") MessageBox.Show("请输入表达式");
else
{
string s = textBox1.Text; int i; for (i = 0; i < s.Length - 1; i++) ;
if (s[i] != '#') MessageBox.Show("必须以#结尾");
else
{
string s1, s2;
s1 = textBox1.Text;
Bolan bol = new Bolan();
s2 = bol.bl(s1);
textBox2.Text = s2;
}
}
}
private class Bolan
{
private string s1, s2="";
char ch;
char ch1;
char ch2;
char[] ex = new char[100];
Stack<char> stk = new Stack<char>();
public string bl(string s)
{
int i = 0, t = 0;
ch = s[i]; i++;
while (ch != '#')
{
if (ch >= '0' && ch <= '9')
{
int sum = 0;
while ((ch >= '0' && ch <= '9'))
{
sum = sum * 10 + ch - '0';
ch = s[i++];
} i--;
if (s2.Length == 0) s2 +=sum.ToString();
else
{
if(s2[s2.Length-1]<='9'&&s2[s2.Length-1]>='0')
s2 += "&" + sum.ToString();
else s2 += sum.ToString();
}
}
else
{
if (stk.Count == 0) stk.Push(ch);
else
switch (ch)
{
case'(':
stk.Push(ch);
break;
case')':
while (stk.Peek() != '(')
{
ch1 = stk.Pop(); ex[t] = ch1; t++; s2 += ch1; }
stk.Pop();
break;
case'+': while (stk.Count != 0 && stk.Peek() != '(') {
ch1 = stk.Pop(); ex[t] = ch1; s2 += ch1; t++;
}
stk.Push(ch);
break;
case'-':
while (stk.Count != 0 && stk.Peek() != '(')
{
ch1 = stk.Pop(); ex[t] = ch1; s2 += ch1; t++; }
stk.Push(ch);
break;
case'*': if (stk.Peek() == '*' || stk.Peek() == '/') {
ch1 = stk.Pop(); ex[t] = ch1; t++; s2 += ch1; }
stk.Push(ch);
break;
case'/': if (stk.Peek() == '*' || stk.Peek() == '/') {
ch1 = stk.Pop(); ex[t] = ch1; t++; s2 += ch1; }
stk.Push(ch);
break;
default: break;
}
}
ch = s[i]; i++;
}
while (stk.Count != 0)
{
ch1 = stk.Pop(); ex[t] = ch1; t++; s2 += ch1;
}
return s2;
}
}
private void Form7_Load(object sender, EventArgs e)
{
}
}
}
运行结果截图:
(五)练习该实验的目的和思路:
程序较复杂,需要利用到程序设计语言的知识和大量编程技巧,逆波兰式的生成是算符优先分析法的应用,是一种较实用的分析法,通过这个练习可大大提高软件开发能力。