编译原理作业集-第五章-修订(精选.)

编译原理作业集-第五章-修订(精选.)
编译原理作业集-第五章-修订(精选.)

第五章语法分析—自下而上分析

本章要点

1. 自下而上语法分析法的基本概念:

2. 算符优先分析法;

3. LR分析法分析过程;

4. 语法分析器自动产生工具Y ACC;

5. LR分析过程中的出错处理。

本章目标

掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。

本章重点

1.自下而上语法分析的基本概念:归约、句柄、最左素短语;

2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:

(1)LR(0)项目集族,LR(1)项目集簇;

(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;

(3)LR分析的基本原理,分析过程;

4.LR方法如何用于二义文法;

本章难点

1. 句柄的概念;

2. 算符优先分析法;

3. LR分析器基本;

作业题

一、单项选择题:

1. LR语法分析栈中存放的状态是识别________的DFA状态。

a. 前缀;

b. 可归前缀;

c. 项目;

d. 句柄;

2. 算符优先分析法每次都是对________进行归约:

(a)句柄(b)最左素短语(c)素短语(d)简单短语

3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。

a. LL(1)文法;

b.二义性文法;

c.算符优先文法;

d.SLR(1)文法;

4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;

a. 深度分析法

b. 宽度优先分析法

c. 算符优先分析法

d. 递归下降子程序分析法

5. 自底向上语法分析采用分析法,常用的是自底向上语法分析有算符优先分析法和LR分析法。

a. 递归

b. 回溯

c. 枚举

d. 移进-归约

6. 一个LR(k)文法,无论k取多大,。

a. 都是无二义性的;

b. 都是二义性的;

c. 一部分是二义性的;

d. 无法判定二义性;

7. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LR分析法属于自底向上分析。

a. 深度分析法

b. 宽度优先分析法

c. 算符优先分析法

d. 递归下降子程序分析法

8. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,自顶向下分析试图为输入符号串构造一个;

a. 语法树

b. 有向无环图

c. 最左推导

d. 最右推导

9. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,自底向上分析试图为输入符号串构造一个。

a. 语法树

b. 有向无环图

c. 最左推导

d. 最右推导

10. 采用自顶向下分析方法时,要求文法中不含有。

a. 右递归

b. 左递归

c. 直接右递归

d. 直接左递归

11. LR分析是寻找右句型的;而算符优先分析是寻找右句型的。

a. 短语;

b. 素短语;

c. 最左素短语;

d. 句柄

12. LR分析法中分析能力最强的是;分析能力最弱的是。

a. SLR(1);

b. LR(0);

c. LR(1);

d. LALR(1)

13. 设有文法G:

T->T*F | F

F->F↑P | P

P->(T) | a

该文法句型T*P↑(T*F)的最左直接短语是下列符号串________。

a. (T*F),

b. T*F,

c. P,

d. P↑(T*F)

14. 在通常的语法分析方法中,()特别适用于表达式的分析。

a.算符优先分析法b.LR分析法c.递归下降分析法d.LL(1)分析法

15. .运算符的优先数之间有几种关系。

a.3种

b. 2种

c. 4种

d. 1种

16. 算符优先法属于()

a.自上而下分析法

b.LR分析法

c.SLR分析法

d.自下而上分析法

17. 在LR分析法中,分析栈中存放的状态是识别规范句型的DFA状态。

a.句柄

b. 前缀

c. 活前缀

d. LR(0)项目

一.答案:

1. b;

2. b;

3. b;

4. d;

5. d;

6. a;

7. c;

8. c;

9. d;10. b;11. d,c;12. c,b;13. a;14. a 15. a;16. d;17. c;

二、填空题:

1. 规范归约的关键问题是________ 。

2. LR(k)分析法中,L 的含义是____________________,R 的含义是_______________________,k 的含义是 。

3. 移进一归约分析对符号串的使用有四类操作:移进、__________、_________和出错处理。

4. 设文法G (E 为其开始符号)产生式如下:

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

则句型E+T*F+i 的句柄是_________________。

5. 自下而上分析方法的基本思想是:从输入符号串开始,利用文法规则逐步进行归约,直至归约到文法的 。

6. 在算符优先分析中,用 来刻画“可归约串”;在规范归约分析中,用 来刻画“可归约串”。

7. 在LR(0)分析中,相容的项目集,必须满足的条件是_______,_______。 8. LR 语法分析栈中存放的状态是识别_______的DFA 状态。 9. 在LR 分析过程中的任何时候,栈里的文法符号从下往上应该构成 ,把输入串的剩余部分配上之后应成为 。

10. 对于LR(0)分析法来说,项目A→β1?β2对活前缀αβ1是有效的,其条件是存在规范推导 。

11. 形式上我们说一个LR(1)项目[A→α?β,a]对于活前缀γ是有效的,如果存在规范推导 。

12. LR(k)分析方法中项目类型可分为四类 、 、 和 。 13. 所谓算符优先分析法就是仿照算术四则运算的运算过程设计的一种语法分析方法。它首先要规定 ,然后利用这种关系确定 ,并进行 。 14. 如图所示的语法树中,a ,b 不在同一句柄中, 先归约,所以 的优先级高于 。

P

b

R

……

a

Q

15. 对于句型η的语法树,若它的一棵子树的根标记为A ,且将此子树的末端结点标记从左至右排列起来所形成的符号串为β,则β是 ;此时文法中必有推导 。

16. LR(0)每个项目中圆点的左部表示在分析过程中,要用该产生式归约时, ,右部表示 。

17. 根据项目的定义,可给出文法中所有产生式的项目,而每个项目都为识别 的NFA 的一个状态。

二.答案:

1. 寻找或确定一个句型的句柄;

2. 从左到右扫描输入串,构造一个最右推导的逆过程;

3. 归约,接受;

4. T*F ;

5. 开始符号;

6. 最左素短语,句柄;

7. 移进项目和归约项目并存,多个归约项目并存;

8. 文法活前缀和可归前缀;

9. 活前缀,规范句型;10.

ωβαβωα21*'R

R

A S ??;11. δαβωωδR

R

A S ??*

',其中γ=δα,a 是ω的第一个符号,或者a

是#而ω为ε。12. 归约项目,接受项目,移进项目,待约项目;13. 运算符之间的优先关系;句型的“句柄”, 归约;14. a ,a ,b ;15. 句型η相对于A 的一个短语;A==>+ β;16. 句柄已识别的部分(进入符号栈),等待识别的部分;17. 活前缀

三、判断题

1. 一个二义性文法可以是SLR 文法或LALR 文法。( )

2. LL(1)文法不能用LR (1)分析器来分析。( )

3. LR 分析器在自左至右扫描输入串时就能发现其中的任何错误,并能准确地指出出错地点。( )

4. 在归约过程的任一时刻,一个上下文无关文法的任何句型的直接短语一般都不是唯一的。( )

5. 算符优先分析法不是一种规范规约法。 ( )

6. 存在有左递归规则的文法是LL(1)的。 ( )

7. 任何算符优先文法的句型中不会有两个相邻的非终结符号。 ( )

8. 算符优先文法中任何两个相邻的终结符号之间至少满足三种关系(<·,·>,=·)之一。 ( ) 9. 任何LL(1)文法都是无二义性的。 ( )

10. 每一个SLR(1)文法也都是LR(1)文法。 ( )

11. 存在一种算法,能判定任何上下文无关文法是否是LL(1)的。 ( ) 12. 任何一个LL(1)文法都是一个LR(1)文法,反之亦然。 ( )

13. LR(1)分析中括号中的1是指,在选用产生式A→α进行分析,看当前读入符号是否在FIRST(α)中。 ( )

14. 若某一个句型中出现了某一产生式的右部,则此右部不一定是该句型的句柄。( ) 15. 算符优先关系表不一定存在对应的优先函数。 ( ) 16. 简单优先文法允许任意两个产生式具有相同右部。 ( ) 17. 一个句型的句柄一定是文法某产生式的右部。 ( ) 18. 若一个句型中出现了某产生式的右部,则此右部一定是该句型的句柄。 ( ) 19. 根据项目的定义,可给出文法中所有产生式的项目,而每个项目都为识别活前缀的DFA 的一个状态。 ( ) 四.答案:1. ×;2. ×;3. √;4. √;5. √;6. ×;7. √;8. ×;9. √;10. √;11. √;12. ×;13. √;14. ×;15. √;16. ×;17. √;⒙ ×;19. ×;

五、名词解释:

1. 短语,直接短语,句柄;

2. 规范归约,规范推导;

3. 算符文法,算符优先文法;

4. 素短语,最左素短语;

5. 前缀,活前缀;

6. LR(0)项目,LR(0)项目集规范族;

五. 答案:

1. 设G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有:S=>*αAδ且A=>*β,则称β是句型αβδ相对于非终结符A的短语。

特别地,如果A=>β,则称β是句型αβδ相对于规则A->β的直接短语。

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

2. 在形式语言中,最右推导常称规范推导。规范归约是最右推导的逆过程,也称最左归约。

3. 一个文法,如果它的任何一个产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:……QR……,则我们称该文法为算符文法。

在一个算符文法中的任何终结符对(a,b),至多只满足下述三个关系之一:a?=b,ab,则称G是一个算符优先文法。

4. 所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除自身之外不再含任何更小的素短语。

所谓最左素短语是指处于句型最左边的哪个素短语。

5. 一个字的前缀是指该字的任意首部。活前缀是指规范句型的一个前缀,这种前缀不含句柄之后的任何符号。

6. 文法G的每一个产生式的右部添加一个小圆点,称为G的一个LR(0)项目。

构成识别一个文法活前缀的DFA的项目集(状态)的全体,称为该文法的项目集规范族。

六、简答题:

1. 说明任何SLR(1)文法都是LR(1)文法。

2. 为什么移进-归约法不是一种语法分析方法?

3. LR(k)分析法是如何做到严格地自左向右进行分析的?

4. 使用状态有限的识别可归前缀的有穷自动机,为什么可以识别语言的无穷多个句子?

5. LR项目的含义是什么?

六.答案:

1. 假设有一个SLR(1)文法G不是LR(1)文法,那么在G的LR(1)项目集规范族中,或有下面的(i),或有下面的(ii),或两种情形都有

与之对应,G的LR(0)项目集规范族或有下面的(i),或有下面的(ii),或两者皆有:

因为G是SLR(1)文法,因此有:

a不属于FOLLOW(A),FOLLOW(A)∩FOLLOW(B)=Φ

根据G的LR(1)项目集,有

a∈FOLLOW(A),FOLLOW(A)∩FOLLOW(B)≠Φ

这和假设矛盾。因此,任何SLR(1)文法都是LR(1)文法。

2. 自底向上分析技术采用移进-归约法实现句型分析,但移进-归约法决不是一种分析技术,它本身不能解决自底向上分析计数所必须解决的两个基本问题,移进-归约法仅仅是适用于各种自底向上技术的一种实现方法。

3. 自底向上分析的关键是寻找句柄。简单优先分析法、算符优先分析法都是自左向右地向前查看若干个输入符号,找出句柄(或其变型-最左素短语)的尾,然后回头(从右到左)找出句柄(或其变型-最左素短语)的头,这已不是严格地从左到右查看源程序来进行归约了。

LR(k)分析法则严格地从左到右地读入输入符号串中的符号,且最多向貌似句柄的符号串后看确定个数的符号,就能一点不回溯地识别该貌似句柄的符号串是否真正的句柄。它的基本思想是:在规范归约的过程中,一方面记住已移进和归约出的符号串,即记住“历史”,另一方面根据所用的产生式(规则)推测未来可能碰到的输入符号,即对未来进行“展望”。当一串貌似句柄的符号串呈现于分析栈的顶部时,能够根据所记载的“历史”、“展望”的信息以及“现实”中的输入符号三方面的材料,来确定符号栈顶部的符号串是否构成相对于某一规则左部的句柄,从而确定将要做的工作。

为了记住分析的“历史”和汇集全新的“展望”信息,LR分析技术这样来处理:将归约过程的“历史”和“展望”材料综合地抽象成某些状态,存放在一个状态栈中,栈中每个状态都概括了从分析开始直到某一归约阶段的全部“历史”和“展望”材料。因此,任何时候栈顶的状态都代表了整个“历史”和已推测出的“展望”信息,都可以从栈顶状态得知所要了解的一切,而无需自底向上翻阅整个栈。LR分析程序的每一步工作都是由栈顶状态和现行输入符号惟一确定的。根据文法,可以将各种状态下面临不同输入符号所要做的工作用一张表表示出来,然后用这张表直到整个分析过程的进行。

4. 这是因为,许多句型在归约过程中虽然分析的步数和过程不一样,但它们所处的状态有一些是一样的,而这些同样的状态在有穷自动机中只需要出现一个即可。

5. LR项目是在规则右部适当位置加一个圆点得到的,用圆点的位置来标记分析过程中的某个时刻。圆点的含义为:对规则右部的符号串,已从输入串看到可由圆点左部推出的符号子串,希望能进一步看到可由圆点右部推出的符号串;如果圆点右部为 ,则自然联想到可将

规则右部归约成规则左部。此时,圆点左部的符号子串一定是一个可归前缀。因此,项目刻画了在分析过程中一条规则的右部已有哪些成分被识别。

七、应用题:

1. 文法如下:

S→a | Λ | (T)

T→T, S | S

(1) 计算该文法的Firstvt和Lastvt;

(2) 构造算符优先关系表,并说明该文法是否是OPG文法;

(3) 计算优先函数;

(4) 给出串(a,a)#和(a,(a,a)) #的算符优先分析过程。

1.答案:

(1)Firstvt(S)={a, Λ, ( },Firstvt(T)={a, , , Λ, ( },Lastvt(S)={a, Λ, ) },Lastvt(T)={a, , , Λ, ) } (2)

该文法是OPG文法.

先给出该文法的语法树:

S

T

)

