文档库 最新最全的文档下载
当前位置:文档库 › 编译原理期末复习

编译原理期末复习

编译原理期末复习
编译原理期末复习

编译原理期末复习鉴于编译原理马上就要期末考试,我将手中集中的一些资料上的题目进行了整理归类,每种类型题目给出了所涉及到的基本知识,然后对每类题目中的第一道例题进行了做法进行了讲解,剩下的例题请给大家作为练习,答案也都给出,希望对大家复习有所帮助,最后由于时间很紧,整理的有些仓促,整理中难免有遗漏或错误,请大家见谅。

注:下面出现的字母中,若无特别说明,小写英文字母为终结符,大写英文字母为非终结符,希腊字母为终结符与非终结符的任意组合。

1、简答题(或者名词解释)

下面涉及到的概念中,加下划线的都是在以往一些试卷中出现的原题,务必掌握。

注:这类题目老师说答案不会超过一百个字,否则写的再多也不给分,有些点到即可,不要重复啰嗦。

(1)简述编译程序的概念及其构成

答:1)编译程序:它特指把某种高级程序设计语言翻译成等价的低级程序设计语言的翻译程序。

2)构成:

(2)简述词法分析阶段的主要任务(也有可能问语法分析阶段主要任务)

答:词法分析的任务是输入源程序,对源程序进行扫描,识别其中的单词符号,把字符串形式的源程序转换成单词符号形式的源程序。

语法分析的主要任务是对输入的单词符号进行语法分析(根据语法规则进行推导或者归约),识别各类语法单位,判断输入是不是语法上正确的程序

(3) 简述编译程序的构造过程(这个大家看看,是对(1)和(2)的综合)答:1)构造词法分析器:用于输入源程序进行词法分析,输出单词符号;

2)构造语法分析器:对输入的单词符号进行语法分析,识别各类语法单位,判断输入是不是语法上正确的程序

3)构造语义分析和中间代码产生器:按照语义规则对已归约出的语法单位进行语义分析并把它们翻译成中间代码。

4)构造优化器:对中间代码进行优化。

5) 构造目标代码生成器:把中间的代码翻译成目标程序。

6) 构造表格管理程序:登记源程序的各类信息和编译各阶段的进展情况。

7)构造错误处理程序:对出错进行处理。

(4) 说明编译和解释的区别:

1)编译要程序产生目标程序,解释程序是边解释边执行,不产生目标程序;

2)编译程序运行效率高而解释程序便于人机对话。

(5)文法:描述语言语法结构的形式规则,一般用一个四元式表示: G=(V

T

V

N ,S,P),其中V

T

:终结符集合(非空) V

N

:非终结符集合(非空),且V

T

V

N

= S:

文法的开始符号,SV

N

P:产生式集合(有限)。

(6)二义性文法:一个文法中存某个句子,它有两个不同的最左(或者最右推导),则称该文法是二义性的。

例子如文法G :S →if expr then S |other

S →if expr then S else S 句子if e1 then if e2 then s1

else s2是二义性的。

(7)文法的形式(注:文法的形式一定要牢记,特别是2型和3型文法一定要牢记,不仅在概念题中有用,在下面的根据语言写文法题中也有重要作用,如果所写的文法形式不对,一切都是无用功……)

1)0型文法(短语文法,图灵机):产生式形式为: ,其中: (V T V N )*

且至少含有一个非终结符; (V T V N )*

2)1型(上下文有关文法,线性界限自动机):产生式形式为: 其中:|| ||,仅 S 例外但是S 不得出现在任何产生式右部。

3)2型文法(上下文无关文法,非确定下推自动机):产生式形式为:P , PV N , (V T V N )* 。

4)3型文法(正规文法,有限自动机):右线性文法:产生式形如:A B 或 A 其中: V T *;A ,BV N 左线性文法:产生式形如:A B 或 A 其中: V T *;A ,BV N 例题:设G=(V T ,V N ,S ,P)是一个上下文无关文法,产生集合P 中的任一个产生式应具有什么样的形式若G 是1型文法呢若G 是正则文法呢 上下文无关文法, 产生式形式为:P , PV N , (V T V N )* 。 1型文法:产生式形式为: 其中:|| ||,仅 S 例外。

正则文法:右线性文法:产生式形如:A B 或 A 其中: V T *;A ,BV N

左线性文法:产生式形如:A B 或 A 其中: V T *;A ,BV N (8)什么是PDA(下推自动机)

答:PDA 是下推自动机,PDA M 用一个七元组表示(K,Σ,f,H,h0,S,Z)

K: 有穷状态集:输入字母表(有穷) H:下推栈符号的有穷字母表

h0 :H中的初始符号 f: K (Σ{}) H –> K H* S:属于K是初始状态。Z:包含于K,是终结状态集合。

(9) 什么是DFA(有穷状态自动机)

, F),其中:

自动机M是一个五元式M=(S, , f, S

1)S: 有穷状态集, 2):输入字母表(有穷),

3) f: 状态转换函数,为SS的单值部分映射,f(s,a)=s’表示:当现行状态为s,输入字符为a时,将状态转换到下一状态s’。我们把s’称为s

的一个后继状态。

S是唯一的一个初态; 5) FS :终态集(可空)。

4) S

(10)推导:所谓推导就是对于一个含非终结符A的符号串,利用规则A→α,把A替换成α得到新符号串的过程。

最左推导:在推导的每一步,选择符号串最左边的非终结符进行替换。

最右推导:在推导的每一步,选择符号串最右边的非终结符进行替换。

(11)归约:归约是推倒的逆过程,即用产生式的左部非终结符替换右部符号串。

(12)什么是句型什么称为句子什么是语言

句型:从文法的起始符号出发,经过有限步的推导能够推导出来的符号称为句子。

句子:只由终结符构成的句型称为句子。

语言:所有句子的集合构成该文法描述的语言。

(13)什么是短语什么是直接短语(也称为简单短语)什么是句柄什么是素短语什么是最左素短语(以下几个概念一定要理解,考试中肯定会考哪些是短语,直接短语,句柄等,具体方法请参见后面的)

短语:如果存在某个文法非终结符P,满足S

*

?βPγ,并且P+?α则称α为句型β

αγ相对于非终结符P的短语。

直接短语:如果Pα,即从P出发一步推出α,则α称为直接短语。

句柄:一个句型的最左直接短语称为该句型的句柄。

