《编译原理》课程设计题目-2014
编译原理(A卷)答案
湖北第二师范学院2014-2015学年度第二学期《编译原理》课程考试答案(A卷) 院系:计算机学院专业班级:学生姓名:学号:考试方式:闭卷………………………………………………………………………………………………………………一、填空题(每空1分,共10分)1.词法分析程序是逐个识别(字符),形成单词级别的(字符)串,词法分析程序输出的数据是(2 )个,它们分别是(种别编码)和(自身值)。
2.语法分析程序是逐个识别(单词),形成语句级别的(单词)串。
3.一遍扫描的编译方法,是以语法分析程序为主,调用(词法分析)程序、语义分析程序,再由语义程序调用中间代码生成、中间代码优化等。
4.程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即(静态存储分配)方案和(动态存储分配)方案。
二、综合题(共90分)1.(5分)将下面文法改写成3型文法:G=({S,A,B},{a,b,c,d,e},P,S)其中:P={S→abcA|edB,A→beB,B→d}答案:改写后的3型文法是(5分)G=({S,A,B,C,D,E,F},{a,b,c,d,e},P,S)其中:P={S→aC|eF, C→bD,D→cA,A→bE,E→eB,F→dB,B→d}2.(5分)给出下面表达式的四元式形式:a*b+(c-d)/e答案:四元式形式(5分)(*,a,b,t1)(-,c,d,t2)(/,t2,e,t3)(+,t1,t3,t4)3.(30分)给定文法 G[E] :E → E+T | E-T | TT → T*F | T/F | FF → (E) | i该文法是 LL(1) 文法吗?为什么?不是的能否改造为LL(1)文法,如果能够改造,给出改造后的文法,并给出改造后文法是LL(1)文法的证明过程。
无论改造前还是改造后的文法,如果是LL(1)文法,则给出(i+i)*i的分析过程(要求给出详细过程,并给出LL(1)的分析表)答案:(1)该文法不是LL(1)文法,因为文法的产生式含有左递归(2分)(2)该文法可改造为LL(1)文法,即消除左递归,改造后的文法是(3分)E → TE’E’→ +TE’ | -TE’ | εT → FT’T’→ *FT’ | /FT’ |εF → (E) | i证明改造后的文法是LL(1)文法的过程A.求可达ε的非终结符(1分)可达的是E’,T’B.求每个非终结符的First集合(3分)First(E)={ (,i}First(E’)={+,-}First(T)={ (,i}First(T’)={*,/}First(F)={ (,i}C.求每个产生式右部字符串的First集合(3分)First(TE’)={ (,i}First(+TE’)={+}First(-TE’)={-}First(FT’)={ (,i}First(*FT’)={*}First(/FT’)={/}First((E))={ ( }First(i)={ i }First(ε)={ ε}D.求每个非终结符的Follow集合(3分)Follow(E)={$,)}Follow(E’)= Follow(E)={$,)}Follow(T)=First(E’) ∪ Follow(E)={$,+,-,)}Follow(T’)= Follow(T)={$,+,-,)}Follow(F)= First(T’) ∪ Follow(T)={$,+,-, *,/,)}E.求每个非终结符的Select集合(5分)Select(E → TE’)=First(TE’)={ (,i }Select(E’→ +TE’)=First(+TE’)={ + }Select(E’→ -TE’)=First(-TE’)={ - }Select(E’→ε)=First(ε)-{ ε} ∪ Follow(E’)={ $,) }Select(T → FT’)=First(FT’)={ (,i }Select(T’→ *FT’)=First(*FT’)={ * }Select(T’→ /FT’)=First(/FT’)={ / }Select(T’→ε)=First(ε)-{ ε} ∪ Follow(T’)={ $,+,-,) }Select(F → (E))=First((E))={ ( }Select(F → i)=First(TE’)={ i }F.求有多个产生式的非终结符Select集合的交集(2分)显然有Select(E’→ +TE’)∩Select(E’→ -TE’) ∩Select(E’→ε)=ΦSelect(T’→ *FT’) ∩Select(T’→ /FT’) ∩Select(T’→ε)= ΦSelect(F → (E))= ∩Select(F → i)= Φ所以改造后的文法是LL(1)文法4.(10分)对下面的NFA进行确定化答题:第1第25.(15分)给定文法 G[E] :E → E+T | E-T | TT → T*F | T/F | F该文法是算符优先文法吗?是,则构造该文法的算符优先关系矩阵,并给出(i+i)*i的分析过程(要求给出详细过程)答案:(1)该文法是算符优先文法(1分)(2)构造该文法的算符优先矩阵A.求各非终结符的FirstVT集合(3分)FirstVT(E)={+,-,*,/,(,i}FirstVT(T)={*,/,(,i}FirstVT(F)={(,i}B.求各非终结符的LasttVT集合(3分)LastVT(E)={ +,-,*,/,),i }LastVT(T)={ *,/,),i }LastVT(F)={ ),i }C.构造优先关系表(4分)6.(25分)给定文法 G[E] :T → T*F | FF → (E) | i该文法是LR(0)文法吗?是,则构造该文法的LR(0)分析表,并给出(i+i)*i的分析过程,不是的,是SLR(1)文法吗,是,则构造该文法的SLR(1)分析表,并给出(i+i)*i的分析过程。
编译原理试题及答案
编译原理试题及答案
编译原理是计算机科学中的一门重要课程,它涉及到程序设计语言的语法、语义分析以及编译器的设计与实现等内容。
下面我们将为大家提供一些编译原理的试题及答案,希望能够帮助大家更好地理解和掌握这门课程的知识。
1. 什么是编译原理?
编译原理是研究编译器的设计与实现的一门学科,它主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化和代码生成等内容。
2. 什么是词法分析?
词法分析是编译原理中的一个重要内容,它主要负责将源程序转换成一个个的单词符号,也就是词法单元。
3. 什么是语法分析?
语法分析是编译原理中的另一个重要内容,它主要负责将词法单元序列转换成抽象语法树,以便进行后续的语义分析和中间代码生成。
4. 什么是语义分析?
语义分析是编译原理中的一个关键环节,它主要负责对源程序进行语义检查,以确保程序的正确性和合法性。
5. 什么是中间代码生成?
中间代码生成是编译原理中的一个重要环节,它主要负责将源程序转换成一种中间形式的代码,以便进行后续的代码优化和代码生成。
6. 什么是代码优化?
代码优化是编译原理中的一个关键环节,它主要负责对中间代码进行优化,以提高程序的执行效率和减少资源消耗。
7. 什么是代码生成?
代码生成是编译原理中的最后一个环节,它主要负责将优化后的中间代码转换成目标机器代码,以便计算机能够执行。
以上就是关于编译原理的一些试题及答案,希望能够帮助大家更好地理解和掌握这门课程的知识。
如果大家对编译原理还有其他疑问,可以随时向我们提问,我们将竭诚为大家解答。
广工2014编译原理课程设计报告
课程设计课程名称编译原理题目名称PL/0编译器的扩充学生学院计算机学院专业班级计算机科学与技术12(4) 学号学生姓名柏石先指导教师李杨2014 年12 月28日一、实验目的与要求基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:*= 和 /=(2)扩充语句(Pascal的FOR语句):FOR <变量>:=<表达式>STEP<表达式> UNTIL<表达式>Do<语句>选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加类型:①字符类型;②实数类型。
(2)增加注释; 注释由/*和*/包含;(3)扩充函数:①有返回值和返回语句;②有参数函数。
(4)增加一维数组类型(可增加指令)。
(5)其他典型语言设施。
二、实验环境与工具1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解析执行系统,后缀名为.PL0;2、目标语言:生成文件后缀为*.COD的目标代码3、实现平台:Borland C++Builder 64、运行平台:Windows 8.1三、设计概述1、结构设计说明(1)PL/0编译系统的结构框架源语言:源语言是基于C语言写的PL/0编译程序——PL0语言(可以看成Pascal 语言的子集)目标语言:假想的栈式计算机计算语言,即类PCODE指令代码。
指令格式如下:其中f代表功能码,l表示层次差,a的含意对不同的指令有所区别。
具体的指令功能表:(一)扩充赋值运算:*= 和/=*= 和/=的语法描述图:(二)扩充语句(Pascal的FOR语句)因为在Pascal中的FOR语句描述为:FOR <变量>:=<表达式> STEP <表达式> UNTIL <表达式> DO <语句> 所以增加FOR,STEP,UNTIL,DOFOR语句语法描述图为:1)增加所需要的保留字和运算符,实现*=和/=,以及FOR语句,应该增加TIMESBECOMES,SLASHBECOMES,FOR,STEP,UNTIL,DO。
2014编译原理期末复习 题目答案
⒈编译程序的工作过程一般可以划分为词法分析、语法分析、语义分析、中间代码生成、代码优化和代码生成等几个基本阶段,同时还伴有表格处理和出错处理。
⒉若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。
⒊编译方式与解释方式的根本区别在于是否生成目标代码。
⒋翻译程序是这样一种程序,它能将用甲种语言书写的程序转换成与其等价的乙种语言书写的程序。
⒌对编译程序而言,输入数据是源程序,输出结果是目标程序。
⒍运行编译程序的计算机称宿主机,运行编译程序所产生目标代码的计算机称目标机。
⒎当把编译程序划分成编译前端和编译后端时,前端主要由与源语言有关但与目标机无关的部分组成,编译后端包括编译程序中与目标机有关的部分,编译后端不依赖于源语言而仅仅依赖于中间语言。
⒏描述词法规则的有效工具是正规式,通常使用上下文无关文法来描述语法规则,使用属性文法描述语义规则。
⒐上下文无关文法包括以下四个组成部分:一组终结符号,一组非终结符号,一个开始符号,以及一组产生式。
⒑如果一个文法存在某个句子对应两棵不同的语法树,则这个文法是二义文法。
⒒消除文法的二义性的方法主要有:改写二义文法为非二义文法;为文法符号规定优先顺序和结合规则。
⒓自上而下语法分析中存在的主要问题是由左递归引起的无限循环问题和左公共因子引起的回溯问题。
⒕自上而下语法分析的基本思想是,对任何输入串,从文法的开始符号,即根结点出发,自上而下地为输入串建立一颗语法树。
递归下降分析器采用的是自上而下语法分析方法,非递归的预测分析器采用的是自上而下语法分析方法,LR分析器采用的是自下而上语法分析方法。
⒖预测分析器模型是由输入、输出、栈、总控程序和预测分析表组成。
⒗自下而上语法分析的基本思想是,从终结符号开始,逐步进行规约,直至规约到文法的开始符号,即从语法树的叶节点开始,步步向上规约,直到根结。
⒘LR分析器模型包括输入、输出、LR分析程序、栈和含有动作action与状态转换goto两部分的分析表。
编译原理课程设计选题
编译原理课程设计选题一、教学目标本节课的教学目标是使学生掌握编译原理的基本概念、原理和方法,培养学生运用编译原理解决实际问题的能力。
具体目标如下:1.知识目标:(1)了解编译原理的基本概念,如编译器、解释器、源程序等;(2)掌握编译过程的各个阶段,如词法分析、语法分析、语义分析、中间代码生成、目标代码生成等;(3)熟悉常见编程语言的编译原理及其特点。
2.技能目标:(1)能够使用编译器或解释器对简单程序进行编译或解释;(2)能够运用编译原理分析程序的正确性和性能问题;(3)具备编写简单的编译器或解释器的能力。
3.情感态度价值观目标:(1)培养学生对编译原理的兴趣和好奇心,激发学生主动学习的动力;(2)培养学生团队协作、沟通交流的能力,提高学生解决实际问题的能力;(3)培养学生追求真理、勇于创新的精神风貌。
二、教学内容本节课的教学内容主要包括以下几个部分:1.编译原理概述:介绍编译器、解释器、源程序等基本概念,使学生了解编译原理的应用范围和重要性。
2.编译过程及其各个阶段:详细讲解编译过程的词法分析、语法分析、语义分析、中间代码生成、目标代码生成等阶段,使学生掌握编译过程的基本方法。
3.常见编程语言的编译原理:分析C、Java、Python等常见编程语言的编译原理及其特点,使学生了解不同编程语言的编译机制。
4.编译器设计实例:以一个简单的编译器为例,讲解编译器的实现方法和技巧,让学生具备编写简单编译器的能力。
三、教学方法为了提高教学效果,本节课将采用以下教学方法:1.讲授法:教师讲解编译原理的基本概念、原理和方法,引导学生掌握知识要点。
2.案例分析法:通过分析具体编程语言的编译实例,使学生了解编译原理在实际应用中的作用。
3.实验法:安排课后实验,让学生动手编写简单的编译器或解释器,提高学生的实践能力。
4.讨论法:学生分组讨论,鼓励学生提出问题、分享心得,培养学生的团队协作和沟通能力。
四、教学资源为了支持教学内容和教学方法的实施,本节课将采用以下教学资源:1.教材:《编译原理》(作者: Alfred V. Aho et al.);2.参考书:《计算机编译原理》(作者:陈意云);3.多媒体资料:PPT课件、视频教程等;4.实验设备:计算机、编程环境等。
编译原理试题及答案
编译原理试题及答案
试题:
1. 解释编译原理的定义,同时给出编译器的作用。
2. 简要描述编译过程中的四个基本步骤。
3. 解释词法分析器的功能和作用。
4. 解释语法分析器的功能和作用。
答案:
1. 编译原理是研究如何将高级语言程序转化为等价机器语言程序的一门学科。
编译器是将高级语言文本转换成等价的机器语言的软件工具。
它负责将源代码转化为目标代码,以便计算机能够理解和执行。
2. (1) 词法分析:将源代码分解成一系列单词或标记。
(2) 语法分析:根据语法规则组织单词或标记形成语法树。
(3) 语义分析:分析语法树以检测语义错误。
(4) 代码生成:根据语法树生成目标代码。
3. 词法分析器的功能是将源代码分解成一系列单词或标记。
它将源代码读取为字符流,然后将这些字符组成单词,同时可以去除空格、注释等不具有实际意义的内容。
词法分析器的作用是为语法分析器提供正确的单词序列,为后续的语义分析和代
码生成步骤建立基础。
4. 语法分析器的功能是根据语法规则组织单词或标记形成语法树。
它通过构建语法树来分析源代码的语法结构,同时可以检测语法错误。
语法分析器的作用是为后续的语义分析和代码生成步骤提供一个结构化的表示形式,便于后续的处理和转换。
编译原理题目
编译原理题目
1. 词法分析器的设计与实现
2. 语法分析器的生成方法与工具
3. 语法制导翻译的算法与实现
4. 语法制导的代码生成技术
5. 语义分析器的设计与实现
6. 属性文法的定义和属性计算方法
7. 中间代码的生成与优化技术
8. 目标代码生成的方法与实现
9. 解释器与编译器的区别与联系
10. 正则表达式在编译原理中的应用
11. 有限自动机的概念与构建方法
12. 句法制导翻译技术在编译器中的应用
13. 语言语义的表示与验证方法
14. 静态类型检查器的设计与实现
15. 字节码与机器码的转换方法
16. 抽象语法树的构建与遍历算法
17. 参数传递的机制与实现
18. 变量作用域的嵌套与解析方法
19. 优化编译器的关键技术与算法
20. 并行编程在编译器优化中的应用。
(完整版)编译原理习题及答案(整理后)
8、规范推导是最左推导,故选 d。
9、由 T→T,…和 T→(… 得 FIRSTVT(T))={(,,)};
由 T→S 得 FIRSTVT(S)⊂FIRSTVT(T),而 FIRSTVT(S)={b,∧,(};即
FIRSTVT(T)={b,∧,(,,};
因此选 c。
10、d 11、c 12、b 13、b 14、b
标语言
第二章
一、单项选择题
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*)}
6、一个文法所有句型的集合形成该文法所能接受的语言。
五、简答题
1、句柄 2、素短语
3、语法树
4、归约
六、问答题
1、给出上下文无关文法的定义。
2、文法 G[S]:
() () () () ()
5、推导
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc (1)它是 Chomsky 哪一型文法? (2)它生成的语言是什么? 3、按指定类型,给出语言的文法。 L={aibj|j>i≥1}的上下文无关文法。 4、有文法 G:S→aAcB|Bd
a. 23 B. 42 c. 30 14、规范归约指 。
d. 17
a. 最左推导的逆过程
b. 最右推导的逆过程
2014编译原理试卷1(参考答案)
华南农业大学期末考试试卷2参考答案考试科目: 编译原理 考试时间: 120 分钟学号 姓名 年级专业一、本题共6小题,每小题5分,共30分。
1、写出下面右线性正规文法所对应的正规式。
2、给出下面语言集合的上下文无关文法。
L 1={ a n b m3、按照编译过程的5个阶段得到编译程序的逻辑结构框图如下:得分4、判断下图FA 是NFA 还是DFA ,并用正规式来描述它所识别的语言。
5、空心圆柱体的表面积计算公式如S=2*3.1416*(R+r)*(R-r)+ 2*3.1416*(R+r)*h采用LR 语法制导翻译技术生成相应的三地址代码,然后运用DAG 对其进行局部优化,试写出能生成最优目标代码的优化后的三地址代码序列。
6、有文法及其语义子程序如下:S →T { print(T.h) }T → T 1*E { T.h= T 1.h +E.h+1 } T → E { T.h=E.h } E →(T ) {E.h= T.h} E → a { E.h= 1 }采用移进归约的分析方法,当分析器的输入为(a)*(a*a) 时,画出其语法树(可以带注释、也可以不带注释),并求输出的结果。
二、构造识别下列语言的最小DFA (共20分):得分1、正规式1(0|1)*0 | 0;(7分)三.有定义算术表达式的文法如下:E → E+T | E-T | T T → T*F | T/F | F F → P ↑F | P P → (E) | i构造句型P ↑i*(E+F-T)的语法树;并指出该句型所有的短语、直接短语、素短语以及句柄。
(10分)得分语法树: (5分)四、有文法如下: (共20分)S → aBB → aDd | d D → Ab | ε A → aD | e(1)计算文法的每个非终结符的FIRST 集合和FOLLOW 集合;(5分) (2)计算文法的每个候选产生式的SELECT 集合;(5分)(3)说明文法是LL (1)文法的理由,并给出其预测分析表;(6分) (4)给出符号串aaebd 的预测分析过程(即最左推导过程)。
编译原理课程设计_算术表达式、for、while语句转换为四元式
计算机与信息学院《操作系统与编译原理联合课程设计报告》专题:编译原理部分学生姓名:学号:专业班级:指导教师:2014 年 7 月一、设计目标设计一个语法制导翻译器,将算术表达式、for语句、while语句翻译成四元式。
要求先确定一个定义算术表达式、for语句、while语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。
对用户输入的任意一个正确的表达式,程序将其转换成四元式输出。
二、设计思路开发平台:Visual C++ MFC解决这个问题的方案分为以下几个步骤:1.将算数表达式、for语句、while语句转换为四元式的第一步为对读入的表达式进行处理,即删除不必要的空格、回车、换行等,保证之后的步骤能够顺利进行。
2.分析算术表达式、for语句、while语句的文法。
3.通过词法分析判断语句中的每个字符的类型,如:数字、字母、符号等。
4.建立每种文法的LR(0)分析表,通过每个文法的LR(0)分析表对相应的表达式进行语法分析。
5.在语法分析正确的情况下,通过语法分析的中间过程的符号栈输出四元式,四元式的形式为:(op arg1 arg2 result)。
(一)算术表达式转换为四元式将算术表达式转换为四元式首先考虑了括号的问题,对于不同的算术表达式第一步进行词法分析,即确定各种符号的位置。
而括号中的式子是优先级最高的,应该最先进行处理。
我使用了一个数组记录算术表达式中括号的位置,并且定义了first_cc和first_jj函数对括号的乘除法和加减法分别进行处理。
后将括号的式子以四元式的形式输出。
通过以上转换,已将原算术表达式中的括号中的容使用大写字母’A’、’B’……等代替(其中定义声明了change函数,用来将括号部分替换为大写字母)。
新的式子中,只含有加减乘除以及赋值这四种运算,后根据优先级的不同,逐步生成四元式。
其算法流程图如右图所示。
编译原理课程设计_词法语法分析器
编译原理课程设计Course Design of Compiling(课程代码3273526)半期题目:词法和语法分析器实验学期:大三第二学期学生班级:2014级软件四班学生学号:2014112218学生姓名:何华均任课教师:丁光耀信息科学与技术学院2017.6课程设计1-C语言词法分析器1.题目C语言词法分析2.内容选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。
将解析到的单词符号对应的二元组输出到文件中保存可以将扫描缓冲区与输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了3.设计目的掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解4.设计环境(电脑语言环境)语言环境:C语言CPU:i7HQ6700内存:8G5.概要设计(单词符号表,状态转换图)5.1 词法分析器的结构词法分析程序的功能:输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词.为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1) ch 存放最新读进的源程序字符2) strToken 存放构成单词符号的字符串3) Buffer 字符缓冲区4)struct keyType 存放保留字的符号和种别5.3 状态转换图6.详细设计(数据结构,子程序)算法思想:首先设置3个变量:①strToken用来存放构成单词符号的字符串;②ch 用来字符;③struct keyType用来存放单词符号的种别码。
扫描子程序主要部分流程如下图所示。
7.程序清单// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//#include"stdafx.h"#include"stdio.h"#include"stdlib.h"#include"conio.h"#include"string.h"#define N 47char ch;char strToken[20];//存放构成单词符号的字符串char buffer[1024]; //字符缓冲区struct keyType {char keyname[256];int value;}Key[N] = { { "$ID",0 },{ "$INT",1 },{ "auto",2 },{ "break",3 },{ "case",4 }, { "char",5 },{ "const",6 },{ "continue",7 },{ "default",8 },{ "do",9 }, { "double",10 },{ "else",11 },{ "enum",12 },{ "extern",13 },{ "float",14 }, { "for",15 },{ "goto",16 },{ "if",17 },{ "int",18 },{ "long",19 },{ "register",20 }, { "return",21 },{ "short",22 },{ "signed",23 },{ "sizeof",24 },{ "static",25 }, { "struct",26 },{ "switch",27 },{ "typedef",28 },{ "union",29 },{ "unsigned",30 }, { "void",31 },{ "volatile",32 },{ "while",33 },{ "=",34 },{ "+",35 },{ "-",36 },{ "*",37 }, { "/",38 },{ "%",39 },{ ",",40 },{ ";",41 },{ "(",42 },{ ")",43 },{ "?",44 },{ "clear", 45 },{ "#",46 } };void GetChar() //读一个字符到ch中{int i;if (strlen(buffer)>0) {ch = buffer[0];for (i = 0; i<256; i++)buffer[i] = buffer[i + 1];}elsech = '\0';}void GetBC()//读一个非空白字符到ch中{int i;while (strlen(buffer)) {i = 0;ch = buffer[i];for (; i<256; i++) buffer[i] = buffer[i + 1];if (ch != ' '&&ch != '\n'&&ch != '\0') break;}}void ConCat()//把ch连接到strToken之后{char temp[2];temp[0] = ch;temp[1] = '\0';strcat(strToken, temp);}bool Letter()//判断ch是否为字母{if (ch >= 'A'&&ch <= 'Z' || ch >= 'a'&&ch <= 'z')return true;elsereturn false;}bool Digit()//判断ch是否为数字{if (ch >= '0'&&ch <= '9')return true;elsereturn false;}int Reserve()//用strToken中的字符查找保留字表,并返回保留字种别码,若返回0,则非保留字{int i;for (i = 0; i<N; i++)if (strcmp(strToken, Key[i].keyname) == 0)return Key[i].value;return 0;}void Retract()//把ch中的字符回送到缓冲区{int i;if (ch != '\0') {buffer[256] = '\0';for (i = 255; i>0; i--)buffer[i] = buffer[i - 1];buffer[0] = ch;}ch = '\0';}keyType ReturnWord(){strcpy(strToken, "\0");int c;keyType tempkey;GetBC();if (ch >= 'A'&&ch <= 'Z' || ch >= 'a'&&ch <= 'z') { ConCat();GetChar();while (Letter() || Digit()) {ConCat();GetChar();}Retract();c = Reserve();strcpy(tempkey.keyname, strToken);if (c == 0)tempkey.value = 0;elsetempkey.value = Key[c].value;}else if (ch >= '0'&&ch <= '9') {ConCat();GetChar();while (Digit()) {ConCat();GetChar();}Retract();strcpy(tempkey.keyname, strToken);tempkey.value = 1;}else {ConCat();strcpy(tempkey.keyname, strToken);tempkey.value = Reserve();}return tempkey;}/*主函数*/int main() {//文件操作FILE *fp;if ((fp = fopen("E:\\作业\\编译原理\\Ccode.txt", "r")) == NULL) { printf("cannot open file/n"); exit(1);}while (!feof(fp)) {if (fgets(buffer, 250, fp) != NULL){printf("E:\\作业\\编译原理\\Ccode.txt\n");}}keyType temp;printf("单词\t种别号\n");while (strlen(buffer)) {temp = ReturnWord();printf("%s\t %d\n\n", temp.keyname, temp.value);}printf("the end!\n");getch();return 0;}8.运行结果E:/作业/编译原理/Code.txt运行结果九、 实验体会通过本次次法分析设计实验,我加深了对词法分析过程的理解。
编译原理课程设计-简单计算器实现
课程设计报告课程:编译原理学号:姓名:班级:11级嵌入式应用技术班教师:时间:2014年6月计算机科学与技术系输入一个简单运算表达式A=当前输入符号A是运算符吗?根据运算符的特点从栈顶部取出若干个运算对象进行该运算,将运果入栈将该字符入栈A=‘\0’程序结束是否是否图二表达式结果计算流程图结果与分析(可以加页):图三实现计算器加法功能图四实现计算器减法功能图五实现计算器乘法功能图六实现计算器除法功能图七实验计算器混合运算功能源代码:#include〈stdio。
h> #include<stdlib.h〉#define MaxSize 99void translate(char str[],char exp[]){struct{char data[MaxSize];int top;}op;char ch;int i = 0,t = 0;op.top = -1;ch = str[i];i++;while(ch != ’\0’){switch(ch){case ’(':op.top++;op。
data[op.top]=ch;break;case ’)':while(op.data[op.top]!= ’('){exp[t]=op.data[op.top];op。
top--;t++;}op.top-—;break;case ’+’:case '—’:while(op.top != -1&&op。
data[op。
top] != '(’){exp[t]= op.data[op.top];op。
top——;t++;}op。
top++;op。
data[op。
top] = ch;break;case '*’:case ’/’:while(op。
data[op。
top] == ’/'||op.data[op。
top] == '*'){exp[t] = op.data[op.top];op。
华东交大-编译原理2013-2014试卷汇总
二、单项选择填空题(对下列各题,请在答题卡上对应的小题1.在编译程序的八大功能模块中,下面的哪个模块是可有可无:A.语法分析; B.语义分析; C.代码优化; D.词法分析2.在下面的四类文法中,哪类文法的描述能力最弱:A.短语文法; B.上下文有关; C.上下文无关; D.正规文法3.在语法分析方法中,递归下降分析法属于下面的哪种分析方法:A.自顶向下; B.自右向左; C.自左向右; D.自底向上4.给定文法 G[E]:E→E0E│11 ,下面的符号串中,是该文法的句子: A.110; B.11011011; C.100; D.1100115.在语法分析中,如果使用的是规范归约技术,则每次被归约的子串都是:A.活前缀; B.素短语; C.句柄; D.句型6.语句x:=(a-b)*c+d/e的等价逆波兰表达式为:A.x:=ab-c*de/+ ; B.xabcde-*/+:= ;C.xab-c*de/+:= ; D.abc-*de/+x:=7.在下面的四种LR分析方法中,分析能力最强的是:A.LR(0); B.LALR(1); C.SLR(1); D.LR(1)8.LL(1)文法和LR(0)文法都有一个共同的特性:A.自右向左; B.无二义性; C.自顶向下; D.自底向上9.一个LR(0) 项目为 A→aB.c ,其中a、c∈V T,A、B∈V N,该项目是:A.归约项目; B.接收项目; C.移进项目; D.待约项目10.文法G[s]: S → 1A│1 , A → 1A│0A│1│0,所描述的语言为:A.0(0∣1)*; B.(1∣0)*1 ; C.(0∣1)*0 ; D.1(1∣0)*三、给定文法G[E]:E→E+T | T ,T→T*F | F ,F→(E) | a 中的一个句型:F*a+(E) ,请完成以下工作:(共计15分)1. 画出该句型对应的语法树;(6分)2. 找出该句型中的全部短语;(5分)3. 找出该句型中的句柄和最左素短语。
编译原理课程设计报告-简单文法的编译器的设计与实现
提供全套毕业论文,各专业都有课程设计报告设计题目:简单文法的编译器的设计与实现班级:计算机1206组长学号:20123966组长姓名:指导教师:设计时间:2014年12月摘要编译原理是计算机科学与技术专业一门重要的专业课, 它具有很强的理论性与实践性,目的是系统地向学生介绍编译系统的结构、工作原理以及编译程序各组成部分的设计原理和实现技术,在计算机本科教学中占有十分重要的地位。
计算机语言之所以能由单一的机器语言发展到现今的数千种高级语言,就是因为有了编译技术。
编译技术是计算机科学中发展得最迅速、最成熟的一个分支,它集中体现了计算机发展的成果与精华。
本课设是词法分析、语法分析、语义分析的综合,外加上扩展任务中间代码的优化和目标代码的生成,主要是锻炼学生的逻辑思维能力,进一步理解编译原理的方法和步骤。
关键词:编译原理,前端,目标代码,后端目录摘要 (3)1. 概述 (6)2. 课程设计任务及要求 (8)2.1 设计任务 (8)2.2 设计要求 (9)3. 算法及数据结构 (10)3.1算法的总体思想 (10)3.2 词法分析器模块 (11)3.2.1 功能 (11)3.2.2 数据结构 (11)3.2.3 算法 (12)3.3 语法分析器模块 (13)3.3.1功能 (13)3.3.2 数据结构 (13)3.3.3算法 (14)3.4 中间代码产生器模块 (24)3.4.1 功能 (24)3.4.2 数据结构 (24)3.4.3 算法 (25)3.5 优化器模块 (27)3.5.1 功能 (27)3.5.2 数据结构 (27)3.5.3 算法 (28)3.6 目标代码生成器模块 (30)3.6.1功能 (30)3.6.2 数据结构 (30)3.6.3 算法 (31)4. 程序设计与实现 (32)4.1 程序流程图 (32)4.2 程序说明 (33)4.3 实验结果 (35)5. 结论 (42)6. 参考文献 (43)7. 收获、体会和建议 (44)1 概述在计算机上执行一个高级语言程序一般要分为两步;第一步,用一个编译程序把高级语言翻译成机器语言程序;第二步,运行所得的机器语言程序求得计算结果。
编译原理课程设计报告-词法分析器
一.课程设计题目:词法分析器的实现二.课程设计成员三.课程设计内容和要求设计一个程序,调试、编译,实现词法分析的功能,识别各单词或字符所属类别,并显示在屏幕上。
词法分析器:逐个读入源程序字符并按照构词规则切分成一系列单词。
单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。
词法分析是编译过程中的一个阶段,在语法分析前进行。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
要求:通过词法分析器能够实现以下五种类型如单词等的识别。
(1)关键字"begin","end","if","then","else","while","write","r ead"等,"do", "call","const","char","until","procedure","repeat"等(2)运算符:"+","-","*","/","="等(3)界符:"{","}","[","]",";",",",".","(",")",":"等(4)标识符(5)常量四.操作要求首先建立一个或多个文档,此处新建了两个文档,例:07196133.txt文本文档和zhaoxiaodong.txt文本文档,以供选择,各文本文档中都输入有不同的内容,运行程序,出现提示,输入文本文档的名称,即可对文本文档中的内容进行分析,并把分析结果输出显示在屏幕上。
编译原理---课程设计题目(2014)
编译原理课程设计一、课程设计的基本要求和方法(一)、目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识,熟悉使用开发工具VC /JA VA/C#/.NET 。
(二)、课程设计步骤1、问题理解和分析充分地分析和理解问题本身,弄清要求做什么。
2、确定解决问题的方法(设计)主要是找到解决问题的主要思路,是怎么做。
在此阶段可考虑系统的功能和模块划分等。
3、详细设计和编码确定算法的主要流程,再进行编程。
在此阶段应提醒学生程序可先在纸上写,尽量想清楚了再动手上机,在编程过程中注意程序结构的清晰性,避免出现很多明显的程序逻辑错误和语法错误,提高后面程序调试效率。
4、程序调试和运行使学生掌握程序调试和排错的基本方法,增加编程的感觉和解决问题的成就感。
5、完成课程设计报告(使用华东交通大学课程设计报告,需学生自己购买)1)问题描述题目要解决的问题是什么2)分析、设计、实现解决问题的基本方法说明,包括主要算法思想,算法的流程图。
程序中主要函数或过程的功能说明。
3)运行结果分析。
4)总结遇到的主要问题是如何解决的、对设计和编码的回顾讨论和分析、进一步改进设想、经验和体会等。
5)附录,包括源程序关键代码和运行结果。
(三)、考核评估通过程序实现、总结报告和学习态度综合考评,并结合学生的动手能力,独立分析解决问题的能力和创新精神。
成绩分优、良、中、及格和不及格五等。
考核标准包括:(1)编译器思想的正确性,包括是否采用了合适的数据存储结构等。
(2)程序实现的正确性,包括程序整体结构是否合理、编程风格是否规范等。
(3)程序功能的完善程度,包括功能的基本实现、基本完善、完全实现(4)学生的工作态度、独立工作能力。
(5)课程设计报告。
以上五项考核内容,每项占的权重均为20% 。
2014编译原理
编译原理课程设计要求:1.设计一个简单的编译器,可以任意选择下面的形式:✓根据上课时给定的样本语言,设计该语言的编译器。
(需要编写词法分析程序、语法制导翻译程序)。
✓创建并实现自己定义的一个小型语言,可以涉及其他的应用领域,例如矩阵运算、矢量运算、股票预测、游戏、计算机图形学、音乐合成等。
可以使用能生成编译器组件的工具,例如LEX、YACC等。
✓学习并实现其它已经设计好的编译器,例如PL(0)语言编译器。
2.编译器一般结构:词法分析程序、语法制导翻译程序。
3.编译器实现的基本功能:词法分析、语法分析、语义分析与中间代码生成。
4.语法分析可以采用自顶向下的递归下降子程序方法,也可以采用自底向上的SLR(1)分析法。
注意对文法的改造。
5.允许分组合作,最多3人一组,注意工作量分工。
(1~3人一组,视工作量多少而定)6.严禁编译原理课程设计报告的内容与所做的不一致。
答辩:用PPT的方式,并运行实验结果。
注释:第三周下午(周二或周四)提交程序、上交打印版实验报告。
编译原理课程设计报告基本内容及要求1.题目2.实现的功能3.编译过程各阶段的关键问题及其解决的方法例如哪些是要解决的关键问题,如何解决的。
4.算法例如,程序流程图、状态转换图、数据结构设计、文法定义、文法改造、翻译方案设计。
5.总结(谈实践的体会等)6.调式的实例给出测试的程序,有正确和错误两种,以及测试结果。
7.程序代码.8.实验报告写出书面的,实验代码及可执行文件提交到网上学习中心中。
(提交程序截止日期:第三周周四)(检查程序运行:第三周周二下午,第三周周四下午)。
广工2014编译原理课程设计报告参考模板
课程设计课程名称编译原理题目名称PL/0编译器的扩充学生学院计算机学院专业班级计算机科学与技术12(4)学号3112005901学生姓名柏石先指导教师李杨程序功能完成情况测试用例全面程度学生对所编程序熟悉程度报告格式是否与要求相符报告内容是否准确、全面2014 年12 月28日一、实验目的与要求基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:*= 和 /=(2)扩充语句(Pascal的FOR语句):FOR <变量>:=<表达式>STEP<表达式> UNTIL<表达式>Do<语句>选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加类型:①字符类型;②实数类型。
(2)增加注释; 注释由/*和*/包含;(3)扩充函数:①有返回值和返回语句;②有参数函数。
(4)增加一维数组类型(可增加指令)。
(5)其他典型语言设施。
二、实验环境与工具1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解析执行系统,后缀名为.PL0;2、目标语言:生成文件后缀为*.COD的目标代码3、实现平台:Borland C++Builder 64、运行平台:Windows 8.1三、设计概述1、结构设计说明(1)PL/0编译系统的结构框架源语言:源语言是基于C语言写的PL/0编译程序——PL0语言(可以看成Pascal 语言的子集)目标语言:假想的栈式计算机计算语言,即类PCODE指令代码。
指令格式如下:其中f代表功能码,l表示层次差,a的含意对不同的指令有所区别。
具体的指令功能表:(一)扩充赋值运算:*= 和/=需要增加2个运算符*= 和/=,用下面表格定义的SYM代替运算符*= /=SYM表示TIMESBECOMES SLASHBECOMES *= 和/=的语法描述图:(二)扩充语句(Pascal的FOR语句)因为在Pascal中的FOR语句描述为:FOR <变量>:=<表达式> STEP <表达式> UNTIL <表达式> DO <语句>所以增加FOR,STEP,UNTIL,DOFOR语句语法描述图为:1)增加所需要的保留字和运算符,实现*=和/=,以及FOR语句,应该增加TIMESBECOMES,SLASHBECOMES,FOR,STEP,UNTIL,DO。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》课程设计题目
设计题一:正规式r与正规文法G相互转换的程序设计
任意给定一个正规式,求出其对应的正规文法;任意给定一个正规文法,求出其对应的正规式。
(参考教材P53~55)
设计题二:布尔表达式的递归下降翻译器
针对布尔表达式的文法:
〈布尔表达式〉∷=〈布尔项〉{〈与运算符〉〈布尔项〉}
〈与运算符〉∷=and
〈布尔项〉∷=〈布尔因子〉{〈或运算符〉〈布尔因子〉}
〈或运算符〉∷=or
〈布尔因子〉∷=〈非运算符〉〈布尔因子〉|〈布尔量〉
〈非运算符〉∷=not
〈布尔量〉∷=(〈布尔表达式〉)|〈标识符〉〈关系运算符〉〈标识符〉|
true|false
〈关系运算符〉∷=>|<|≥|≤|=|≠
〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}
利用递归下降分析法编制、调试其语法及语义分析程序,生成的中间代码为逆波兰式。
编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(参考教材P92~93)
设计题三:正规式r与有穷自动机FA相互转换的程序设计
任意给定一个正规式,求出其对应的有穷自动机;任意给定一个有穷自动机,求出其对应的正规式。
(参考教材P61~64)
设计题四:赋值语句的LR翻译程序
对教材P180中的赋值语句文法,给出该文法的属性文法,同时实现赋值语句的翻译,生成的中间代码为逆波兰式。
(参考教材P179~181)
设计题五:正规文法G与有穷自动机FA相互转换的程序设计
任意给定一个正规文法,求出其对应的有穷自动机;任意给定一个有穷自
动机,求出其对应的正规文法。
(参考教材P65~66)
设计题六:条件语句的LR翻译程序
对教材P187中的条件语句文法,给出该文法的属性文法,同时实现条件语句的翻译,生成的中间代码为四元式。
(参考教材P186~189)
设计题七:NFA确定化为DFA及化简的程序设计
任意给定一个NFA,将其确定化为DFA,然后化简为最小的DFA。
(参考教材P57~61)
设计题八:布尔表达式的LR翻译器
针对布尔表达式的文法:
B →B and T | T
T→T or F | F
F→not F|true|false |(B)| i rop i
利用LR分析法编制、调试其语法及语义分析程序,生成的中间代码为四元式。
编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(参考教材P181~182)
设计题九:生成预测分析表的算法实现
任意给定一个LL(1)文法,生成相应的LL(1)分析表。
(参考教材P75第5章)
设计题十:while循环语句的LR翻译程序
对教材P187中的循环语句文法,给出该文法的属性文法,同时实现循环语句的翻译,生成的中间代码为四元式。
(参考教材P186~189)
设计题十一:利用LEX自动生成词法分析程序
输入描述某种语言词法规则的正规式,利用LEX自动生成词法分析程序。
(参考教材P66~68)
设计题十二:生成LR分析表的算法实现
任意给定一个LR文法,生成相应的LR分析表。
(参考教材P123第7章)
设计题十三:布尔表达式翻译为逆波兰式的算法实现
针对布尔表达式的二义性文法:
B → B and B | B or B | not B | ( B ) | true|false| i rop i
将文法拓广为G’[B’]:
(0) B’ → B
(1) B → B and B
(2) B → B or B
(3) B → not B
(4) B → ( B )
(5) B → true
(6) B → false
(7) B → i rop i
利用LR分析法编制、调试其语法及语义分析程序,生成的中间代码为逆波兰式。
编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
设计题十四:求解FIRST集和FOLLOW集的算法实现
任意给定一个上下文无关文法,求其所有的非终结符的FIRST集和FOLLOW集。
(参考教材P80~83)
设计题十五: f or循环语句的翻译程序
对教材P191中的循环语句文法,给出该文法的属性文法,同时实现循环语句的翻译,生成的中间代码为四元式。
(参考教材P191~192)
设计题十六:简单说明语句的翻译程序
对教材P196中的简单说明语句文法,给出该文法的属性文法,同时实现简单说明语句的翻译,即建立一个符号表,将简单说明语句所引入的名字id 和性质登录在符号表中。
(参考教材P96~197)
设计题十七:基于LR分析法的计算器
对教材P171中的算术表达式文法,给出该文法的属性文法,同时实现算术表达式的计算,给出算术表达式的计值过程。
(参考教材P171,P173~174)设计题十八:预测分析程序的设计
对教材P94中的上下文无关文法,实现它的预测分析程序,给出符号串i+i*i的分析过程。
(参考教材P93~96)
或者:(选同一题的做下面一个)
对教材P96中的上下文无关文法,实现它的预测分析程序,给出符号串aaabd的分析过程。
(参考教材P96~97)
设计题十九: do-while循环语句的翻译程序
对C语言中的do-while循环语句文法,给出该文法的属性文法,同时实
现循环语句的翻译,生成的中间代码为四元式。
(参考while循环语句的翻译,教材P186~189)
设计题二十:构造识别规范句型活前缀DFA的程序设计
对教材P160中的上下文无关文法,构造它的构造识别规范句型活前缀DFA。
(参考教材P124~137,P160~161)
或者:(选同一题的做下面一个)
对教材P162中的上下文无关文法,构造它的构造识别规范句型活前缀DFA。
(参考教材P124~137,P162~163)
设计题二十一:算符优先分析程序的设计
对教材P110中的上下文无关文法,实现它的算符优先分析程序,给出符号串i+i*i的分析过程。
(参考教材P110~117)
设计题二十二:利用Y ACC自动生成语法分析程序
输入描述某种语言语法规则的LALR(1)文法,利用YACC自动生成语法分析程序。
(参考教材P147~153,P155~160)
设计题二十三:赋值语句的LR翻译程序
对教材P180中的赋值语句文法,给出该文法的属性文法,同时实现赋值语句的翻译,生成的中间代码为四元式。
(参考教材P179~181)
设计题二十四:简单优先分析程序的设计
对教材P104中的上下文无关文法,实现它的简单优先分析程序,给出符号串b(aa)b的分析过程。
(参考教材P103~106)
设计题二十五: DAG优化过程的图形化设计
给出一系列四元式,用图形显示DAG的优化过程。
(参考教材P251~257)设计题二十六:PL/0编译程序的实现
对教材P13第二章中的讨论的PL/0编译程序,给出其程序实现,调试成功。
(参考教材P13第二章,P413附录A)。