T

,

S

S

a

a

2. 下列文法是否为SLR(1)文法?若是,请构造相应的分析表。若不是,请说明理由。 S→Sab | bR R→S | a

2. 答案:

为 其LR(0)项目集规范族和goto 函数(识别活前缀的DFA)如下: I0 = {S'→·S, S→·Sab, S→·bR}

I1 = {S'→S·, S→S·ab}

I2 = {S→b·R, R→·S, R→·a, S→·Sab, S→·bR}

I3 = {S→Sa·b}

I4 = {S→bR·}

I5 = {R→S·, S→S·ab}

I6 = {R→a·}

I7 = {S→Sab·}

求FOLLOW集:

FOLLOW(S')={$}

FOLLOW(R)=FOLLOW(S)={a,$}

在I5中,出现移进-归约冲突,且FOLLOW(R)∩{a}={a}

因此,此文法不是SLR(1)文法。

3. 证明下面文法是SLR(1)文法,并构造其SLR分析表。

E→E+T|T

T→TF|F

F→F*|a|b

输入串b+ab*是该文法的句子吗?给出对该串的分析过程。答案:3. 该文法的拓广文法G'为

(0) E' → E(1) E → E+T

(2) E → T(3) T → TF

(4) T → F(5) F → F*

(6) F → a(7) F → b

其LR(0)项目集规范族和goto函数(识别活前缀的DFA)如下: I0 = {E'→·E, E→·E+T, E→·T, T→·TF, T→·F, F→·F*,

F→·a, F→·b}

I1 = {E'→E·, E→E·+T}

I2 = {E→T·, T→T·F, F→·F*, F→·a, F→·b}

I3 = {T→F·, F→F·*}

I4 = {F→a·}

I5 = {F→b·}

I6 = {E→E+·T, T→·TF, T→·F, F→·F*, F→·a, F→·b}

I7 = {T→TF·, F→F·*}

I8 = {F→F*·}

I9 = {E→E+T·, T→T·F, F→·F*, F→·a, F→·b}

求FOLLOW集:

FOLLOW(E)={+, $}

FOLLOW(T)={+, $, a, b}

FOLLOW(F)={+, $, a, b, *}

构造的SLR分析表如下:

显然,此分析表无多重定义入口,所以此文法是SLR文法。

4. 下面文法属于哪类LR文法?试构造其分析表。

S→(SR|a

R→,SR|)

输入串(a,a)是文法的句子吗?给出分析过程。

4.答案:

该文法的拓广文法G'为

(0) S' → S(1) S → (SR

(2) S → a(3) R → ,SR

(4) R → )

goto函数(识别活前缀的DFA)如下: I0 = {S'→·S, S→·(SR, S→·a}

I1 = {S'→S·}

I2 = {S→(·SR, S→·(SR, S→·a}

I3 = {S→a·}

I4 = {S→(S·R, R→·,SR, R→·)}

I5 = {S→(SR·}

I6 = {R→)·}

I7 = {R→,·SR, S→·(SR, S→·a}

I8 = {R→,S·R, R→·,SR, R→·)}

I9 = {R→,SR·}

每个LR(0)项目集中没有冲突。因此,此文法是LR(0)文法。其分析表如下:

5. 设文法G为

S → A

A → BA | ε

B → aB | b

(1)证明它是LR(1)文法;

(2)构造它的LR(1)分析表;

(3)给出输入符号串abab的分析过程。

G'的产生式为

(0) S' → S(1) S → A

(2) A → BA(3) A → ε

(4) B → aB(5) B → b

构造其LR(0)项目集规范族和goto函数(识别活前缀的DFA)如下:

I0 = { [S'→·S, $], [S→·A, $], [A→·BA, $], [A→·, $], [B→·aB, a/b/$], [B→·b, a/b/$]} I1 = {[S'→S·, $]}

I2 = {[S→A·, $]}

I3 = {[A→B·A, $], [A→·BA, $], [A→·, $], [B→·aB, a/b/$], [B→·b, a/b/$]}

I4 = {[B→b·, a/b/$]}

I5 = {[B→a·B, a/b/$], [B→·aB, a/b/$], [B→·b, a/b/$]}

I6 = {[A→BA·, $]}

I7 = {[B→aB·, a/b/$]}

该文法的LR(1)项目集规范族中没有冲突,所以该文法是LR(1)文法。

(2)构造LR(1)分析表如下:

以上分析表无多的定义入口,所以该文法为LR(1)文法。

(3)对于输入串abab,其分析过程如下:

6. 为下面的文法构造LALR(1)分析表

S→E

E→E+T | T

T→(E) | a

并给出对输入串(a+a)的分析过程。

6. 答案:

其拓广文法G':

(0) S' → S(1) S → E

(2) E → E+T(3) E → T

(4) T → (E)(5) T → a

goto函数(识别活前缀的DFA)如下:

I0 = {[S’→·S, $], [S→·E, $], [E→·E+T, $/+], [E→·T, $/+], [T→·(E), $/+], [T→·a, $/+]} I1 = {[S’→S·, $]}

I2 = {[S→E·, $], [E→E·+T, $/+]}

I3 = {[E→T·, $/+]}

I4 = {[T→(·E), $/+], [E→·E+T, )/+], [E→·T, )/+], [T→·(E), )/+], [T→·a, )/+]}

I5 = {[T→a·, $/+]}

I6 = {[E→E+·T, $/+], [T→·(E), $/+], [T→·a, $/+]}

I7 = {[T→(E·), $/+], [E→E·+T, )/+]}

I8 = {[E→T·, )/+]}

I9 = {[T→(·E), )/+}, [E→·E+T, )/+], [E→·T, )/+], [T→·(E), )/+], [T→·a, )/+]}