素短语:至少含有一个终结符的短语,并且除了自身外,不包含更小的素短语。最左素短语:句型中最左边的素短语。

(14)自顶向下的语法分析方法中需要解决的主要问题什么如何表示

答:1)主要需要解决回溯和左递归问题。

2)表示方式,回溯:文法中存在形如A→α

1|α

2

|…|α

n

,即产生式右部存在

多个候选,导致推导时不能确定到底应该选择哪个候选式。

左递归:文法中存在形如P→Pα的形式,推导时会导致推导过程无休止的进行下去。

注:解决方法,对回溯采取的是提取左公因子,对左递归使消除左递归(包括直接左递归和间接左递归)。

(15)内情向量:一般编译程序对数组说明的处理是把数组的有关信息汇集在一个叫做“内情向量”或“信息向量”的表格中,以便以后计算数组元素的地址时引用这些信息。每个数组有一个内情向量。其中的信息包括,数组的类型,维数,各维的上、下界,以及数组的首地址。

(16) C语言的活动记录:

SP TOP

2、最左最右推导,画语法树,找短语、直接短语、句柄等。

这种题目很简单,送分题,一定不能丢分!

考题:1)文法G[S]为:S→SdT | T T→T

分析:(1)推导和画语法树这些都很简单,不再赘述。

(2)根据所画出的语法树,可以很快的找出短语,直接短语,句柄和最左素短语等,先讲一个简单子树的概念,所谓简单子树是指仅具有单层分支的子树。

具体方法如下:

短语:任一子树的树叶全体(具有共同祖先的叶节点符号串)皆为短语;

直接短语:任一简单子树的树叶全体(具有共同父亲的叶节点符号串)皆为简单短语;

句柄:最左边的直接短语;

素短语:至少含有一个终结符的短语,并且除了自身外,不包含更小的素短语。

最左素短语:最左边的素短语。

答:(1)S T T

语法树:

(2)短语:G,SdG, (SdG), a, (SdG)

注:还有一份试卷将句型改为adT<(S),与这个类似,大家自己做做,答案是短语:a,(S),T<(S),adT<(S) 直接短语:a,(S) 句柄:a 最左素短语:SdG

下面两道例题大家看看,一定要会找短语,直接短语,句柄等.

考题:2)文法G[E]的产生式为E→E+T|T T→T*F|F F→i|(E)

①对于句型(i+i)*i,给出最左最右推导及相应的推导树

②列出句型的所有短语、简单短语。(还有一份试卷上是出句型F+T*F的所有短语、简单短语和句柄,大家自己做做)

答:(1)最左推导:E TT*FF*F(E)*F(E+T)*F(T+T)*F(F+T)*F(i+T)*F

(i+F)*F(i+i)*F(i+i)*i

最右推导ETT*FT*iF*i(E)*i(E+T)*i(E+F)*i(E+i)*i(T+i)*i

(F+i)*i(i+i)*i

推导树如下:

(2)短语;i,i+i,(i+i),(i+i)*i 直接短语:i 句柄:i

3、根据语言推文法

这类题目首先要看清题目,指定的是什么文法,一般都是2型(上下无关文法)或者3型(正规文法),这两类文法形式一定要记住,具体请参见第2页的文法分类。

掌握几个基本形式{a n| n>0}对应文法S→aS| a 如果是n>=0则为S→a S|ε(ε是空字)

{a n b n | n>0}对应文法S→aSb| ab

下面这四道题目老是在试卷中重复出现,所以大家好好看看。

考题

这是书P36 第11题的答案如下:大家作为练习,可以发现比上述题目简单的多了。

或者 G4:

4、词法分析—

——正规式、NFA

和DFA 之间的转化:

(1)这类题目一般是三者之间的转换,正规式→

NFA →确定化的

DFA →最小化的DFA ,有时已经给出NFA 了,则只需要确定化为DFA 和最小化就行了,一般每一步都是五分。具体怎么转换请参照我期中考试时整理的提纲,主要就是下面这幅关系对照图,因时间和篇幅限制不再追溯。 (2)注意优先级关系,闭包运算*最高,连接运算.次之,或运算|最低。 (3)考题1:

1)构造正则式a*b|(ab)*b 对应的DFA 。(15分) ①画出NFA ②确定化DFA

G1: S →AC

G2: S →AB

G3: S →AB A →aAb|ε

G4: S →1S0|A

注:C 和E 是终态 ③最小化DFA

首先将集合分为{A,B,D,F,G},{C,E}。{A,B,D,G}都有a,b 作为条件输出,F 只有b 输出,所以分为{A,B,D,G}和{F} 同理{C,E}分为{C},{E}。{A,B,D}a ={B,D} {G}a ={F}所以{A,B,D,G}分为{A,B,D}和{G}。{A}b ={C} {B,D}a ={D}所以分为{A} {B,D} 综上所述:划分的结果为{A},{B,D},{C},{E},{G}.

考题2: 将NFA 确定化为DFA(10分) NFA:

含有Y 的状态子集为DFA 的终态,

题目中要求是确定化,没有要求最小化,如若最小化,划分的集合为{S,A},{B,C} {F},{D},{E}然后再画出最小化后的DFA 这里不再赘述。 考题3:构造奇数个0和奇数个1组成的自动机。(10分)

状态1:偶数个0 偶数个1 状态2:奇数个0偶数个1 状态3:奇数个0 奇数个1 状态4:偶数个0奇数个1

如果题目改成偶数个0,奇数个1,只要将状态4转换成终态即可,其他类似。

5、语法分析——自顶向下分析法(LL (1)分析法和递归向下构造子程序法)

注:自顶向下分析法本质是由开始符号,按照产生式逐步推导看能否产生需要分析的句子。

(1)自顶向下分析中存在的问题

左递归和回溯(具体请参见简答题中的第(14)题) (2)消除回溯——提取公因子法

提取公共左因子:假定关于A 的规则 A→ 1 | 2 | …| n | 1 | 2 | … | m (其中,每个 不以开头) 那么,可以把这些规则改写成A→A | 1 | 2 | … | m

A→ 1 | 2 | … | n

(3)消除左递归

1)消除直接左递归:直接消除见诸于产生式中的左递归:假定关于非终结符P 的规则为P→P | ,其中不以P 开头。 我们可以把P 的规则等价地改写为如下的非直接左递归形式:P→P P→P|

