编译原理大作业
申优论文 北航本科编译原理大作业
How to Design a C++ Object-orientedCompiler罗杨37230118 AbstractThis system is a C++ object-oriented compiler using a extended C0 grammar as the input language. It can generate the assembly code according to the Intel 386 instructions set. You can use the Masm32v10 software to assemble and link the source code to get your 32-bit applications.摘要本系统实现了一个以扩充C0文法为输入语言的采用C++及面向对象思想设计的编译器,可以生成符合386指令集规范的汇编代码,用Masm32v10汇编可生成32位应用程序。
本系统考虑到不同版本的Masm的功能和使用方法的差异,以及用户手工键入汇编,连接命令多有不便,本系统自带了汇编器Ml.exe和连接器link.exe。
正文由于是目标是Windows平台下32位应用程序,有些文法中的功能如输入和输出无法再像16位汇编时调用DOS中断解决,因此对于这些问题我使用Microsoft提供的类似高级语言的设计方法——调用DLL函数来解决。
其实32位汇编语言在函数调用方面已与高级语言相差无异,可以调用系统API,C RunTime甚至是用户DLL中的函数。
本系统是一遍扫描编译程序,采用面向对象的方法进行构建,各个主要部分均抽象成类。
主要的类有:分析器类Parser,符号表管理器类SymbolTableMgr,四元式管理器类QuadrupleMgr,代码生成器类CodeGenerator,错误处理器类ErrorHandler,全局数据流分析器类GDAOptimizer,全局寄存器分配器类GRDOptimizer,局部公共子表达式删除器类CSDOptimizer,以上属于具有明显功能划分和界限区别的―高级类‖,他们的对象在全局main函数中分别构造和删除;系统中还有其它一些既具有数据结构意义又具有功能操作的―中级类‖,它们一般是―高级类‖或―中级类‖的成员,如基本块集合管理器BBSetMgr,由全局数据流分析器类GDAOptimizer构建,并为其它多个优化器类共享;还有一些相对意义上的―低级类‖,它们具有复杂的数据结构,却几乎没有功能操作,通常由―中级类‖或―高级类‖得数组成员进行管理,如项类Item,四元式类Quadruple,其中项类Item代表符号表中的每一项,四元式类Quadruple顾名思义代表一个四元式,并且四元式的三个操作数是指向项Item的指针。
《编译原理》作业参考答案
《编译原理》作业参考答案一、填空1.图二图一。
2.文法是无ε产生式,且任意两个终结符之间至多有一种优先关系的算符文法。
3.最右推导最右推导。
4.对于循环中的有些代码,如果它产生的结果在循环中是不变的,就把它提到循环外来。
把程序中执行时间较长的运算替换为执行时间较短的运算。
5.对于文法中的每个非终结符A的各个产生式的候选首符集两两不相交;对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则FIRST(A)∩FOLLOW(A)= ø6.控制。
7.语义分析和中间代码产生8.自上而下自下而上自上而下9.自下而上表达式10.自下而上11.源程序单词符号12. DFA初态唯一,NFA初态不唯一;DFA弧标记为Σ上的元素,NFA弧标记为Σ*上的元素;DFA的函数为单射,NFA函数不是单射13.词法,词法分析器,子程序,语法14.ε,a,ab,ab15.终结符号,非终结符号,产生式16.L(G)={a n | n≥1}17.1型,2型,3型18.二义的19.快20.终态,输入字21.单词符号,终结符22.归约23.必须24.直接25.终结符,更快26.E→E+∙T, E→E∙+T, E→∙E+T, E→E+T∙27.归约—归约28.类型检查,一致性检查29.词法分析、词法30.语法分析程序、语法31。
终结符号、产生式、开始符号、非终结符32.2、2、333.不需要避开34.符合、不符合35.推导36.包括37.Ass38.一定没有、一定没有、至多只有一个39.SLR(1)40.移进——归约41.a.控制流检查、b.一致性检查、c.相关名字检查二、判断下面语法是否正确1 ×2 ×3 √4 ×5 √6 ×三、简答题1.词法分析的任务是对输入的源程序进行单词及其属性的识别,为下一步的语法分析进行铺垫;有两种方法可以实现词法分析器:一,手工编写词法分析程序。
二,由词法分析器自动生成程序生成。
编译原理作业与答案
编译原理独立作业2010.5一、简答题1、 构造一个文法使其生成的语言是不允许0打头的偶正整数集合。
2、文法][E G :T T E T E E -+→,F F T F T T /*→,i E F )(→,构造句型i T T T *+-的语法树,并指出该句型的短语、直接短语、句柄、素短语和最左素短语。
3、 某LL(1)文法的预测分析表如下,请在下述分析过程表中填入输入串( a , a )$ 的分析过程。
4、 文法][S G :R L S =→,R S →,R L *→,i L →,L R →,求增广文法中LR(1)项目集的初态项目集I 0。
5、文法][S G :G G S S ;→,()G G t H →,)(S a H →,求出各非终结符的FISTVT 和LASTVT 集合。
二、分析题:1、构造自动机,使得它能识别字母表{0,1}上以00结尾的符号串,将构造的自动机确定化,并写出相应的正规文法。
2、文法][S G :RT eT S → εDR T → εdR R → bd a D →,写出每个非终结符的FIRST 集和FOLLOW 集,并判断该文法是否为LL(1)文法。
3、若有文法][S G :AB S → εaBa A → εb A b B → (1)试证明该文法是SLR(1) 文法,并构造SLR(1)分析表。
(2)给出输入串aa # 的分析过程。
参考答案一、简答题1、构造一个文法使其生成的语言是不允许0打头的偶正整数集合。
8|6|4|2|ABC Z → 9|8|7|6|5|4|3|2|1→A ε|0|B AB B → |8|6|4|2|0→C2、文法][E G :T T E T E E -+→,F F T F T T /*→,i E F )(→,构造句型i T T T *+-的语法树,并指出该句型的短语、直接短语、句柄、素短语和最左素短语。
短语:T ,T-T ,i ,T*i ,T-T+T*i直接短语:T , i 句柄: T素短语(P72):T-T,i 最左素短语:T-T3 某LL(1)文法的预测分析表如下,请在下述分析过程表中填入输入串( a , a )$ 的分析过程。
编译原理作业
编译原理作业
1.设字母表A={a},符号串x=aaa,写出下列符号串及其长度:x0,xx,x5以及A+
2. 令∑={a,b,c},又令x=abc,y=b,z=aab,写出如下符号串及它们的长度:xy,xyz,(xy)3
3. 设有文法G[S]:S::=SS*|SS+|a,写出符号串aa+a*规范推导,并构造语法树。
4. 已知文法G[Z]:Z::=U0∣V1 、U∷=Z1∣1 、V::=Z0∣0 ,请写出全部由此文法描述的只含有四个符号的句子。
5. 已知文法G[S]:S::=AB A::=aA︱εB::=bBc︱bc , 写出该文法描述的语言。
6.已知文法E::=T∣E+T∣E-T 、T::=F∣T*F∣T/F 、F::=(E)∣i,写出该文法的开始符号、终结符号集合V T、非终结符号集合V N。
7. 对6题的文法,写出句型T+T*F+i的短语、简单短语以及句柄。
8. 设有文法G[S]:S::=S*S|S+S|(S)|a,该文法是二义性文法吗?给出分析过程。
9. 写一文法,使其语言是奇正整数集合。
10.给出语言{a n b m|n,m≥1}的文法。
编译原理作业参考答案
最左推导:NNDDD3D34
NNDNDDDDD5DD56D568
最右推导:NNDN4D434
NNDN8ND8N68D68568
2*.写出一个文法,使其语言是奇数集,且每个奇数是不以0开头。
答:
SCAB|B(考虑了正负号)
A1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | AA | A0 |
低级语言:机器语言和汇编语言。
高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。
翻译程序:能够把某一种语言程序(源语言程序)改变成另一种语言程序(目
标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。
{2,4}a = {1,0},{2,4}b = {3,5},无需划分
{3,5}a = {3,5},{3,5}b = {2,4},无需划分
{0,1}a = {1},{0,1}b = {2,4},无需划分
因此,最终的划分为:{0,1}、{2,4}和{3,5},化简后的结果:
5.(P65,14)构造一个DFA M,它接受={0,1}上所有满足如下条件的字符串:每个1都有0直接跟在右边。
T*(i+i)F*(i+i)i*(i+i)
⑵构造语法树
E最左推导构造语法树
E + T
E + T i
T i
i
3.(P36, 9)证明下面的文法是二义的:
SiSeS | iSi
答:对于句子iiiei有两棵不同的语法树。因此该文法是二义的。
SiSeSiiSeSiiieSiiiei
西电网教2022年秋季《编译原理技术》大作业及答案
学习中心/函授站姓名学号西安电子科技大学网络与继续教育学院2022 学年下学期《编译原理与技术》期末考试试题(综合大作业)考试说明:1、大作业试题公布时间:(1)毕业班:2022 年10 月21 日;(2)正常班:2022 年11 月18 日;2、考试必须独立完成,如发现抄袭、雷同均按零分计;3、答案须用《西安电子科技大学网络与继续教育学院2022 秋期末考试答题纸》(个人专属答题纸)手写完成,要求字迹工整、卷面干净、整齐;4、在线上传时间:(1)毕业班学生于2022 年10 月21 日至2022 年11 月1 日在线上传大作业答卷;(2)正常班学生于2022 年11 月18 日至2022 年12 月5 日在线上传大作业答卷;5、拍照要求完整、清晰,一张图片对应一张个人专属答题纸(A4 纸),正确上传。
一、单选题(每小题 2 分,共 10 分)1、以编译方式和解释方式对高级语言源程序进行翻译时,(B)。
A.编译方式不生成源程序的目标代码,解释方式生成源程序的目标代码B.编译方式生成源程序的目标代码,解释方式不生成源程序的目标代码C.编译方式和解释方式都生成源程序的目标代码D.编译方式和解释方式都不生成源程序的目标代码2、在自下而上语法分析中,LR(1)中的L 表示(A)。
A.从左到右扫描输入序列B.最左推导C.最左归约D.最右推导3、一个句型中的最左(B)称为该句型的句柄。
A.短语B.直接短语C.非终结符号D.终结符号4、给定文法A→bA|ab,(A)是该文法的句子。
A.babb B.abab C.baab D.bbab5、用来描述控制进入和离开活动的树结构被称为(C)。
A.语法树B.分析树C.活动树D.嵌套关系树二、填空(每空 2 分,共 20 分)1、在以阶段划分的编译器中,识别单词的阶段称为词法分析,识别句子结构并将其表示成树形式的阶段称为语法分析,贯穿整个编译过程的两个辅助过程(阶段)为符号表管理和出错处理。
编译原理作业(答案new)
第3章作业【编辑人:陈芳芳】1.写一文法,使其语言是偶正整数的集合。
要求:(1)允许0打头;(2)不允许0打头。
【解】:(1)允许0打头且含0的偶正整数集合的文法为:N—>(0|D|E)N|(E|0)D—>1|3|5|7|9E—>2|4|6|8(2) 不允许0打头的偶正整数集合的文法为:R—>(D|E)N|EN—>(0|D|E)N|(E|0)D—>1|3|5|7|9E—>2|4|6|82.一个上下文无关文法生成句子abbaa的推导树如下:SA B Sa S B B A aƐ b b a(1)给出该句子的相应的最左推导,最右推导。
(2)该文法的产生式集合P可能有哪些元素?(3)找出该句子的所有短语,简单短语,句柄。
【解】:(1)最左推导:S=>ABS=>aBS=>aSBBS=>aBBS=>abBS=>abbS=>abbAa=>abbaa最右推导:S=>ABS=>ABAa=>ABaa=>ASBBaa=>ASBbaa=>ASbbaa=>Abbaa=>abbaa (2) 产生式集合P:S—>ABS | Aa| ƐA—>aB—>SBB | b(3) 短语:a , Ɛ , b , bb , aa , abbaa直接短语:a , Ɛ , b句柄:a3、给出生成下述语言的上下文无关文法:(1){a n b n a m b m | n, m >= 0}(2){1n0m1m0n | n, m >= 0}【解】:(1)S—>AAA—>aAb | Ɛ(2)S—>1S0 | AA—>0A1 | Ɛ第4章课后作业1. 构造一个状态数最小的DFA,它接受∑={0,1}上所有倒数第二个字符为1的字符串。
【编辑人:胡志高】【解】:(1)构造相应的正规式:(0|1)* 1(0|1)(2)由正规式构造NFA,如下图:(3)NFA转化DFA① T0=ε-closure({0})={0}②运用子集构造法求DFA状态,如下表,其中T0为初态,T2、T3为终态:ε-closure(move(Ti,0))ε-closure(move(Ti,1)) T0={0}{0} {0,1}T1={0,1} {0,2} {0,1,2}T2={0,2} {0} {0,1}T3={0,1,2} {0,2} {0,1,2}③分别用0,1,2,3代表T0,T1,T2,T3,得DFA如下图:(4)最小化DFA①找DFA中等价状态,分析过程如下:P0=({0,1},{2,3})P1=({0},{1},{2},{3})经以上分析可知:0无等价状态。
编译原理大作业pl语言编译程序
编译原理大作业pl语言编译程序编译原理大作业:PL语言编译程序编译原理是计算机科学中的重要课程,它研究的是如何将高级语言转化为机器语言的过程。
在这门课程的大作业中,我们需要设计一个PL语言的编译程序,将PL语言的源代码转化为可执行的机器代码。
PL语言是一种高级编程语言,它具有丰富的语法和功能,可以用来编写各种应用程序。
编写一个PL语言的编译程序需要经历以下几个步骤:首先,我们需要设计PL语言的语法规则。
语法规则定义了PL语言中各种语句和表达式的结构和组织方式。
通过定义语法规则,我们可以确定PL语言源代码的合法性,并将其转化为抽象语法树。
接下来,我们需要设计词法分析器。
词法分析器负责将源代码分解为一个个的词法单元,如关键字、标识符、运算符等。
通过词法分析器,我们可以将源代码转化为一个个的词法单元序列。
然后,我们需要设计语法分析器。
语法分析器负责根据语法规则,将词法单元序列转化为抽象语法树。
语法分析器使用一种称为“自顶向下”的分析方法,通过递归下降的方式,从源代码的起始符号开始,逐步推导出各个语法单元。
在语法分析的过程中,我们还需要设计语义分析器。
语义分析器负责对抽象语法树进行语义检查和语义处理。
它会检查变量的声明和使用是否合法,进行类型检查,生成中间代码等。
最后,我们需要设计代码生成器。
代码生成器负责将抽象语法树转化为目标机器的机器代码。
代码生成器会根据目标机器的指令集和寄存器分配策略,生成高效的机器代码。
在实现PL语言编译程序的过程中,我们还需要进行测试和调试。
我们可以编写一些PL语言的示例程序,用来测试编译程序的正确性和性能。
通过不断地测试和调试,我们可以逐步完善编译程序,使其能够正确地将PL语言源代码转化为可执行的机器代码。
编译原理大作业是一项非常有挑战性的任务,需要我们对编译原理的各个方面有深入的理解和掌握。
通过完成这个大作业,我们可以更好地理解编译原理的原理和方法,提高我们的编程能力和解决问题的能力。
黑大编译原理作业(附答案)
⿊⼤编译原理作业(附答案)编译原理⼀.填空题1.⼀个典型的编译程序,它⼀般包括⼋个⽅⾯的内容:①词法分析程序⑤代码优化程序②语法分析程序⑥⽬标代码⽣成③语义分析程序⑦错误检查处理④中间代码⽣成⑧信息表管理2.编译执⾏和解释执⾏的区别在于:是否产⽣⽬标代码。
3.⼀个⽂法通常可表⽰成⼀个四元式G[S]=(VN,,VT,P,S)。
4.⼀个递归⽂法所产⽣的句⼦,其个数必然是⽆穷个。
5.设G[S]为⼀⽂法,由⽂法的开始符号S推导出的符号串称为G的_句型_。
6.⼀个句型的最左_直接短语_(即规范分析中,最先被规约的⼦串)称为该句型的句柄。
7.Chomsky定义了四类基本的⽂法,分别称之为:①0型⽅法(短语结构)③2型⽅法(前后⽂⽆关)②1型⽅法(前后⽂有关)④3型⽅法(正规)8.词法分析的任务就在于依次扫描输⼊串中的各个字符并从其中识别出⼀系具有独⽴意义的单词,我们通常把构成各个单词的字符串称为该单词的_词⽂。
9.⼀般来说各类单词的语法都能⽤相应的正规(3型)⽂法来描述。
10我们通常把⼀个有限⾃动机表⽰为M=(K,∑,∮,S0,Z)。
11引⼊具有ε动作的NFA主要⽬的是_把识别各类单词的有限⾃动机⽤ε失线连接起来,组成⼀个单⼀的NFA,然后把所得的NFA 确定化后再据此设计编译程序的词法分析器。
12正规⽂法、正规式,在描述语⾔的意义下是等价的。
13状态转换图、状态矩阵、有限⾃动机,在识别语⾔的意义下是等价的。
14状态转换图中初态结点没有射⼊⽮线,终态结点没有射出⽮线。
15通常构造词法分析程序的两种途径是:①⼿⼯⽅式编程②借助⼯具⾃动⽣成。
⼆.判断题1.⽂法和语⾔之间是⼀⼀对应关系。
( × )2.设G1和G2为两个⽂法,若它们所产⽣的语⾔相等,即L(G1)=L(G2),则称G1和G2等价. ( √ )3.每棵语法树的叶从左到右排列组成⼀个句型。
( √ )4.若⽂法G=(VN ,VT,P,S)的每⼀个产⽣式形如A→β,A∈VN,β∈V*,则称为上下⽂⽆关⽂法,通常⽤来描述计算机语⾔的语法结构。
编译原理作业
c
Bห้องสมุดไป่ตู้
I7: S→bASB.
I8: B →c.Aa B →c. A →. dSa A →. b
A a
I11: B →cA.a
(2)根据识别文法规范句型活前缀的DFA,{I3: S→bA.SB, S→bA., S→.bASB ,S→.bA}和 {I8: B→c.Aa , B →c., A →.dSa , A →.b }存在移进-归约冲突,所以文法不是LR(0)的; 又由于FOLLOW(S)∩{b}={a,c,#}∩{b}=Φ , FOLLOW(B)∩{d,b}={a,c,#}∩{d,b}=Φ ,所以这些 冲突可以用SLR(1)的方法来解决,所以文法是SLR(1)文法。
作业1
1、为语言L1={ ambm bnan| m≥0 ,n ≥1}构造一个上下文无关文法;
则文法G[S]可为: 或:S →AB
S →AB | B A →aAb | ab B →bBa | ba
A →aAb | ε B →bBa | ba
或:S →AbBa A →aAb | ε B →bBa | ε
A → DB | ε B → dB |ε D → a | bd (1)求文法的每个非终结符的FIRST集和 FOLLOW集,以及各规则的SELECT集。 (2)说明文法是LL(1)的理由。 2、构造上述文法的预测分析表,并给出符号串 dbd#的预测分析过程。
• 作业3: 1、(1)FIRST(S) ={ e,a,b, d, ε} ,FOLLOW(S)={ #}
(1) 识别文法规范句型活前缀的DFA:
I0: S ’→.S
S
S →. bASB b S →. bA
拓广文法并编号 产生式:
I1: S ’→S.
山东理工大学编译原理作业
《编译原理》期末大作业班级:计科1101姓名:***学号:**********班内序号:22时间:2013/6/261、实验内容某程序设计语言子集编译器的设计与实现,包括词法分析、语法分析、语义分析和目标代码生成的设计与实现。
2、实验目的(1)理解编译器的工作机制(2)掌握编译器的构造方法3、所实现语言的完整文法<程序> ——> main () <主程序><主程序> ——> { <主程序体> }<主程序体> ——> <变量声明> <语句表><变量声明> ——> <类型符> <标示符> <标示符表> ;<语句表> ——> 空| <语句>;<语句表><类型符> ——> int<标示符> ——> <字母><标示符表> ——> ,<标示符> <标示符表> |空<语句> ——> cin ( <标示符> ) ;| out ( <标示符> );| if ( <条件> ) <语句> ;| while ( < 条件> ) <语句> ;| <标示符>=<赋值语句>;<赋值语句>——> <标示符><算数运算符> <标示符2><标示符2> ——> <字母><条件> ——> <标示符> <关系运算符> <标示符2><算数运算符> ——> + | - | * | /<字母> ——> a|b|c|d.........y|z<关系运算符> ——> > | < | ==4、总体设计5、详细设计5.1 词法分析单词分类表:1)关键字:main int cin cout if while2)字母:a|b|c|d.........y|z3)算术运算符:+ —* / =5)界符:{ }(),;符号表:1 关键字:main2 界符:(2 界符:)3 界符:{4 关键字:int……词法分析框图:词法分析运行界面:5.2 语法分析文法:A——> main () BB——> { E }E ——>F GF ——> H R J ;G ——> 空| K GH ——> intR ——> PJ ——> ,R J | 空K ——> cin ( R ) ;| out ( R );| if ( N ) K ;| while ( N) K ;| R=L;L ——> R O MM ——> PN ——> R Q MO ——> + | - | * | /P ——> a|b|c|d.........y|zQ ——> > | < | ==非终First集Follow集语法分析框图:语法分析运行界面:(包含while语句:)5.3 语义分析实现目标:对每一个赋值表达式,判断运算符的优先级,然后输出四元式。
编译原理 大作业
编译原理大作业As an important component of the computer science curriculum, the study of compilers is essential for students to gain a deep understanding of programming languages and how they are executed by the computer. 编译原理是计算机科学课程中一个重要的组成部分,对于学生来说,掌握编译原理对于深入了解编程语言以及计算机如何执行它们是至关重要的。
The main objective of the study of compilation is to understand the process of translating high-level programming languages into machine code, which can be directly executed by the computer's hardware. 学习编译的主要目标是了解将高级编程语言转换为机器语言的过程,这样机器语言就可以直接由计算机的硬件执行。
Another important aspect of compilers is the optimization process, which aims to improve the efficiency and performance of the generated machine code. 另一个重要的编译原理方面是优化过程,其目标是提高生成的机器码的效率和性能。
Moreover, the study of compilers also involves learning about parsing, semantic analysis, intermediate code generation, and code generation, all of which are crucial in the process of translating a program from a high-level language to machine code. 此外,编译原理的研究还涉及学习解析、语义分析、中间代码生成和代码生成,所有这些都对将程序从高级语言转换为机器码的过程至关重要。
编译原理作业参考答案
编译原理作业参考答案作业一一、是非题1.(×)2.(×)3.(×)4.(×)5.(×)6.(√)7. (√)8.(√)9.(√) 10.(×) 11.(√) 12.(√) 13.(√)二、填空题1.(词法分析),(语法分析),(中间代码生成),(代码优化),(目标代码生成)2.(单词符号),(语法单位)。
3.(源程序),(单词符号)4.(语法),(语义)5. (词法分析)、(语法分析)、(语义分析),(中间代码产生),(代码优化),(目标代码生成)6.(解释方式)7. (语法规则)8. (上下文无关文法)9. (自上而下分析法),(自下而上分析法)10. (规范推导)11. (最左归约)三、名词解释题:1.词法分析器-----执行词法分析的程序。
2. 自编译方式------先对语言的核心部分构造一个小小的编译程序,再以它为工具构造一个能够编译更多语言成分的较大编译程序。
如此扩展下去,就像滚雪球一样,越滚越大,最后形成人们所期待的整个编译程序。
3. 遍-----所谓“遍”就是对源程序或中间结果长头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
4. 编译程序-----一种翻译程序: 能够把某一种语言程序(称为源语言程序)转换成另一种语言(成为目标程序),而后着与前者在逻辑上是等价的。
5. 超前搜索-----所谓超前搜索是在词法分析过程中,有时为了确定词性,需超前扫描若干个字符。
6. 短语------令G是一个文法,S划文法的开始符号,假定αβδ是文法G的一个句型,如果有SαAδ且Aβ,则称β是句型αβδ相对非终结符A的短语。
7. 规范句型------由规范推导所得到的句型。
8. 句柄------一个句型的最左直接短语。
9. -规范推导-----最右推导又称为规范推导。
四、简答题:1. 正规式a ( a | b )*。
2.(a*b|b*a)={a,b,ab,ba,aab,bba……}3.状态转换图是一张有限方向图。
(完整版)编译原理习题及答案(整理后)
2、对无二义性文法来说,一棵语法树往往代表了 。
a. 多种推导过程
b. 多种最左推导过程
c.一种最左推导过程
d.仅一种推导过程 e.一种最左推导过程
3、如果文法 G 存在一个句子,满足下列条件 之一时,则称该文法是二义文法。
a. 该句子的最左推导与最右推导相同
b. 该句子有两个不同的最左推导
c. 该句子有两棵不同的最右推导
T→T*P|P
P→(E)|I
则句型 P+T+i 的句柄和最左素短语为 。
a.P+T 和 i b. P 和 P+T c. i 和 P+T+i d.P 和 T
8、设文法为:S→SA|A
A→a|b
则对句子 aba,下面 是规范推导。
a. SSASAAAAAaAAabAaba
b. SSASAAAAAAAaAbaaba
标语言
第二章
一、单项选择题
1、文法 G:S→xSx|y 所识别的语言是 。
a. xyx
b. (xyx)* c. xnyxn(n≥0) d. x*yx*
2、文法 G 描述的语言 L(G)是指 。
a. L(G)={α|S⇒+ α , α∈VT*}
b. L(G)={α|S⇒* α, α∈VT*}
c. L(G)={α|S⇒* α,α∈(VT∪VN*)} d. L(G)={α|S⇒+ α, α∈(VT∪VN*)}
第一章
1、将编译程序分成若干个“遍”是为了
。
a.提高程序的执行效率
b.使程序的结构更加清晰
c.利用有限的机器内存并提高机器的执行效率
d.利用有限的机器内存但降低了机器的执行效率
编译原理大作业
课程论文递归下降分析器的实现课程名称所属学院班级学生姓名学号二零一四年十二月目录1、递归下降分析器的设计思想 (1)1.1自顶向下的语法分析方法 (1)1.2递归下降分析法 (1)1.3递归下降分器意义: (1)1.4递归下降分析器思想: (1)1.5递归下降分析器的作用: (2)1.6递归下降分析器的形成过程: (2)2、递归向下分析器实现 (2)2.2待分析的简单词法 (2)2.3要求构造的递归下降程序 (3)2.4主函数分析 (3)3、输入串运行分析: (4)4、关键代码分析及运行过程: (5)4.1关键代码分析 (5)4.2文法函数调用过程 (6)5、程序测试: (7)5.1、当程序运行时出现如下输入程序界面 (7)5.2、当程序运行时出现如下输入程序界面 (7)总结 (8)参考文献: (9)附录: (10)递归下降分析器的实现摘要:本文分析了递归下降分析器的实现以及具体的功能,所谓递归下降分析法,就是对文法中的每个非终结符编写一个函数(子程序),每个函数(子程序)的功能是识别由该非终结符所标示的语法成分。
由于描述语言的文法通常是递归定义的,因此相应的这组函数(子程序)一定是相互递归的方式进行调用,所以将此种分析方法称为递归下降分析法。
关键词:递归下降分析器消除递归非终结符1、递归下降分析器的设计思想1.1自顶向下的语法分析方法自顶向下分析法也称面向目标的分析方法,也就是从文法的开始符号出发企图推导出与输入的单词串完全相匹配的句子,若输入串是给定文法的句子,则必能推出,反之必然出错。
自顶向下的确定分析方法需对文法有一定的限制,但由于实现方法简答、直观,便于手工构造或自动生成语法分析器,因而仍是目前常用的方法之一。
而自顶向下的不确定分析方法是带回溯的分析方法,这种方法实际上是一种穷举的试探方法,因此效率低,代价高,因而极少使用。
1.2递归下降分析法递归下降分析法是确定的自上而下分析法,它要求文法是LL(1)文法。
西安电子科技大学2020秋 编译原理与技术(大作业)答案
学习中心/函授站_姓名学号西安电子科技大学网络与继续教育学院2020 学年下学期《编译原理与技术》期末考试试题(综合大作业)考试说明:1、大作业试题于2020 年10 月15 日公布:(1)毕业班学生于2020 年10 月15 日至2020 年11 月1 日在线上传大作业答卷;(2)非毕业班学生于2020 年10 月22 日至2020 年11 月8 日在线上传大作业答卷;(3)上传时一张图片对应一张A4 纸答题纸,要求拍照清晰、上传完整;2、考试必须独立完成,如发现抄袭、雷同均按零分计;3、答案须用《西安电子科技大学网络与继续教育学院标准答题纸》手写完成,要求字迹工整、卷面干净。
一、单选题(每小题 2 分,共 10 分)1、编译器和解释器是两种高级语言处理程序,与编译器相比, B 。
A.解释器不参与运行控制,程序执行的速度慢B.解释器参与运行控制,程序执行的速度慢C.解释器参与运行控制,程序执行的速度快D.解释器不参与运行控制,程序执行的速度快2、给定文法A→bA|ca, B 不是该文法句子。
A.bbca B.bcabca C.ca D.bca3、 B 是与规范归约(最左归约)互逆的一个过程。
A.最左推导B.最右推导C.词法分析D.语义分析4、与逆波兰式abc*+d+对应的中缀表达式是 B 。
A.a+b+c*d B.(a+b)* c+d C.(a+b)* (c+d) D.a+b*c+d5、从编译程序的语法分析角度看,源程序是句子的集合, B 可以较好地反映句子的结构。
A.线性表B.树C.完全图D.堆栈二、填空题(每空 2 分,共 20 分)1、编译程序的工作过程可划分为词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等阶段,符号表管理和出错处理是编译程序各阶段都涉及到的工作。
2、3、用LR 方法实现语法分析时,典型的操作有移进、归约、接受和报错。
4、识别上下文无关语言的自动机是下推自动机。
编译原理课后作业参考答案
作业参考答案第二章 高级语言及其语法描述6、(1)L (G 6)={0,1,2,......,9}+(2)最左推导:N=>ND=>NDD=>NDDD=>DDDD=>0DDD=>01DD=>012D=>0127 N=>ND=>DD=>3D=>34N=>ND=>NDD=>DDD=>5DD=>56D=>568 最右推导:N=>ND =>N7=>ND7=>N27=>ND27=>N127=>D127=>0127 N=>ND=>N4=>D4=>34N=>ND=>N8=>ND8=>N68=>D68=>568 7、G:S →ABC | AC | CA →1|2|3|4|5|6|7|8|9B →BB|0|1|2|3|4|5|6|7|8|9C →1|3|5|7|98、(1)最左推导:E=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+F*F=>i+i*F=>i+i*iE=>T=>T*F=>F*F=>i*F=>i*(E)=>i*(E+T)=>i*(T+T)=>i*(F+T)=>i*(i+T)=>i*(i+F)=>i*(i+i) 最右推导:E=>E+T=>E+T*F=>E+T*i=>E+F*i=>E+i*i=>T+i*i=>F+i*i=>i+i*iE=>T=>T*F=>T*(E)=>T*(E+T)=>T*(E+F)=>T*(E+i)=>T*(T+i)=>T*(F+i)=>T*(i+i)=>F*(i+i)=>i*(i+i) (2)9、证明:该文法存在一个句子iiiei 有两棵不同语法分析树,如下所示,因此该文法是二义的。
编译原理样题3(有答案
编译原理样题一选择题[]1. 型文法也称为正规文法。
[A] O [B] 1 [C] 2 [D] 3[]2. 文法不是LL(I)的。
[A]递归 [B]右递归 [C] 2型 [D]含有公共左因子的【]3.文法E-E+E∣E*E∣i的句子i*i+i*i的不同语法分析树的总数为。
[A]l [B]3 [C]5 [D]7[]4.四元式之间的联系是通过实现。
[A]临时变量 [B]指示器 [C]符号表[D]程序变量[1 5.同心集合并可能会产生的新冲突为 O[A]二义[B]移进/移进[C]移进/归约[D]归约/归约[]6.代码优化时所依据的是 o[A]语法规则[B]词法规则 [C]等价变换规则 [D]语义规则1]7.表达式a-(-b) *c的逆波兰表示为 o[A]a-b@c* [B]abθc*- [C]ab0- [D]ab0c-* (注:©为单目减运算符)[]8.过程的D:ISPLAY表记录了。
[A]过程的连接数据[B]过程的嵌套层次[C]过程的返回地址[D]过程的入口地址二填空题1.编译过程的六个阶段为:词法分析、、语义分析、代码优化和目标代码生成。
2.词法分析阶段的任务式从左到右扫描,从而逐个识别 o3.对于文法Gl和G2,若有,则称文法Gl和G2是等价的。
4.对于文法 G[E] : E→T∣E+T T→F∣T*F F→P^F∣ P PT(E)I i,句型 T+T*F+i 的句柄是,最左素短语是 O所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语。
所谓最左素短语是指处于句型最左边的那个素短语。
如,P*P和i是句型P*P+i的素短语,而P*P 是它的最左素短语。
5.最右推导的逆过程称为,也称为。
6.规范规约中的可规约串是,算符优先分析中的可规约串是 o7. (AV B) A (CV -I DA E)的逆波兰式是 o8.在属性文法中文法符号的两种属性分别称为和 O9.符号表的每•项是由名字栏和两个栏目组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程论文递归下降分析器的实现课程名称所属学院班级学生学号二零一四年十二月目录1、递归下降分析器的设计思想 (1)1.1自顶向下的语法分析方法 (1)1.2递归下降分析法 (1)1.3递归下降分器意义: (1)1.4递归下降分析器思想: (1)1.5递归下降分析器的作用: (1)1.6递归下降分析器的形成过程: (2)2、递归向下分析器实现 (2)2.2待分析的简单词法 (2)2.3要求构造的递归下降程序 (3)2.4主函数分析 (3)3、输入串运行分析: (4)4、关键代码分析及运行过程: (5)4.1关键代码分析 (5)4.2文法函数调用过程 (6)5、程序测试: (6)5.1、当程序运行时出现如下输入程序界面 (6)5.2、当程序运行时出现如下输入程序界面 (7)总结 (8)参考文献: (8)附录: (9)递归下降分析器的实现摘要:本文分析了递归下降分析器的实现以及具体的功能,所谓递归下降分析法,就是对文法中的每个非终结符编写一个函数(子程序),每个函数(子程序)的功能是识别由该非终结符所标示的语法成分。
由于描述语言的文法通常是递归定义的,因此相应的这组函数(子程序)一定是相互递归的方式进行调用,所以将此种分析方法称为递归下降分析法。
关键词:递归下降分析器消除递归非终结符1、递归下降分析器的设计思想1.1自顶向下的语法分析方法自顶向下分析法也称面向目标的分析方法,也就是从文法的开始符号出发企图推导出与输入的单词串完全相匹配的句子,若输入串是给定文法的句子,则必能推出,反之必然出错。
自顶向下的确定分析方法需对文法有一定的限制,但由于实现方法简答、直观,便于手工构造或自动生成语法分析器,因而仍是目前常用的方法之一。
而自顶向下的不确定分析方法是带回溯的分析方法,这种方法实际上是一种穷举的试探方法,因此效率低,代价高,因而极少使用。
1.2递归下降分析法递归下降分析法是确定的自上而下分析法,它要求文法是LL(1)文法。
它的基本思想是:对文法中的每个非终结符编写一个函数或子程序,每个函数或子程序的功能是识别由该非终结符所表示的语法成分。
并且由递归下降分析法,得出了递归下降分析器。
1.3递归下降分器意义:递归下降分析器,可以使已经消除左递归,回溯的文法,迅速判断出输入串是否满足该文法,并按照递归的方法,算出终结符,此分析器解决的手工计算繁琐问题。
1.4递归下降分析器思想:递归下降分析法是一种自顶向下的分析法,文法中的每一个非终结符对应一个递归过程(函数)。
分析过程就是从文法开始符出发执行一组递归过程(函数),这样向下推到直到推出句子;或者是从根节点出发,自顶向下为输入串寻找一个最左匹配序列,建立一个语法树。
1.5递归下降分析器的作用:(1)读入输入的符号串;(2)对输入的符号串逐个与栈中的终结符比较;(3)识别出匹配的输入字符;(4)确定文法是否能推导出输入串1.6递归下降分析器的形成过程:实现递归下降分析器,首先要消除产生式的左递归,其次要消除产生式的回溯,得到可以编写递归下降分析器的文法如(图1)图1递归下降分析器形成过程2、递归向下分析器实现2.2待分析的简单词法(1)非终结符:E E’ T T’F(代码中T’用T1代替) (代码中E’用E1代替)(2)终结符+ * () i2.3要求构造的递归下降程序文法G[E]:E-->E+T|TT-->T*F|FF-->(E)|i首先,消除该文法的左递归,得到文法G’[E]:E-->TE'E'-->+TE'|εT-->FT'T'-->*FT'|εF-->(E)|i然后,根据LL(1)文法的判断条件,对非终结符S和T’的不同产生式的集进行考察,经验证改进后的文法已经是LL(1)文法。
最后构造递归下降分析程序。
每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构编写。
(非终结符在这里统称为A)输入的字符串以#结束。
(1)当遇到终结符a时,则编写语句If(当前读到的输入符号==a)读入下一个输入符号(2)当遇到非终结符A时,则编写语句调用A()。
(3)当遇到A-->ε规则时,则编写语句。
If(当前读到的输入符号不属于Follow(A))error() (退出)。
(4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导。
2.4主函数分析此文发一共可分为个函数,分别为E(),E’(),T(),T’(),F(),其中在E函数中可调用T(),E'()两个函数。
在E’()函数中可以判断输出串“+”,并调用T(),E'()两个函数,在T()函数中可以调用F(),T’()两个函数。
在T'()函数中可以判断输入串“*”,并调用F()和T’()两个函数。
在F()函数中可以调用E()函数并判断输入串“ (”,“)”,或判断输入串是否为“i”。
通过递归调用实现进栈,匹配出栈,最终达到检测效果。
3、输入串运行分析:当输入串为i*(i+i)时,用栈的形式表现出运行过程以#为结束,首先将E 和分文法开始符E压入栈中,开始分析。
首先将“#”和文法开始符E压入栈,可以从词条文法中的到终结符,并判断终结符是否与输入串的的字符相符合,如果符合出栈,并判断在栈中的下一个非终结符,在文法中找到对应的产生式,判断期栈顶的终结符是否与输入串一致,一致出栈,不一致则跳出,此文法无法得到输入串。
如最后栈底剩“#“,并且输入串最后剩#,此输入串符合文法,语法分析成功如(图2)。
图2输入串运行分析在图中第五步执行函数F()时,因当前扫描的字符为“(”,所以匹配后应执行E()(用栈模型将E压栈);并且;在执行完E()后还应执行其后的判断“)”与匹配“)”语句,这在栈的模拟中则是标出此时E压栈之前的位置如图步骤(7~14)即出栈至此14步结束并执行这个判断“)”与匹配“)”语句。
4、关键代码分析及运行过程:4.1关键代码分析void E() //文法中调用E{if(SIGN==0){T(); //并在E中分别调用TE1(); //调用E’}}void E1() //进入E’{if(SIGN==0){if(s[i]=='+') //判断输入串是否是非终结符+,如果是则出栈{readin();T(); //并继续调用T函数进入文法TE1(); //出T函数进去E’中判断是否是}else if(s[i]!='#'&&s[i]!=')'){printf("输入串字符不符合文法定义!\n");SIGN=1;readin();}}}void T(){if(SIGN==0){F();T1();}}4.2文法函数调用过程如(图3)中用二叉树表示出递归下降分析器的递归过程,可得出详细的分析过程。
图3文法函数调用过程5、程序测试:5.1、当程序运行时出现如下输入程序界面如(图4),(图5)所示时匹配成功:图4 第一个输入串匹配图5 第二个输入串匹配5.2、当程序运行时出现如下输入程序界面如(图6)所示时匹配失败,文法无法得到输入串()图6匹配失败总结首先遇到的困难是对递归下降的分析法的不理解。
虽然课上老师曾细致讲解过但还是生疏。
所以,花费大量时间重新学习递归。
重点回顾了进栈,匹配出栈等知识。
让我更清楚的认识到自顶向下的语法分析并且清楚的知道了递归向下分析器的分析法的用法,加深了C语言编译器的用法,并更加清楚的熟练的运用了消除递归,和消除回溯的用法,并自己进行了消除递归,消除回溯的计算。
并运用了递归的方法实现了算法,我对语法分析有了深入的认识,并在最后对算法进行了改进,不结束程序的情况下继续分析。
其次就是课程设计报告的书写。
我也也需要很大的精力,查找资料,请教同学,强老师请求帮助。
在对word的排版方面,有很多的细节需要认真注意。
虽然已经对代码有了清楚的认识,但在论文方面还是遇到了很多问题,比如专业术语欠缺,分析不够详细,但是在我请教了吴刚老师后,对概念有了更加深刻的认识。
自己独立完成课程设计,熟悉程序设计中出现的所有问题以及解决方案,这无疑加深了程序设计人员对设计的项目的印象,并重现拾起了很久不使用的C语言。
为以后的的课程设计和大作业打下了基础。
参考文献:[1] 素琴等编著.编译原理[M]. 清华大学, 2005[2] 胡元义主编.编译原理教程[M]. 电子科技大学, 2003[3] 文生编著.编译程序设计原理与技术[M]. 邮电大学, 2002[4] 程妍. 《编译原理》实验教学体系综述与改革探讨[J]. 电脑. 2008(05)[5] 峰. 提高《编译原理》实验效果的实践[J]. 三峡学院学报. 2007(03)附录:#include<stdio.h>void E();void T();void E1();void T1();void F();void readin();char s[100];int i,SIGN,n;void main(){n=1;while( n ){printf("请输入一个语句,以#号结束语句\n");SIGN = 0;i=0;scanf("%s",&s);if( s[0] == '#'){printf("无语句输入\n");continue;}E();if(s[i]=='#' && SIGN==0)printf("输入串正确,结束语句符号正确!\n");else if(s[i]=='#' && SIGN==1)printf("结束语句符号正确!\n");elseprintf("结束语句符号不正确!\n");printf("是否继续输入1为继续,0为推出\n");scanf("%d",&n);printf("\n");}}void E(){if(SIGN==0){T();E1();}}void E1(){if(SIGN==0){if(s[i]=='+'){readin();T();E1();}else if(s[i]!='#'&&s[i]!=')'){printf("输入串字符不符合文法定义!\n");SIGN=1;readin();}}}void T(){if(SIGN==0){F();T1();}}void T1(){if(SIGN==0){if(s[i]=='*'){readin();F();T1();}else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+'){printf("输入串字符不符合文法定义!\n");SIGN=1;}}}void F(){if(SIGN==0){if(s[i]=='('){readin();E();if(s[i]==')')readin();else if(s[i]== '#'){printf("输入串字符不符合文法定义!\n");SIGN=1;readin();}}else if(s[i]=='i')readin();else{printf("输入串字符不符合文法定义!\n");readin();SIGN=1;}}}void readin(){i++;}。