I10 = {[T→a·, )/+]}

I11 = {[E→E+T·, $/+]}

I12 = {[T→(E)·, $/+]}

I13 = {[E→E+·T, )/+], [T→·(E), )/+], [T→·a, )/+]}

I14 = {[T→(E·), )/+], [E→E·+T, )/+]}

I15 = {[E→E+T·, )/+]}

I16 = {[T→(E)·, )/+]}

合并同心的LR(1)项目集,得到LALR的项目集和转移函数如下:

I0 = {[S’→·S, $], [S→·E, $], [E→·E+T, $/+], [E→·T, $/+], [T→··(E), $/+], [T→·a, $/+]} I1 = {[S’→S·, $]}

I2 = {[S→E·, $], [E→E·+T, $/+]}

I3,8 = {[E→T·, $/+/)]}

I4,9 = {[T→(·E), $/+/)], [E→·E+T, )/+], [E→·T, )/+], [T→·(E), )/+], [T→·a, )/+]}

I5,10 = {[T→a·, $/+/)]}

I6,13 = {[E→E+·T, $/+/)], [T→·(E), $/+/)], [T→·a, $/+/)]}

I7,14 = {[T→(E·), $/+/)], [E→E·+T, )/+]}

I11,15 = {[E→E+T·, $/+/)]}

I12,16 = {[T→(E) ·, $/+/)]}

LALR分析表如下:

7. 已知文法

S →L.L

S →L

L →LB

L →B

B →0

B →1

用LR分析法说明符号串101.110是否文法的句子。

(1)拓广文法为G′,增加产生式S′→S

若产生式排序为:

0 S' →S

1 S →L.L

2 S →L

3 L →LB

4 L →B

5 B →0

6 B →1

由产生式知:

FIRST (S' ) = {0,1}

FIRST (S ) = {0,1}

FIRST (L ) = {0,1}

FIRST (B ) = {0,1}

FOLLOW(S' ) = {#}

FOLLOW(S ) = {#}

FOLLOW(L ) = {0,1,#}

FOLLOW(B ) = {0,1,#}

G′的LR(0)项目集族及识别活前缀的DFA如下图所示:

在I2中:

B →.0和B →.1为移进项目,S →L.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。

在I2、I8中:

FOLLOW(S) ∩{0,1}= { #} ∩{0,1}=

所以在I2 、I8中的移进-归约冲突可以由FOLLOW集解决,所以G是SLR(1)文法。(2)构造的SLR(1)分析表如下:

对输入串101.110#的分析过程

分析成功,说明输入串101.110是文法的句子。

8. 对于文法

S→AB

A→aB

B→b

(1) 构造LR(1)分析表;

(2) 给出用LR(1)分析表对输入符号串abab的分析过程。

9. 给定文法G[Z]:

①Z→C S

②C→if E then

③S→A=E

④E→E∨A

⑤E→A

⑥A→i

其中:Z、C、S、A、E∈V N;if、then、=、∨、i∈V T

a) 构造此文法的LR(0)项目集规范族,并给出识别活前缀的DFA。

b) 构造其SLR(1)分析表。

9. 答案:

1.首先拓广文法:在G中加入产生式0.Z'→Z,然后得到新的文法G',再求G'的识别全部活前缀的DFA:

I0:Z′→.Z

Z→.C S

C→.if E then

I1:Z′→Z.

I2:Z→C .S

S→.A=E

A→.i

I3:C→if .E then

E→.E∨A

E→.A

A→.i

I4:Z→C S.

I5:S→A.=E

I6:A→i.

I7:C→if E .then

E→E.∨A

I9:S→A=.E

E→.E∨A

E→.A

A→.i

I10:C→if E then.

I11:E→E∨.A

A→.i

I12:S→A=E.

E→E.∨A

I13:E→E∨A.

Follow(Z)={#}

Follow(C)={i}

Follow(S)={#}

Follow(E)={#,∨,then}

Follow(A)={=,# ,∨,then }

则可构造SLR(1)分析表为:

ACTION GOTO

0 if then =∨i # Z C S E A

0 S3 1 2

1 OK

2 S6 4 5

3 S67 8

4 r1

5 S9

6 r6r6r6r6

7 S10S11

8 r5r5r5

9 S612 8

10 r2

11 S613

12 S11r3

13 r4r4r4

10. 设有文法G[S]:

S→aA

A→Ab

A→b

求识别该文法所有活前缀的DFA;构造合适的LR分析表,并给出对输入串abb的分析过程。

解答:

(1).首先拓广文法:

在G中加入产生式0.S′→S,然后得到新的文法G′:

0.S′→S

1.S→aA

2.A→Ab

3.A→b

(2).再求G′的识别全部活前缀的DFA:

11.给定文法G[S] :

S →SaA|a

A →AbS|b

⑴请构造该文法的以LR(0) 项目集为状态的识别规范句型活前缀的DFA 。

⑵请构造该文法的LR(0) 分析表。

⑶什么是LR(0) 文法?该文法是LR(0) 文法吗?为什么?

⑷什么是SLR(1) 文法?该文法是SLR(1) 文法吗?为什么?

12. 下面文法属于哪类LR文法?试构造其分析表。

S→aSAB | BA

A→aA | B

B→ b

输入串abababb是文法的句子吗?给出分析过程。

12. 答案:

该文法的拓广文法G'为

(0) S' → S(1) S → aSAB

(2) S → BA(3) A → aA

(4) A → B(5) B → b

其LR(0)项目集规范族和goto函数(识别活前缀的DFA)如下:I0 = {S'→·S, S→·aSAB, S→·BA, B→·b}

I1 = {S'→S·}

I2 = {B→b·}

I3 = {S→a·SAB, S→·aSAB, S→·BA, B→·b}

I4 = {S→B·A, A→·aA, A→·B, B→·b}

I5 = {S→aS·AB, A→·aA, A→·B, B→·b}

I6 = {S→aSA·B, B→·b}

I7 = {A→a·A, A→·aA, A→·B, B→·b}

I8 = {A→B·}

I9 = {S→BA·}

I10 = {S→aSAB·}

I11 = {A→aA·}

求FOLLOW集:

FOLLOW(S')={$}

FOLLOW(S)={a,b,$}

FOLLOW(A)={a,b,$}

FOLLOW(B)={a,b,$}

编译原理习题及答案(整理后)

第一章 1、将编译程序分成若干个“遍”就是为了。 a.提高程序得执行效率 b.使程序得结构更加清晰 c.利用有限得机器内存并提高机器得执行效率 d.利用有限得机器内存但降低了机器得执行效率 2、构造编译程序应掌握。 a.源程序b.目标语言 c.编译方法d.以上三项都就是 3、变量应当。 a.持有左值b.持有右值 c.既持有左值又持有右值d.既不持有左值也不持有右值 4、编译程序绝大多数时间花在上。 a.出错处理b.词法分析 c.目标代码生成d.管理表格 5、不可能就是目标代码。 a.汇编指令代码b.可重定位指令代码 c.绝对指令代码d.中间代码 6、使用可以定义一个程序得意义。 a.语义规则b.语法规则 c.产生规则d.词法规则 7、词法分析器得输入就是。 a.单词符号串b.源程序 c.语法单位d.目标程序 8、中间代码生成时所遵循得就是- 。 a.语法规则b.词法规则 c.语义规则d.等价变换规则 9、编译程序就是对。 a.汇编程序得翻译b.高级语言程序得解释执行 c.机器语言得执行d.高级语言得翻译 10、语法分析应遵循。 a.语义规则b.语法规则 c.构词规则d.等价变换规则 二、多项选择题 1、编译程序各阶段得工作都涉及到。 a.语法分析b.表格管理c.出错处理 d.语义分析e.词法分析 2、编译程序工作时,通常有阶段。 a.词法分析b.语法分析c.中间代码生成 d.语义检查e.目标代码生成 三、填空题 1、解释程序与编译程序得区别在于。 2、编译过程通常可分为5个阶段,分别就是、语法分析、代码优化与目标代码生成。 3、编译程序工作过程中,第一段输入就是,最后阶段得输出为程序。

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

《编译原理》期末试题(一) 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.编译程序是对高级语言程序的解释执行。(× ) 2.一个有限状态自动机中,有且仅有一个唯一的终态。(×) 3.一个算符优先文法可能不存在算符优先函数与之对应。(√ ) 4.语法分析时必须先消除文法中的左递归。(×) 5.LR分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。(√) 6.逆波兰表示法表示表达式时无须使用括号。(√ ) 7.静态数组的存储空间可以在编译时确定。(×) 8.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。(×) 9.两个正规集相等的必要条件是他们对应的正规式等价。(× ) 10.一个语义子程序描述了一个文法所对应的翻译工作。(×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.词法分析器的输出结果是_____。 A.( ) 单词的种别编码B.( ) 单词在符号表中的位置 C.( ) 单词的种别编码和自身值D.( ) 单词自身值 2.正规式M 1 和M 2 等价是指_____。 A.( ) M1和M2的状态数相等B.( ) M1和M2的有向边条数相等C.( ) M1和M2所识别的语言集相等D.( ) M1和M2状态数和有向边条数相等3.文法G:S→xSx|y所识别的语言是_____。 A.( ) xyx B.( ) (xyx)* C.( ) xnyxn(n≥0) D.( ) x*yx* 4.如果文法G是无二义的,则它的任何句子α_____。 A.( )最左推导和最右推导对应的语法树必定相同 B.( ) 最左推导和最右推导对应的语法树可能不同 C.( ) 最左推导和最右推导必定相同 D.( )可能存在两个不同的最左推导,但它们对应的语法树相同 5.构造编译程序应掌握______。 A.( )源程序B.( ) 目标语言 C.( ) 编译方法D.( ) 以上三项都是 6.四元式之间的联系是通过_____实现的。

编译原理56章作业答案

第五章 练习5.1.1: 对于图5-1中的SDD,给出下列表达式对应的注释语法分析树: 1)(3+4)*(5+6)n 练习5.2.4: 这个文法生成了含“小数点”的二进制数: S->L.L|L L->LB|B B->0|1 设计一个L属性的SDD来计算S.val,即输入串的十进制数值。比如,串101.101应该被翻译为十进制的5.625。提示:使用一个继承属性L.side来指明一个二进制位在小数点的哪一边。 答: 元文法消除左递归后可得到文法: S->L.L|L L->BL’ L’->BL’|ε B->0|1 使用继承属性L.side指明一个二进制位数在小数点的哪一边,2表示左边,1表示右边 使用继承属性m记录B的幂次 非终结符号L和L’具有继承属性inh、side、m和综合属性syn

练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。 E-〉E+T|T T-〉num.num|num 1)给出一个SDD来确定每个项T和表达式E的类型 2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数 答: 练习5.4.4:为下面的产生式写出一个和例5.10类似的L属性SDD。这里的每个产生式表

示一个常见的C语言中的那样的控制流结构。你可能需要生成一个三地址语句来跳转到某个标号L,此时你可以生成语句goto L 1)S->if (C) S1 else S2 2)S->do S1 while (C) 3)S->’{’ L ‘}’; L -> LS|ε 请注意,列表中的任何语句都可以包含一条从它的内部跳转到下一个语句的跳转指令,因此简单地为各个语句按序生成代码是不够的。 第六章 练习6.1.1:为下面的表达式构造DAG ((x+y)-((x+y)*(x-y)))+((x+y)*(x-y)) 答:DAG如下

《编译原理》练习题

《编译原理》练习题一 一、填空题(每空1分) 1.设G [S ]是一个文法,我们把能由文法的 (1) 推导出来的符号串α称为G 的一个句型。当句型α仅由 (2) 组成时 (即α∈V T * ),则将它称为G 产生的句子。 2.从某一给定的状态q 出发,仅经过若干条 (3) 的矢线所能达到的状态所组成的集合称为ε-CLOSURE(q)。 3.设G=(V N ,V T ,P,S)是一文法,我们说G 中的一个符号X ∈V N ∪V T 是有用的,是指X 至少出现在 (4) 的推导过程中,否则,就说X 是无用的。我们将不含形如A→A 的产生式和不含无用符号及无用产生式的文法称为 (5) 。 4.我们常采用形如 (class, value)的二元式作为一个单词的 (6) 。其中,class 是一个整数,用来指示该单词的 (7) ,value 则是单词之值。 5.一个文法G[S]可表示成形如 (8) 的四元式。其中V N ,V T ,P 均为非空的有限集,分别称为非终结符号集、终结符号集和产生式集, S ∈V N 为文法的开始符号。此外,将出现在各产生式左部和右部的一切符号所组成的集合称为 (9) ,记作V 。显然,V=V N ∪V T ,V N ∩V T =?。 6.通常,可通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义,用 (10) 构造词法分析程序;另外一种途径是所谓词法分析程序的 (11) 。 7.设G 为一文法,A→α是G 的一个产生式,如果α具有υA δ的形式,其中υ,δ不同时为ε,则称产生式A→α是 (12) 。若存在推导δυαA A * ??,则 称产生式A→α是 (13) 。 8.设M=(K,Σ,f,S 0,Z)为一DFA ,并设s 和t 是M 的两个不同状态,我们说状态s,t 为某一输入串w (14) ,是指从s,t 中之一出发,当扫视完w 之后到达M 的终态,但从其中的另一个状态出发,当扫视完同一个w 后而进入 (15) 。 9.把最右推导称为 (16) ,而把右句型称为 (17) 。 10.如果从状态转换图的初态出发,分别沿着一切可能的路径到达 (18) ,并

编译原理作业集第七章

第七章语义分析和中间代码产生 本章要点 1. 中间语言,各种常见中间语言形式; 2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译; 3. 过程调用的处理; 4. 类型检查; 本章目标 掌握和理解中间语言,各种常见中间语言形式;各种语句到中间语言的翻译;以及类型检查等内容。 本章重点 1.中间代码的几种形式,它们之间的相互转换:四元式、三元式、逆波兰表示; 3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式; 4.各种控制流语句的翻译及其中间代码格式; 5.过程调用的中间代码格式; 6.类型检查; 本章难点 1. 各种语句的翻译; 2. 类型系统和类型检查; 作业题 一、单项选择题: 1. 布尔表达式计算时可以采用某种优化措施,比如A and B用if-then-else可解释为_______。 a. if A then true else B; b. if A then B else false; c. if A then false else true; d. if A then true else false; 2. 为了便于优化处理,三地址代码可以表示成________。 a. 三元式 b. 四元式 c. 后缀式 d. 间接三元式 3. 使用三元式是为了________:

a. 便于代码优化处理 b. 避免把临时变量填入符号表 c. 节省存储代码的空间 d. 提高访问代码的速度 4. 表达式-a+b*(-c+d)的逆波兰式是________。 a. ab+-cd+-*; b. a-b+c-d+*; c. a-b+c-d+*; d. a-bc-d+*+; 5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表示是_______。 a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=; 6. 在一棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。 a. 抽象语法树; b. 语法规则; c. 依赖图; d. 三地址代码; 7. 按照教材中的约定,三地址语句if x relop y then L表示成四元式为。 a. (relop,x,y,L); b. (relop,L,x,y); c. (relop,x,L,y); d. (L,x,y,relop); 8. 在编译程序中,不是常见的中间语言形式。 a.波兰式; b. 三元式; c. 四元式; d. 抽象语法树; 9. 在编译程序中安排中间代码生成的目的是________。 a. 便于提高编译效率; b. 便于提高分析的正确性; c. 便于代码优化和目标程序的移植; d.便于提高编译速度; 10. 按照教材中的约定,下面不是类型表达式: a. boolean; b. type-error; c. real; d. DAG; 11. 一个Pascal函数 function f ( a, b:char ) :↑integer; …… 其作用域类型是: a. char×integer; b. char×char; c. char×pointer(integer); d. integer×integer; 12. 因为标识符可用于多种情况,比如常量标识符、变量标识符、过程标识符等等。因此,在符号表中为了给出各个符号的标志,常给标识符引入一个属性kind,然后在相应产生式的语义动作中添加给kind属性赋值的语句。比如,在在产生式D id:T的语义动作中添加赋值语句id.kind=。 a. V AR; b. CONSTANT; c. PROC; d. FUNC; 13. 下面情况下,编译器需要创建一张新的符号表。 a. 过程调用语句; b. 标号说明语句; c. 数组说明语句; d.记录说明语句; 14. 函数function f(a,b:char):↑integer;… 所以f函数的类型表达式为: a. char×char→pointer(integer); b. char×char→pointer; c. char×char→integer; d. char×char→integer (pointer) 15. 如果一个语言的编译器能保证编译通过的程序,在运行时不会出现类型错误,则称该语言是。 a. 静态的; b. 强类型的; c. 动态的; d. 良类型的; 一.答案:1. b;2. d;3. b;4. d;5. c;6. c.;7. a;8. a;9. c;10. d;11. b;12. a;13. d; 14. a;15. b;

编译原理第4章作业答案

编译原理第4章作业 答案 本页仅作为文档封面,使用时可以删除 This document is for reference only-rar21year.March

第四章 习题4.2.1:考虑上下文无关文法: S->S S +|S S *|a 以及串aa + a* (1)给出这个串的一个最左推导 S -> S S * -> S S + S * -> a S + S * -> a a + S * -> aa + a* (3)给出这个串的一棵语法分析树 习题4.3.1:下面是一个只包含符号a和b的正则表达式的文法。它使用+替代表示并运算的符号|,以避免和文法中作为元符号使用的竖线相混淆: rexpr→ rexpr + rterm | rterm rterm→rterm rfactor | rfactor rfactor→ rfactor * | rprimary rprimary→a | b 1)对这个文法提取公因子 2)提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗? 3)提取公因子之后,原文法中消除左递归 4)得到的文法适用于自顶向下的语法分析吗? 解

1)提取左公因子之后的文法变为 rexpr→ rexpr + rterm | rterm rterm→rterm rfactor | rfactor rfactor→ rfactor * | rprimary rprimary→a | b 2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法 3)消除左递归后的文法

rexpr -> rterm rexpr’ rexpr’-> + rterm rexpr’|ε rterm-> rfactor rterm’ rterm’-> rfactor rterm’|ε rfactor-> rprimay rfactor’ rfactor’-> *rfactor’|ε rprimary-> a | b 4)该文法无左递归,适合于自顶向下的语法分析 习题4.4.1:为下面的每一个文法设计一个预测分析器,并给出预测分析表。可能要先对文法进行提取左公因子或消除左递归 (3)S->S(S)S|ε (5)S->(L)|a L->L,S|S 解 (3) ①消除该文法的左递归后得到文法 S->S’ S’->(S)SS’|ε ②计算FIRST和FOLLOW集合 FIRST(S)={(,ε} FOLLOW(S)={),$} FIRST(S’)={(,ε} FOLLOW(S’)={),$} ③构建预测分析表