注:一般而言,假定P 关于的全部产生式是P→P 1 | P 2 | … | P m | 1 | 2|…|n 其中,每个都不等于,每个都不以P 开头 那么,消除P 的直接左递归性就是把这些规则改写成: P→1P | 2P | … | n P P→1P | 2P |… | m P | 例:文法G(E):

E→E +T | T T→T*F | F F→(E) | i 经消去直接左递归后变成:

E→TE E→+TE | T→FT T →*FT | F→(E) | i

2)消除间接左递归

这个请参见我期中整理的提纲篇幅较多,这里不再重复赘述,请参照下面的考题2。

考题1:将文法G[S]改写为等价的G’[S],使得G’[S]不含左递归和左公因子。

S→[A A→B]|AS B→aB|a

答:消除左递归和左公因子后的文法为:

S→[A A→ B]A’A’ → S A’| B→aB’B’ →B|

考题2:写出文法G[A]: A→Ba|Cb|c B→dA|Ae|f C→Bg|h消除左递归后的文法。

答:(1)经分析发现文法G[A]并无直接左递归;

(2)消除间接左递归:将A,B,C按照B,C,A排序(建议将A放在最后)由于出

现C→Bg形式,将B代入C得:C→dAg|Aeg|fg|h又由于A出现A→Ba A→Cb 将B,C带入A得到:A→dAa|Aea|fa|dAgb|Aegb|fgb|hb|c等价于A→Aea|Aegb |dAa|fa|dAgb |fgb|hb|c

将A消除直接左递归A→dAaA’|fa A’|dAgb A’ |fgb A’|hb A’|c A’A’→ea A’| egb A’|

此时,对于B→dA|Ae|f,C→dAg|Aeg|fg|h由于未在任何产生式的右部出现,所以是多余的。

综上所述:消除递归后的文法为:A→dAaA’|fa A’|dAgb A’ |fgb A’|hb A’|c A’

A’→ea A’| egb A’|

(4)LL(1)分析法

1)含义:LL(1)分析方法(也叫预测分析法):是指从左到右扫描、最左推导(LL)和只查看一个当前符号(括号中的 1)。

2)判断一个文法是否是LL(1)文法的充要条件:

1. 文法不含左递归,

2. 对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。即,若

A→ 1| 2|…| n则FIRST( i)∩FIRST( j)=(ij)

3. 对文法中的每个非终结符A,若它存在某个候选首符集包含,则FIRST(

i

)∩FOLLOW(A)= i=1,2,...,n如果一个文法G满足以上条件,则称该文法G为LL(1)文法。

(5)LL(1)文法分析表的构造与运用

这类题目,主要就是判断文法是否满足LL(1)文法的三个充要条件,分为以下几步:1)首先将文法分解,判断是否有左递归好,有的话肯定不是LL(1)文法;

2)算非终结符的First集合和Follow集合,具体方法请参见期中考试的提纲,

其实最本质的要抓住first集合是U

*

a…,Follow集合石…Ua…即可。

3)算Select集合,书上没有提到Select集合,计算Select集合实质就是计算First(),当然考试时不一定非要写成Select集合形式,可以直接计算First()来判断交集是否为空,从而是否为LL(1)文法,请看考题1。

4)至于判断一个句子的分析过程,大家注意一下,所给的句子不一定是能通过该文法分析出来的,实际上在分析之前可以自己根据文法推推看,请看考题1.

5)分析表中没有填的空格代表出错,如果分析时遇到了代表该句子不符合该文法。考题1:判断下面文法是否为LL(1)文法,若是,请构造相应的LL(1)分析表并分析句子aabe的分析过程。(15分)

S→aD D→STe|εT→bM M→bH H→M|ε

分析:判断一个文法是否为LL(1)文法是否为LL(1)文法,主要就是判断是否满足LL(1)文法的充要条件,有一个不满足就不是LL(1)文法。对于aabe根据文法SaDaSTeaaDTeaaTeaabMe由于M不能为空字ε,所以最后肯定推不出来,也就是该句子不能由该文法推出,出错。

当然一般题目都是LL(1)文法,否则题目就不好往下做,没有意义。

答:(1)经分析该文法无左递归;

(2)①非终结符的First和Follow集合如下表所示

②将文法分解为:S→aD D→Ste D→ε T→bM M→bH H→M H→ε依次计算:

First(aD)={a} First(Ste)={a}