编译原理习题及答案(整理后)

第一章 1、将编译程序分成若干个“遍”是为了。 b.使程序的结构更加清晰 2、构造编译程序应掌握。 a.源程序b.目标语言 c.编译方法 3、变量应当。 c.既持有左值又持有右值 4、编译程序绝大多数时间花在上。 d.管理表格 5、不可能是目标代码。 d.中间代码 6、使用可以定义一个程序的意义。 a.语义规则 7、词法分析器的输入是。 b.源程序 8、中间代码生成时所遵循的是- 。 c.语义规则 9、编译程序是对。 d.高级语言的翻译 10、语法分析应遵循。 c.构词规则 二、多项选择题 1、编译程序各阶段的工作都涉及到。 b.表格管理c.出错处理 2、编译程序工作时,通常有阶段。 a.词法分析b.语法分析c.中间代码生成e.目标代码生成 三、填空题 1、解释程序和编译程序的区别在于是否生成目标程序。 2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码生成、代码优化和目标代码生成。 3、编译程序工作过程中,第一段输入是源程序,最后阶段的输出为标代码生成程序。 4、编译程序是指将源程序程序翻译成目标语言程序的程序。

一、单项选择题 1、文法G:S→xSx|y所识别的语言是。 a. xyx b. (xyx)* c. x n yx n(n≥0) d. x*yx* 2、文法G描述的语言L(G)是指。 a. L(G)={α|S+?α , α∈V T*} b. L(G)={α|S*?α, α∈V T*} c. L(G)={α|S*?α,α∈(V T∪V N*)} d. L(G)={α|S+?α, α∈(V T∪V N*)} 3、有限状态自动机能识别。 a. 上下文无关文法 b. 上下文有关文法 c.正规文法 d. 短语文法 4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立。 a. 若f(a)>g(b),则a>b b.若f(a)

编译原理 第一章 习题解答

第一章习题解答 2.编译程序有哪些主要构成成分?各自的主要功能是什么? 编译程序的主要构成成分有:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。 (1)词法分析程序:从左到右扫描源程序,识别单词及其有关属性; (2)语法分析程序:分析源程序的结构, 判别它是否为相应程序设计语言中的一个合法程序; (3)语义分析程序:审查源程序有无语义错误,为代码生成阶段收集类型信息; (4)中间代码生成程序:将源程序变成一种内部表示形式; (5)代码优化程序:对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效; (6)目标代码生成程序:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码; (7)表格管理程序:保存编译过程中的各种信息; (8)出错处理程序:若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。 3.什么是解释程序?它与编译程序的主要不同是什么? 解释程序接受某个语言的程序并立即运行这个源程序。它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且生成结果,它特别适合程序员交互方式的工作情况。 而编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序,这个二进制代码程序再机器上运行以生成结果。 它们的主要不同在于:解释程序是边解释边执行,解释程序运行结束即可得到该程序的运行结果,而编译程序只是把源程序翻译成汇编或者二进制程序,这个程序再执行才能得到程序的运行结果。(当然还有其他不同,比如存储组织方式不同)

编译原理课后习题答案

第1 章 1、编译过程包括哪几个主要阶段及每个 阶段的功能。 答案:编译过程包括词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成5 个阶段。词法分析的功能是对输入的高级语言源程序进行词法分析,识别其中的单词符号,确定它们的种类,交给语法分析器,即把字符串形式的源程序分解为单词符号串形式。语法分析的功能是在词法分析结果的基础上,运用语言的语法规则,对程序进行语法分析,识别构成程序的各类语法范畴及它们之间的层次关系,并把这种层次关系表达成语法树的形式。词义分析和中间代码生成的功能是在语法分析的基础上,对程序进行语义分析,“理解”其含义,产生出表达程序语义的内部表达形式(中间代码)。优化的功能是按照等价变换的原则,对语义分析器产生的中间代码序列进行等价变换,删除其中多余的操作,对耗时耗空间的代码进行优化,以期最后得到高效的可执行代码。目标代码生成的功能是把优化后的中间代码变换成机器指令代码,得到可在目标机器上执行的机器语言程序。 第2 章 1、写一上下文无关文法G,它能产生配 对的圆括号串(如:(),(()),()(())等,甚至 包括0 对括号) 文法为:S→(L)|LS|L L→S| ε 2 、已知文法G :E→E+T|E-T|T T→T*F|T/F|F F→(E) |i (1)给出i+i*i,i*(i-i)的最左推导,最右推导以及语法树。 (2)i-i+i 哪个算符优先。 【解答】 (1)最左推导:E?E+T?T+T? F+T ? i+T ? i+T*F ? i+F*F ?i+i*F ?i+i*i E?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*i E?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) i+i*i 以及i*(i-i)的语法树如下所示: (2)i-i+i 的语法树如下图所示。 从上图的语法树可知:“-”的位置位 于“+”的下层,也就是前面两个i 先进 行“-”运算,再与后面的i 进行“+” 运算,所以“-”的优先级高于“+”的 优先级。 3 、文法G: E→ET+|T T→TF*|F F→FP↑|P P→E|i (1)试证明符号串TET+*i↑是G 的一 个句型(要求画出语法树). (2)写出该句型的所有短语,直接短语和句柄. 【解答】(1)采用最右推导: E?T?F? FP↑? Fi↑? Pi↑? Ei↑ ? Ti↑? TF*i↑? TP*i↑? TE*i↑? TET+*i↑ 语法树如下图所示。 从文法G 的起始符号出发,能够推导 出符号串TET+*i↑,所以给定符号串是文法G的句型。 (2) 该句型的短语有: ET+,TET+*,i ,TET+*i↑ 直接短语有:ET+, i 句柄是:ET+ 4、已知文法G:S→iSeS|iS|i ,该文法 是二义文法吗?为什么? 【解答】该文法是二义文法。 因为对于句子iiiei 存在两种不同的最 左推导: 第 1 种推导:S? iSeS? iiSeS? iiieS? iiiei 第2种推导:S?iS?iiSeS?iiieS?iiiei 第3 章 1、用正规式描述下列正规集: (1)C 语言的十六进制整数; (2)以ex 开始或以ex 结束的所有小写字母构成的符号串; (3)十进制的偶数。 【解答】 (1)C 语言十六进制整数以0x 或者0X 开头,所以一般形式应该为(+|-|ε) (0x|0X)AA*,其中前面括号表示符号, 可以有正号、负号,也可以省略(用ε表示)默认是正数,A 表示有资格出现在十六进制整数数位上的数字,AA*表示一位或者多位(一个或者多个数字的

编译原理试题集33493

第一章引论 一.单项选择题 1. 如果一个编译程序能产生不同于其宿主机的机器代码,则称它为:___________________ 。 a. 诊断编译程序 b. 优化编译程序 c. 交叉编译程序 d. 可变目标编译程序 2. 编译程序将高级语言程序翻译成_________ 。 a. 机器语言程序或高级语言程序 b. 汇编语言或机器语言程序 c. 汇编语言程序或高级 语言程序d. 中间语言程序或高级语言程序 3. 下面的四个选项中,__________不是编译程序的组成部分。 a. 词法分析程序 b. 代码生成程序 c. 设备管理程序 d. 语法分析程序 4. 现代多数实用编译程序所产生的目标代码都是一种可重定位的指令代码,在运行前必须借助于一个_______把各个目标模块,包括系统提供的库模块连接在一起,确定程序变量或常 数在主存中的位置,装入内存中制定的起始地址,使之成为一个可运行的绝对指令代码的程序。 a. 重定位程序; b. 解释程序; c. 连接装配程序; d. 诊断程序; 5. 从编译程序的角度说,源程序中的错误通常分为________两大类。 a. 词法错误和语法错误; b. 语法错误和语义错误; c. 编辑错误和诊断错误; d. 词法错误和语义错误; 6. 下面对编译原理的有关概念正确描述的是:____。 a. 目标语言只能是机器语言 b. 编译程序处理的对象是源语言。 c. Lex是语法分析自动生成器 d. 解释程序属于编译程序 7. 目标代码生成阶段所生成的目标代码的形式不可能是____。 a. 绝对指令代码 b. 可充定位的指令代码。 c. 汇编指令代码 d. 三地址代码 8. 语义错误是指源程序中不符合语义规则的错误,不包括:____ a. 非法字符错误 b. 类型不一致错误。 c. 作用域错误 d. 说明错误

编译原理一些习题答案

第2章形式语言基础 2.2 设有文法G[N]: N -> D | ND D -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (1)G[N]定义的语言是什么? (2)给出句子0123和268的最左推导和最右推导。 解答: (1)L(G[N])={(0|1|2|3|4|5|6|7|8|9)+} 或L(G[N])={α| α为可带前导0的正整数} (2) 0123的最左推导:N ? ND ? NDD ? NDDD ? DDDD ? 0DDD ? 01DD ? 012D ? 0123 0123的最右推导:N ? ND ? N3 ? ND3 ? N23 ? ND23 ? N123 ? D123 ? 0123 268的最左推导:N ? ND ? NDD ? DDD ? 2DDD ? 26D ? 268 268的最右推导:N ? ND ? N8 ? ND8 ? N68 ? D68 ? 268 2.4 写一个文法,使其语言是奇数的集合,且每个奇数不以0开头。 解答: 首先分析题意,本题是希望构造一个文法,由它产生的句子是奇数,并且不以0开头,也就是说它的每个句子都是以1、3、5、7、9中的某个数结尾。如果数字只有一位,则1、3、5、7、9就满足要求,如果有多位,则要求第1位不能是0,而中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个文法分3部分来完成。分别用3个非终结符来产生句子的第1位、中间部分和最后一位。引入几个非终结符,其中,一个用作产生句子的开头,可以是1-9之间的数,不包括0,一个用来产生句子的结尾,为奇数,另一个则用来产生以非0整数开头后面跟任意多个数字的数字串,进行分解之后,这个文法就很好写了。 N -> 1 | 3 | 5 | 7 | 9 | BN B -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | B0 2.7 下面文法生成的语言是什么? G1: S->AB A->aA| εB->bc|bBc G2: S->aA|a A->aS 解答: B ? bc B ? bBc? bbcc B ? bBc? bbBcc ? bbbccc …… A ?ε A ? aA ? a A ? aA ? aaA ? aa …… ∴S ? AB ? a m b n c n , 其中m≥0,n≥1即L(G1)={ a m b n c n | m≥0,n≥1} S ? a S ? aA ? aaS ? aaa S ? aA ? aaS ? aaaA ?aaaaS ? aaaaa …… ∴S ? a2n+1 , 其中n≥0 即L(G2)={ a2n+1 | n≥0} 2.11 已知文法G[S]: S->(AS)|(b) A->(SaA)|(a) 请找出符号串(a)和(A((SaA)(b)))的短语、简单短语和句柄。

编译原理填空集锦

1-01.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,之间代码生成,代码优化等几个基本阶段,同时还会伴有表格处理和出错处理 . 1-02.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序. 1-03.编译方式与解释方式的根本区别在于是否生成目标代码 . 1-04.翻译程序是这样一种程序,它能够将用甲语言书写的程序转换成与其等价的用乙语言书写的程序 . 1-05.对编译程序而言,输入数据是源程序,输出结果是目标程序. 1-06.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段: 编译阶段和运行阶段 .如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分 为三个阶段:编译阶段, 汇编阶段和运行阶段 . 1-07.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。 1-08.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。其中,词法分析器用于识别单词。 1-09.编译方式与解释方式的根本区别为是否生成目标代码。 2-01.所谓最右推导是指:任何一步α?β都是对α中最右非终结符进行替换的。 2-02.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。 2-03.产生式是用于定义语法成分的一种书写规则。 2-04.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x│S x,x∈VT*} 。