Follow(D)={# b} First(bM)={b}

First(bH)={b} First(M)={b} Follow(H)={ e }

∵First(Ste)∩Follow(D)=ФFirst(M)∩Follow(H)=Ф

∴该文法是LL(1)文法

LL(1)分析表如下:

(3)aabe的分析过程如下:

考题2:判断下面文法是不是LL(1)文法,若是请构造相应的LL(1)分析表,写出aaabd的分析过程。

S→aH H→aMd|d M→Ab|A→aM|e

答:(1)可以判断该文法无左递归。

(2)将文法分解为分解:S→aH H→aMd H→d M→Ab M→A→aM A→e 求First和Follow集合

求Select集合

Select(S→aH)=First(aH)={a} Select(H→aMd)=First(aMd)={a} Select(H→d)={d} Select(M→Ab)=First(Ab)={a,e}

Select(M→)=First()UFollow(M)= Follow(M)={d,b}

Select(A→aM)=First{aM}={a} Select(A→e)=First(e)={e}∵Select(H→aMd) ∩Select(H→d)= Ф

Select(M→Ab) ∩Select(M→e)=Ф

Select(A→aM) ∩Select(A→e)= Ф

∴该文法是LL(1)文法。

(3)LL(1)分析表如下:

aaabd#的分析过程如下:

考题3:构造LL(1)分析方法的总控流程图

6、构造递归下降识别程序

这类题目首先看文法有无左递归和左公因子,有的话一定要消除,我期中给大家的答案错了,考题1为更正后的答案。

考题1:为文法G[E]:E → V | V+E V → N | N[E] N → i构造递归下降识别程序(10分)

解:(1)提取左公因子:E→VE’E’ →+E|V →NV’V’→[E]|N → i

(3)构造递归下降识别程序

PROCEDURE E;BEGIN

V; E’END; PROCEDURE E’;

IF SYM=‘+’ THEN

BEGIN

ADVANCE;

E

PROCEDURE V;

BEGIN

? N;V’

END;

END

PROCEDURE F;

IF SYM=‘[’ THEN BEGIN

ADVANCE;

E;

IF SYM=‘]’

THEN

ADVANCE

ELSE ERROR END

ELSE ERROR; PROCEDURE N;

IF SYM=‘i’ THEN

考题2:为文法G[E]:E→E+T|T T→T*F|F F→(E)|i构造递归下降识别程序

解:(1)消除左递归:E→TE? E?→+TE?| ?T→FT?T?→*FT?| ?F→(E) | i

(2)构造递归下降识别程序

PROCEDURE E;BEGIN

T;E? END;PROCEDURE T;

BEGIN

F;T?

END

PROCEDURE F;

IF SYM=‘i’ THEN

ADVANCE

ELSE

IF SYM=‘(’

THEN

PROCEDURE E?;

IF SYM=‘+’ PROCEDURE T?;

IF SYM=‘*’

THEN

BEGIN

ADVANCE; T;E? END THEN

BEGIN

ADVANCE;

F;T?

END

BEGIN

ADVANCE;

E;

IF

SYM=‘)’

THEN ADVANCE

ELSE ERROR

END

ELSE ERROR;

7、自底向上分析法——LR(0)分析法

注:自底向上分析法本质是从输入串开始,逐步进行“归约”,直到文法的开始符号,其关键问题是寻找句柄。

自底向上分析法还有算符优先分析法,SLR(1),LR(1)等等,老师那天重点讲了一道LR(0)分析法的题目,他说算符优先分析法A卷不考,但是补考的B卷会考,按照他的意思,这次期末考试LR(0)是考定的了,SLR(1),LR(1)应该不考,因为LR(0)分析法个人感觉也是所有题目中最繁的了,下面已老师讲的题目为例这,也是一份试卷上的考题,首先介绍一些相关知识。

(1)LR(0)项目:通俗点讲,文法G中的任何一个产生式的右部的任何位置添加一个圆点就成了LR(0)项目,比如A→Ab是产生式,则A→?Ab A→A?b A→Ab?都是该产生式对应的全部项目。项目动态的表示归约的一个阶段:对于项目A→A?b,可以这样理解它:“?”之前的A表示的是在识别Ab过程中已输入到栈终的部分;“?”之后的表示在识别Ab过程中期望出现的部

分;“?”表示则是在识别Ab过程中当前的识别进度的定位。项目A→Ab?

已经具备了识别Ab的一切条件,因此被称为归约项目。

项目可以分为以下四类:P→α?aβ称为移进项目其中, P→α?Xβ称为待约项目,其中X为非终结符,P→α?称为归约项目,S’→S称为接收项目

(2)LR(0)的分析栈可以看成两部分状态栈

LR分析器的核心是一张分析表:

ACTION[s,a]:当状态s面临输入符号a时,应采取什么动作.

GOTO[s,X]:状态s面对文法符号X时,下一状态是什么.

下面几张PPT大家看看,对基本概念有个印象:

这一章的概念较多较抽象,我一时半会也讲不完讲不清楚,这里不再赘述,直接看题目,知道怎么做就行,下面以一道考题这也是老师讲的原题为例讲解如何做这类题目,首先一般这种题目分三步走:

(1)拓广文法:假定文法G是一个以S为开始符号的文法,我们构造一个G?,它包含了整个G,但它引进了一个不出现在G中的非终结符S?,并加进一个新产生式S?→S,而这个S?是G?的开始符号。那么,我们称G?是G的拓广文法。这样,

《编译原理》模拟期末试题汇总 6套,含答案

《编译原理》模拟试题一 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.计算机高级语言翻译成低级语言只有解释一种方式。(×) 2.在编译中进行语法检查的目的是为了发现程序中所有错误。(×) 3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。 (√ ) 4.正则文法其产生式为 A->a , A->Bb, A,B∈VN , a 、b∈VT 。 (×) 5.每个文法都能改写为 LL(1) 文法。 (√) 6.递归下降法允许任一非终极符是直接左递归的。 (√) 7.算符优先关系表不一定存在对应的优先函数。 (×) 8.自底而上语法分析方法的主要问题是候选式的选择。 (×) 9.LR 法是自顶向下语法分析方法。 (×) 10.简单优先文法允许任意两个产生式具有相同右部。 (×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.一个编译程序中,不仅包含词法分析,_____,中间代码生成,代码优化,目标代码生成等五个部分。 A.( ) 语法分析B.( )文法分析C.( )语言分析D.( )解释分析 2.词法分析器用于识别_____。 A.( ) 字符串B.( )语句 C.( )单词 D.( )标识符 3.语法分析器则可以发现源程序中的_____。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正D.( ) 语法错误 4.下面关于解释程序的描述正确的是_____。

(1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1)C.( ) (1)(2)(3) D.( ) (2)(3) 5.解释程序处理语言时 , 大多数采用的是_____方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 6.编译过程中 , 语法分析器的任务就是_____。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4) C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 7.编译程序是一种_____。 A. ( ) 汇编程序B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序 8.文法 G 所描述的语言是_____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 9.文法分为四种类型,即0型、1型、2型、3型。其中3型文法是_____。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法 10.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 _____。 A.( ) 句子B.( ) 句型 C.( ) 单词 D.( ) 产生式 三、填空题(每空1分,共10分)

编译原理实验指导

编译原理实验指导 实验安排: 上机实践按小组完成实验任务。每小组三人,分别完成TEST语言的词法分析、语法分析、语义分析和中间代码生成三个题目,语法分析部分可任意选择一种语法分析方法。先各自调试运行,然后每小组将程序连接在一起调试,构成一个相对完整的编译器。 实验报告: 上机结束后提交实验报告,报告内容: 1.小组成员; 2.个人完成的任务; 3.分析及设计的过程; 4.程序的连接; 5.设计中遇到的问题及解决方案; 6.总结。

实验一词法分析 一、实验目的 通过设计编制调试TEST语言的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、实验预习提示 1.词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示 成以下的二元式(单词种别码,单词符号的属性值)。 2.TEST语言的词法规则 |ID|ID |NUM →a|b|…|z|A|B|…|Z →1|2|…|9|0 →+|-|*|/|=|(|)|{|}|:|,|;|<|>|! →>=|<=|!=|== →/* →*/ 三、实验过程和指导 1.阅读课本有关章节,明确语言的语法,画出状态图和词法分析算法流程图。 2.编制好程序。 3.准备好多组测试数据。 4.程序要求 程序输入/输出示例:

四川大学编译原理期末复习总结

一、简答题 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.词法分析阶段的功能是什么 答:

编译原理期末考试卷

2001年编译原理试题 1.(10分)处于/* 和 */之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。 2.(10分)为语言 L ={a m b n | 0 ≤ m ≤ 2n}(即a的个数不超过b的个数的两倍) 写一个LR(1)文法,不准超过6个产生式。(若超过6个产生式,不给分。若所写文法不是LR(1)文法,最多给5分。) 3.(10分)构造下面文法的LL(1)分析表。 D → TL T → int | real L → id R R → , id R | ε 4.(15分)就下面文法 S → ( L) | a L → L , S | S ?给出一个语法制导定义,它输出配对括号的个数。 ?给出一个翻译方案,它输出每个a的嵌套深度。 如句子(a, (a, a) ),第一小题的输出是2,第二小题的输出是1 2 2。 5.(10分)Pascal语言for语句的含义见教材第222页习题7.13。请为该语句设计一种合理的中间代码结构。你可以按第215页图7.17的方式或者第219页图7.19的方式写出你的设计,不需要写产生中间代码的语法制导定义。 6.(5分)一个C语言程序如下: func(i1,i2,i3) long i1,i2,i3; { long j1,j2,j3; printf("Addresses of i1,i2,i3 = %o,%o,%o\n",&i1,&i2,&i3); printf("Addresses of j1,j2,j3 = %o,%o,%o\n",&j1,&j2,&j3); } main() { long i1,i2,i3;

编译原理实验 中间代码生成

实验四中间代码生成 一.实验目的: 掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。 二.实验内容: 1、逆波兰式定义:将运算对象写在前面,而把运算符号写在后面。用这种表示法表示的表 达式也称做后缀式。 2、抽象(语法)树:运算对象作为叶子结点,运算符作为内部结点。 3、三元式:形式序号:(op,arg1,arg2) 4、四元式:形式(op,arg1,arg2,result) 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。 (3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。 (4)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。 四、程序代码: //这是一个由中缀式生成后缀式的程序 #include<> #include<> #include<> #include<> #define maxbuffer 64 void main() { char display_out(char out_ch[maxbuffer], char ch[32]); //int caculate_array(char out_ch[32]); static int i=0; static int j=0; char ch[maxbuffer],s[maxbuffer],out[maxbuffer]; cout<<"请输入中缀表达式: ";

最新编译原理试题汇总+编译原理期末试题(8套含答案+大题集)

编译原理考试题及答案汇总一、选择 1.将编译程序分成若干个“遍”是为了_B__。 A . 提高程序的执行效率 B.使程序的结构更加清晰 C. 利用有限的机器内存并提高机器的执行效率 D.利用有限的机器内存但降低了机器的执行效率 2.正规式 MI 和 M2 等价是指__C__。 A . MI 和 M2 的状态数相等 B.Ml 和 M2 的有向弧条数相等。 C .M1 和 M2 所识别的语言集相等 D. Ml 和 M2 状态数和有向弧条数相等 3.中间代码生成时所依据的是 _C_。 A.语法规则 B.词法规则 C.语义规则 D.等价变换规则 4.后缀式 ab+cd+/可用表达式__B_来表示。 A. a+b/c+d B.(a+b)/(c+d) C. a+b/(c+d) D. a+b+c/d 6.一个编译程序中,不仅包含词法分析,_A____,中间代码生成,代码优化,目标代码生成等五个部分。 A.( ) 语法分析 B.( )文法分析 C.( )语言分析 D.( )解释分析 7.词法分析器用于识别__C___。 A.( ) 字符串 B.( )语句 C.( )单词 D.( )标识符 8.语法分析器则可以发现源程序中的___D__。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正 D.( ) 语法错误 9.下面关于解释程序的描述正确的是__B___。 (1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1) C.( ) (1)(2)(3) D.( ) (2)(3) 10.解释程序处理语言时 , 大多数采用的是__B___方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 11.编译过程中 , 语法分析器的任务就是__B___。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4)C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 12.编译程序是一种___C__。 A. ( ) 汇编程序 B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序 13.文法 G 所描述的语言是_C____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 14.文法分为四种类型,即 0 型、1 型、2 型、3 型。其中 3 型文法是___B__。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法15.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 __D___。 A.( ) 句子 B.( ) 句型 C.( ) 单词 D.( ) 产生式

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理模拟试题六

《编译原理》模拟试题六 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.设r和s分别是正规式,则有L(r|s)=L(r)L(s)。(×) 2.确定的自动机以及不确定的自动机都能正确地识别正规集。(√) 3.词法分析作为单独的一遍来处理较好。 (× ) 4.构造LR分析器的任务就是产生LR分析表。 (√) 5.规范归约和规范推导是互逆的两个过程。 (× ) 6.同心集的合并有可能产生新的“移进”/“归约”冲突。 (× ) 7.LR分析技术无法适用二义文法。 (× ) 8.树形表示和四元式不便于优化,而三元式和间接三元式则便于优化。 (×) 9.程序中的表达式语句在语义翻译时不需要回填技术。 (√) 10.对中间代码的优化依赖于具体的计算机。 (× ) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.编译程序绝大多数时间花在_____ 上。 A.( ) 出错处理 B.( ) 词法分析 C.( ) 目标代码生成D.( ) 表格管理 2.编译程序是对_____。 A.( ) 汇编程序的翻译 B.( ) 高级语言程序的解释执行 C.( ) 机器语言的执行D.( ) 高级语言的翻译

3.采用自上而下分析,必须_____。 A.( ) 消除左递归 B.( ) 消除右递归 C.( ) 消除回溯 D.( ) 提取公共左因子 4.在规范归约中,用_____来刻画可归约串。 A.( )直接短语B.( )句柄 C.( )最左素短语D.( )素短语 5.若a为终结符,则A->α ·aβ为_____项目。 A.( )归约B.( ) 移进C.( ) 接受D.( ) 待约 6.间接三元式表示法的优点为_____。 A.( ) 采用间接码表,便于优化处理B.( ) 节省存储空间,不便于表的修改 C.( ) 便于优化处理,节省存储空间 D.( ) 节省存储空间,不便于优化处理 7.基本块内的优化为_____。 A. ( ) 代码外提,删除归纳变量B.( ) 删除多余运算,删除无用赋 值 C.( ) 强度削弱,代码外提 D.( ) 循环展开,循环合并 8. 在目标代码生成阶段,符号表用_____。 A.( ) 目标代码生成B.( ) 语义检查 C.( ) 语法检查D.( ) 地址分配 9.若项目集Ik含有A->α·,则在状态k时,仅当面临的输入符号a∈FOLLOW(A)时,才采取“A->α ·”动作的一定是_____。

编译原理实验报告

院系:计算机科学学院 专业、年级: 07计科2大班 课程名称:编译原理 学号姓名: 指导教师: 2010 年11月17 日 组员学号姓名

实验 名称 实验一:词法分析实验室9205 实验目的或要求 通过设计一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 具体要求:输入为某语言源代码,达到以下功能: 程序输入/输出示例:如源程序为C语言。输入如下一段: main() { int a,b; a=10; b=a+20; } 要求输出如下(并以文件形式输出或以界面的形式输出以下结果)。 (2,”main”) (5,”(“) (5,”)“) (5,”{“} (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,”}“) 要求: 识别保留字:if、int、for、while、do、return、break、continue等等,单词种别码为1。 其他的标识符,单词种别码为2。常数为无符号数,单词种别码为3。 运算符包括:+、-、*、/、=、>、<等;可以考虑更复杂情况>=、<=、!= ;单词种别码为4。分隔符包括:“,”“;”“(”“)”“{”“}”等等,单词种别码为5。

编译原理概念期末总结复习

翻译程序:把一种语言程序转换成另一种语言程序,且在功能上是相同的这样的程序。 编译程序:把高级语言转换成低级语言,且在功能上是相同的这样的程序。 解释程序:边解释边执行源程序的程序。区别:编译程序有中间代码,而解释程序没有。编译过程的五个阶段: 1、词法分析任务:对构成源程序的字符串进行扫描和分解,识别出一个个单词。 2、语法分析任务:在词法分析的基础上,根据语言规则,把单词符号串分解成各类语法 单位。 3、语义分析和中间代码产生任务:对语法分析所识别出的各类语法范畴,分析其含义, 并进行初步翻译。 4、优化任务:对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效 的目标代码。 5、目标代码生成任务:把中间代码变换成特定机器上的低级语言代码。 编译程序的七个部分词法分析器,语法分析器、语义分析与中间代码产生器、优化器、目标代码生成器、表格管理和出错处理。 编译程序生成的五个办法:机器语言、高级语言、移植、自编译方式和使用工具自动生成。词法规则:指单词符号的形成规则。(也就是正规式) 语法规则:规定了如何从单词符号形成更大的结构。就是语法单位的形成规则。 空字:不包含任何符号的序列。 闭包: 中所有的符号组成的集合。 上下文无关文法是指:所定义的语法范畴是完全独立于这种范畴可能出现的环境的文法。上下文无关文法的四个组成部分:一组终结符号、一组非终结符号、一个开始符号和一组产生式。 终结符号也就是不可再分的基本符号。 非终结符号是用来代表语法范畴,表示一定符号串的集合。 开始符号是语言中我们最感兴趣的语法范畴。 产生式是定义语法范畴的书写规则。 句子:文法中从开始符号推导的终结符号串。 句型:从开始符号推导的符号串。 语言:文法中所有句子的集合。 程序语言的单词符号分为五种:关键字、标识符、常数、运算符和界符。 二元式表示:(种类,属性) 正规式的运算符有三种:或,连接和闭包。优先顺序是:闭包,连接,或。 DFA怎么识别字:若存在一条从初态结点到某一终态结点的通路,且这条通路上所有弧的标记符连接成的字是a,则称a可为DFA所识别。 DFA怎么识别空字:若DFA的初态结点同时又是终态结点,则空字可为DFA所识别。NFA怎么识别字:若存在一条从某一初态结点到终态结点的通路,且这条通路上所有弧的标记字依序连接成的字等于a,则称a可为NFA识别。 NFA怎么识别空字:若M的某些结点即是初态又是终态结点,或者存在一条从某个初态结点到某个终态结点的空通路,那么,空字可为M所识别。 语言的语法结构是用上下文无关文法描述的。 语法分析分为两类:自上而下分析法,自下而上分析法。 自上而下分析法面临的问题:1.文法的左递归问题。2.回溯3.成功可能是暂时的,产生虚假匹配。4.难于知道输入串中出错的确切位置。5.效率低,代价高。

编译原理期末考试习题及答案知识分享

一、填空题|(每题4分,共20分) 1. 乔母斯基定义的3型文法(线性文法)产生式形式 A→Ba|a,或A→aB|a,A,B∈Vn, a,b∈Vt 。 2.语法分析程序的输入是单词符号,其输出是语法单位。 3 型为 B → .aB 的LR(0)项目被称为移进项目,型为 B → a.B 的LR(0) 项目被称为待约项目, 4.在属性文法中文法符号的两种属性分别为继承属性和综合属性。 5、运行时存贮管理方案有静态存储分配、动态存储分配和堆式存储分配和方案。 二.已知文法 G(S) (1) E → T | E+T (2) T → F | F*F (3) F →(E)| i (1)写出句型(T*F+i)的最右推到并画出语法树。(4分) (2)写出上述句型的短语,直接短语和句柄。(4分) 答:(1)最右推到(2分) E ==> T ==> F ==> (E) ==> (E+T) ==> (E+F) ==> (E+i) ==> (T+i) ==> (T*F+i) (2) 语法树(2分) (3)(4分) 短语:(T*F+i),T*F+i ,T*F , i 直接短语:T*F , i 句柄:T*F 三. 证明文法G(S) :S → SaS |ε是二义的。(6分) 答:句子aaa对应的两颗语法树为: 因此,文法是二义文法

四.给定正规文法G(S): (1) S → Sa | Ab |b (2) A → Sa 请构造与之等价的DFA。(6分) 答:对应的NFA为:(6分) 状态转换表: a b {F} Φ{S} {S} {S,A} Φ {S,A} {S,A} {S} 五. 构造识别正规语言b*a(bb*a)*b* 最小的DFA(要求写出求解过程)。(15分)答:(1)对应的NFA(5分) a b {0} {1,3} {0} {1,3} Φ{2,3} {2,3} {1,3} {2,3} (5分) 六. 已知文法G(S) : (1) S → ^ | a | (T) (2) T → T,S | S 试:(1)消除文法的左递归;(4分) (2)构造相应的first 和 follow 集合。(6分) 答:(1)消除文法的左递归后文法 G’(S)为: (1) S → ^ | a | (T) (2) T → ST’ | S (3) T’→ ,ST’ |ε(4分)

编译原理实验报告一

实验一词法分析程序实现 一、实验目得与要求 通过编写与调试一个词法分析程序,掌握在对程序设计语言得源程序进行扫描得过程中,将字符流形式得源程序转化为一个由各类单词符号组成得流得词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中得单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符与四个算术运算符,试构造能识别这些单词得词法分析程序(各类单词得分类码参见表I)。 表I语言中得各类单词符号及其分类码表 输入:由符合与不符合所规定得单词类别结构得各类单词组成得源程序文件。 输出:把所识别出得每一单词均按形如(CLASS,VALUE)得二元式形式输出,并将结果放到某个文件中。对于标识符与无符号常数,CLASS字段为相应得类别码得助记符;V AL UE字段则就是该标识符、常数得具体值;对于关键字与运算符,采用一词一类得编码形式,仅需在二元式得CLASS字段上放置相应单词得类别码得助记符,V ALUE字段则为“空". 三、实现方法与环境 词法分析就是编译程序得第一个处理阶段,可以通过两种途径来构造词法分析程序.其一就是根据对语言中各类单词得某种描述或定义(如BNF),用手工得方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应得状态矩阵,该状态矩阵连同控制程序一起便组成了编译器得词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序得另外一种途径就是所谓得词法分析程序得自动生成,即首先用正规式对语言中得各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程

《编译原理》实验指导书

《编译原理》实验指导书 实验目的和内容 编译原理实验的目的是使学生将编译理论运用到实际当中,实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法,并加深对编译技术的认识。 实验内容共需实现编译器的词法、语法和语义分析程序三个组成部分。要求学生必须完成每个实验的基本题目要求,有余力的同学可尝试实验的扩展要求部分。 实验报告 要求每人针对所完成的实验内容上交一份实验报告,其中主要包括三方面内容:1、实验设计:实验采用的实现方法和依据(如描述语言的文法及其机内表示,词分析 的单词分类码表、状态转换图或状态矩阵等,语法分析中用到的分析表或优先矩阵等,语法制导翻译中文法的拆分和语义动作的设计编写等);具体的设计结果(应包括整体设计思想和实现算法,程序结构的描述,各部分主要功能的说明,法以及所用数据结构的介绍等)。 2、程序代码:实验实现的源程序清单,要求符合一般的程序书写风格,有详细的注释。 3、实验结果分析:自行编写若干源程序作为测试用例,对所生成的编译程序进行测试 (编译程序的输入与输出以文件的形式给出);运行结果分析(至少包括一个正确和一个错误单词或语句的运行结果);以及改进设想等。 注意事项 1、电子版实验报告和源程序在最后一次机时后的一周内上交。(每个同学上交一个压 缩文件,其命名格式为“学号_姓名.rar”,内含实验报告和一个命名为“源程序” 的文件夹。注意提交的源程序应是经过调试、测试成功的较为通用的程序,并应有相应的注释、运行环境和使用方法简介。) 2、不接受不完整的实验报告和没有说明注释的源程序,或者说明与程序、运行结果不 符合的作业。 特别鼓励:扩展题目 1、为亲身经历一个小型编译器的开发全过程,触摸一下与实际编译器开发相关的工作, 大家可以自由组成3人左右的小组,推举组长,模拟一个团队分工协作开发大型软件的实战环境,融入软件工程的思想规范和一般理论方法,初步体验从系统分析设计、编码测试到交付维护的一个完整编译器软件的开发过程。要求组长为每个小组成员分配主要负责的任务,完成相应的分析设计员、程序员和测试员等角色的工作,并以小组为单位提交一份实验报告和源程序,在报告封面上写明每个同学主要完成和负责的部分。 2、以组为单位完成的实验内容至少必须整合词法、语法和语义三个部分的实验,对于 选定的适当规模的文法(如C语言的一个大小适宜的子集),进行系统的总体设计、功能分析、编码测试等工作。完成一个从对源程序的词法分析开始,到中间代码生成的完整的编译器前端的开发,使所涉及到的编译系统的各个组成模块有机地衔接在一起,提交一份完整的实验报告和源程序,并将以下几个方面描述清楚:

编译原理考试试题1

编译原理 一、(5×6分)回答下列问题: 1.什么是S-属性文法?什么是L-属性文法?它们之间有什么关系? 2.什么是句柄?什么是素短语? 3.划分程序的基本块时,确定基本块的入口语句的条件是什么? 4.运行时的DISPLAY 表的内容是什么?它的作用是什么? 5.对下列四元式序列生成目标代码: A:=B*C D:=E+F G:=A+D H:=G*2 其中,H 是基本块出口的活跃变量, R0和R1是可用寄存器 二、(8分)设∑={0,1}上的正规集S 由倒数第二个字符为1的所有字符串组成,请给出该字集对应的正规式,并构造一个识别该正规集的DFA 。 三、(6分)写一个文法使其语言为L(G)={ a n b m a m b n | m,n ≥1}。 四、(8分)对于文法G(E): E →T|E+T T →F|T* F F →(E)|i 1. 写出句型(T*F+i)的最右推导并画出语法树。 2. 写出上述句型的短语,直接短语、句柄和素短语。 五、(12分)设文法G(S): ( |*)B B |B A A A |SiA S A →+→→ 1.构造各非终结符的FIRSTVT 和LASTVT 集合; 2.构造优先关系表和优先函数。 六、(9分)设某语言的do-while 语句的语法形式为 S → do S (1) While E 其语义解释为: 真 假 S (1)的代码 E 的代码

针对自下而上的语法分析器,按如下要求构造该语句的翻译模式: (1) 写出适合语法制导翻译的产生式; (2) 写出每个产生式对应的语义动作。 七、(8分)将语句if (A0) then while C>0 do C:=C+D; 翻译成四元式。 八、(10分) 设有基本块如下: T1:=S+R T2:= 3 T3:= 12/T2 T4:=S/R A:=T1-T4 T5:=S+R B:=T5 T6:=T5*T3 B:=T6 (1)画出DAG图; (2)设A,B是出基本块后的活跃变量,请给出优化后的四元式序列。 九、(9分) 设已构造出文法G(S): (1) S → BB (2) B → aB (3) B→ b 的LR分析表如下 ACTION GOTO 状态 a b # S B 0 s3 s4 1 2 1 acc 2 s6 s7 5 3 s3 s 4 8 4 r3 r3 5 r1 6 s6 s 7 9 7 r3 8 r2 r2 9 r2 假定输入串为abab,请给出LR分析过程(即按照步骤给出状态,符号,输入串的变化过程)。

编译原理学习心得

编译原理学习心得 编译原理学习心得1 编译程序在计算机科学与技术的发展历史中发挥了巨大作用,是计算机系统的核心支撑软件。而“编译原理”这门课程一直以来是国内外大学计算机相关专业的重要课程。因为它的知识结构贯穿程序设计语言、系统环境以及体系结构,能以相对的视角体现从软件到硬件以及软硬件协同的整机概念。其理论基础又涉及形式语言与自动机、数据结构与算法等计算机学科的许多重要方面,为联系计算机科学理论和计算机系统的典范。 虽然编译原理这门课程在大多数的人里认为枯燥无味,学起来就像看天书一样。然而学习这门课程还是有一定的好处的。比如可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的,可以更加客观的比较不同语言的差异,并且学习新的语言的效率也会更加高,语言转换也会更加游刃有余。 不学“编译原理”这门课程的话,自己的编程思想会很浅显。而且编程也只仅仅停留在编程上,无法深入理解其中的原理。 学习编译原理的话,从文法、正规式、NFA与DFA的定义,下手,要用心动脑去体会 编译原理学习心得2

从联系最紧密的操作系统来说吧,你写多线程/多进程的程序就得和操作系统的知识打交道。写多线程得加锁吧,临界区、死锁的四个条件之类的标准的操作系统的内容吧(不得不吐槽一下,某国内一线电商干了三年的程序猿,写多线程居然不知道加锁,也是醉了)。进程间通信的几种方式什么管道、socket、共享内存等,这也是操作系统的内容吧。文件系统,这也是经常要打交道的东西。还有内存什么的,你做Android 开发,这些里边有很多东西都在系统层面被封装好了,但是你要是不知道原理,一旦出了错根本无从调试,况且你该不会打算写一辈子写Android 就是填逻辑吧。 然后,是编译原理,普通的程序猿是接触不到编译器或者虚拟机的开发的。但是这并不意味着编译原理就用不到。说个最常见的读取配置文件,只要你的配置文件有自定义的语法,你就要用编译原理的东西。还有类似于自动生成代码啦、正则表达式啦这些都算是编译原理的内容。你既然是写Java 的不了解虚拟机怎么可以,最基本的字节码总是需要能看懂的吧,分析一些疑难杂症的时候字节码还是很有用的。 最后,是计算机原理,如果只是做应用开发的话计算机原理其实不必要掌握的多深入,但是一些基本的概念还是要清楚的。比如寄存器、缓存、中断什么的,关键的时候可以帮助你调试。在一些对性能要求非常高的场合,也是很有作用的。此外,学了

编译原理实验指导书2010

《编译原理》课程实验指导书 课程编号: 课程名称:编译原理/Compiler Principles 实验总学时数: 8 适用专业:计算机科学与技术、软件工程 承担实验室:计算机学院计算机科学系中心实验室、计算机技术系中心实验室 一、实验教学的目的与要求 上机实习是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,实习题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的2次上机实验都属于一种设计类型的实验,每个实验的训练重点在于基本的编译技术和方法,而不强调面面俱到;实验的目的是旨在使学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容;培养学生编制算法的能力和编程解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法设计和程序代码的编写;上机时应随带有关的编译原理教材或参考书;要学会程序调试与纠错。 每次实验后要交实验报告,实验报告的内容应包括: (1)实验题目、班级、学号、姓名、完成日期; (2)简要的需求分析与概要设计; (3)详细的算法描述; (4)源程序清单; (5)给出软件的测试方法和测试结果; (6)实验的评价、收获与体会。 开发工具: (1)DOS环境下使用Turbo C; (2)Windows环境下使用Visual C++ 。 考核: 实验成绩占编译原理课程结业成绩的10%。 三、单项实验的内容和要求: 要求每个实验保证每个学生一台微机。 实验一(4学时):单词的词法分析程序设计。 (一)目的与要求 1.目的 通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编译原理模拟题

《编译原理》模拟题(补) 一.单项选择题 1.()是两类程序语言处理程序。 A. 高级语言程序和低级语言程序 B. 解释程序和编译程序 C. 编译程序和操作系统 D. 系统程序和应用程序 2. 编译程序前三个阶段完成的工作是()。 A. 词法分析、语法分析和代码优化 B. 代码生成、代码优化和词法分析 C. 词法分析、语法分析、语义分析和中间代码生成 D. 词法分析、语法分析和代码优化 3. 一个上下文无关文法G包括四个组成部分:一组终结符,一组非终结符,一个开始符号,以及一组()。 A. 字符串 B. 产生式 C. 非开始符号 D. 文法 4. 词法分析器的输出结果是()。 A. 单词的种别编码 B. 单词在符号表中的位置 C. 单词的种别编码和自身值 D. 单词自身值 5. 一个句型中称为句柄的是该句型的最左()。 A. 非终结符号 B. 短语 C. 句子 D. 直接短语 6. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于()分析方法。 A. 自左向右 B. 自顶向下 C. 自底向上 D. 自右向左 7. 在通常的语法分析方法中,()特别适用于表达式的分析。 A. 算符优先分析法 B. LR分析法 C. 递归下降分析法 D. LL(1)分析法 8. 优化可生成_____的目标代码。 A. 运行时间较短 B. 占用存储空间较小 C. 运行时间短但占用内存空间大 D. 运行时间短且占用存储空间小 9.()是两类程序语言处理程序。 A. 系统程序和应用程序 B.编译程序和操作系统 C. 解释程序和编译程序 D.高级语言程序和低级语言程序 10. 经过编译所得到的目标程序是()。 A. 四元式序列 B. 间接三元式序列

编译原理实验报告

《编译原理》实验报告软件131 陈万全132852

一、需求分析 通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。 通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。 1、词法分析程序设计与实现 假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。 输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。 2、语法分析程序设计与实现 选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的

一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。 G2[<算术表达式>]: <算术表达式>→<项> | <算术表达式>+<项> | <算术表达式>-<项> <项>→<因式>|<项>*<因式>|<项>/<因式> <因式>→<运算对象> | (<算术表达式>) 若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成: G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E) 输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。 3、语义分析程序设计与实现 对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。 输入:包含测试用例(由标识符、无符号数和+、?、*、/、(、)构成的算术表达式)的源程序文件。 输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。 若源程序中有错误,应指出错误信息 二、设计思路 1、词法分析程序设计与实现 1)单词分类 为了编程的实现。我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。

相关文档