2-05.设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈V*),则称x是文法的一个句型。 2-06.设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈VT*),则称x是文法的一个句子。 3-01.扫描器的任务是从源程序中识别出一个个单词符号。 4-01.语法分析最常用的两类方法是自上而下和自下而上分析法。 4-02.语法分析的任务是识别给定的终极符串是否为给定文法的句子。 4-03.递归下降法不允许任一非终极符是直接左递归的。 4-04.自顶向下的语法分析方法的关键是如何选择候选式的问题。 4-05.递归下降分析法是自顶向上分析方法。 4-06.自顶向下的语法分析方法的基本思想是:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。 5-01.自底向上的语法分析方法的基本思想是:从给定的终极符串开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。 5-02.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地向上进行直接归约,力求归约到文法的开始符号。 5-03.简单优先方法每次归约当前句型的句柄,算符优先方法每次归约当前句型的最左素短语,二者都是不断移进输入符号,直到符号栈顶出现可归约串的尾,再向前找到可归约串的头,然后归约。 5-04.在LR(0)分析法的名称中,L的含义是自左向右的扫描输入串,R 的含义是最左归约,0 的含义是向貌似句柄的符号串后查看0个输入符号。 5-05.在SLR(1)分析法的名称中,S的含义是简单的。

编译原理课后习题答案+清华大学出版社第二版

第 1 章引论 第1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 答案: 一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

编译原理 作业标准答案

《编译原理》第一次作业参考答案 一、下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)? 1.b*(ab*ab*)* 所有含有偶数个a的由a和b组成的字符串. 2.c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)* 答案一:所有至少含有1个a和1个b的由a,b和c组成的字符串. 答案二:所有含有子序列ab或子序列ba的由a,b和c组成的字符串. 说明:答案一要比答案二更好,因为用自然语言描述是为了便于和非专业的人员交流,而非专业人员很可能不知道什么是“子序列”,所以相比较而言,答案一要更“自然”. 二、设字母表∑={a,b},用正则表达式(只使用a,b, ,|,*,+,?)描述下列语言: 1.不包含子串ab的所有字符串. b*a* 2.不包含子串abb的所有字符串. b*(ab?)* 3.不包含子序列abb的所有字符串. b*a*b?a* 注意:关于子串(substring)和子序列(subsequence)的区别可以参考课本第119页方框中的内容. ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ ~\(≧▽≦)/~ 《编译原理》第二次作业参考答案 一、考虑以下NFA: 1.这一NFA接受什么语言(用自然语言描述)? 所有只含有字母a和b,并且a出现偶数次或b出现偶数次的字符串. 2.构造接受同一语言的DFA. 答案一(直接构造通常得到这一答案):

答案二(由NFA构造DFA得到这一答案): 二、正则语言补运算 3.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串. 1.画出一个DFA,该DFA恰好识别所有不含011子串的所有二进制串.

(2020年整理)编译原理期末总复习题(含答案).doc

第八节习题一、单项选择题 1、将编译程序分成若干个“遍”是为了 b 。 a.提高程序的执行效率 b.使程序的结构更加清晰 c.利用有限的机器内存并提高机器的执行效率 d.利用有限的机器内存但降低了机器的执行效率 2、构造编译程序应掌握 d 。 a.源程序b.目标语言 c.编译方法d.以上三项都是 3、变量应当 c 。 a.持有左值b.持有右值 c.既持有左值又持有右值d.既不持有左值也不持有右值 4、编译程序绝大多数时间花在 b 上。 a.出错处理b.词法分析 c.目标代码生成d.管理表格 5、 d 不可能是目标代码。 a.汇编指令代码b.可重定位指令代码 c.绝对指令代码d.中间代码 6、使用 a 可以定义一个程序的意义。 a.语义规则b.词法规则 c.产生规则d.词法规则 7、词法分析器的输入是 a 。 a.单词符号串b.源程序 c.语法单位d.目标程序 8、中间代码生成时所遵循的是- d 。 a.语法规则b.词法规则 c.语义规则d.等价变换规则 9、编译程序是对 d 。 a.汇编程序的翻译b.高级语言程序的解释执行 c.机器语言的执行d.高级语言的翻译 10、语法分析应遵循 b 。 a.语义规则b.语法规则 c.构词规则d.等价变换规则 解答 1、将编译程序分成若干个“遍”是为了使编译程序的结构更加清晰,故选b。 2、构造编译程序应掌握源程序、目标语言及编译方法等三方面的知识,故选d。 3、对编译而言,变量既持有左值又持有右值,故选c。 4、编译程序打交道最多的就是各种表格,因此选d。 5、目标代码包括汇编指令代码、可重定位指令代码和绝对指令代码3种,因此不是目标代码的只能选d。 6、词法分析遵循的是构词规则,语法分析遵循的是语法规则,中间代码生成遵循的是语义规则,并且语义规则可以定义一个程序的意义。因此选a。 7、b 8、c 9、d 10、c 二、多项选择题

编译原理作业集-第三章-修订版

第三章词法分析 本章要点 1.词法分析器设计, 2.正规表达式与有限自动机, 3.词法分析器自动生成。 本章目标: 1.理解对词法分析器的任务,掌握词法分析器的设计; 2.掌握正规表达式与有限自动机; 3.掌握词法分析器的自动产生。 本章重点: 1.词法分析器的作用和接口,用高级语言编写词法分析器等内容,它们与词法分析器的实现有关。应重点掌握词法分析器的任务与设计,状态转换图等内容。 2.掌握下面涉及的一些概念,它们之间转换的技巧、方法或算法。 (1)非形式描述的语言?正规式 (2)正规式→ NFA(非确定的有限自动机) (3)NFA → DFA(确定的有限自动机) (4)DFA →最简DFA 本章难点 (1)非形式描述的语言?正规式 (2)正规式→ NFA(非确定的有限自动机) (3)NFA → DFA(确定的有限自动机) (4)DFA →最简DFA

作业题 一、单项选择题 (按照组卷方案,至少15道) 1. 程序语言下面的单词符号中,一般不需要超前搜索 a. 关键字 b. 标识符 c. 常数 d. 算符和界符 2. 在状态转换图的实现中,一般对应一个循环语句 a. 不含回路的分叉结点 b. 含回路的状态结点 c. 终态结点 d. 都不是 3. 用了表示字母,d表示数字, ={l,d},则定义标识符的正则表达式可以是:。 (a)ld*(b)ll*(c)l(l | d)*(d)ll* | d* 4. 正规表达式(ε|a|b)2表示的集合是 (a){ε,ab,ba,aa,bb} (b){ab,ba,aa,bb} (c){a,b,ab,aa,ba,bb} (d){ε,a,b,aa,bb,ab,ba} 5. 有限状态自动机可用五元组(V T,Q,δ,q0,Q f)来描述,设有一有限状态自动机M的定义如下: V T={0,1},Q={q0,q1,q2},Q f={q2},δ的定义为: δ(q0,0)=q1δ(q1,0)=q2 δ(q2,1)=q2δ(q2,0)=q2 M所对应的状态转换图为。

编译原理作业参考答案

第1章引言 1、解释下列各词 源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。 源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。 目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。目标程序 (结果程序)一般可由计算机直接执行。 低级语言:机器语言和汇编语言。 高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。 翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目 标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。 编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言), 然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。 解释程序: 以该语言写的源程序作为输入,但不产生目标程序。按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。 2、什么叫“遍” 指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。

3、简述编译程序的基本过程的任务。 编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。 词法分析:输入源程序,进行词法分析,输出单词符号。 语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。 中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。 优化:对中间代码进行优化处理。 目标代码生成:把中间代码翻译成目标语言程序。 4、编译程序与解释程序的区别 编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。 5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗 编译程序的5个阶段中,词法分析,语法分析,语义分析和代码生成生成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标代码。 6、编译程序的分类 目前基本分为:诊断编译程序,优化编译程序,交叉编译程序,可变目标编译程序。

编译原理复习题目集答案

第4章词法分析 重点内容:正规式转化为DFA a、正规式->NFA b、NFA -> DFA(子集法) c、DFA化简(分割法) 题目1:课件例题: a、为R=(a|b)*(aa|bb)(a|b)*构造NFA b、从NFA构造DFA的算法 c、化简

题目2: 4.7 例1:构造正规式相应的DFA:1(0|1)*101 按照以下三步: (1)由正规表达式构造转换系统(NFA) (2)由转换系统(NFA)构造确定的有穷自动机DFA (3)DFA的最小化 答:(1)构造与1(0|1)*101等价的NFA (2)将NFA转换成DFA:采用子集法,即DFA的每个状态对应NFA的一个状态集合: 除X,A外,重新命名其他状态:

1、将M 的状态分成非终态和终态集{X,A,B,C}和{D}。 2、寻找子集中不等价状态{X,A,B,C}=>{X},{A,B}{C}=>{X}{A}{B}{C},无需合并。 最后生成 DFA : 题目3:自习、书本练习4.7,参考答案见《z4 书本练习4.7.doc 》 已知文法G[S]: S →aA|bQ A →aA|bB|b B →bD|aQ Q →aQ|bD|b E →aB|bF F →bD|aE|b 1、 构由于不可到达,去除E 、F 相关的多余产生式 2、 由新的G[S]构造NFA 如下

5、使用分割法化简以上DFA G: 5.1 令G={(0,1,3,4,6),(2,5)}// 分别为非终态和终态集 5.2 由{0,1,3,4,6}a={1,3},{0,1,3,4,6}b={3,2,5,6,4} 将{0,1,3,4,6}划分为 {0,4,6}{1,3},得G={(0,4,6),(1,3),(2,5)} 5.3 由{0,4,6}b={3,6,4},将之划分为{0},{4,6},得G={(0),(4,6),(1,3),(2,5)} 5.4 观察后,G中状态不可再分,为最小化DFA。 6、分别用 0,4,1,2代表各状态,DFA状态转换图如下: 造相应的最小的DFA 第5章自顶向下的语法分析 重点内容:LL(1)文法 a、去除左递归 b、LL(1)文法的判定(first、follow、select集) c、预测分析表 d、使用栈和预测分析表对输入串的分析 题目1:课件例题:消除左递归+判定+分析 算术表达式文法G E→E+T│T T→T*F│F F→(E)│I d、分析输入串i+i*i#

相关文档
最新文档