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

合集下载

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

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

第四章语法分析—自上而下分析本章要点1. 语法分析器的功能;2. 自上而下分析方法,LL(1) 文法3. 递归下降分析程序构造;4. 预测分析表的构造及预测分析过程;5. LL(1) 分析中的错误处理。

本章目标理解和掌握语法分析器的功能、自上而下分析所面临的问题、LL (1)分析法、递归下降分析的构造过程、预测分析程序等内容。

本章重点1.语法分析器的功能,自上而下的基本概念2.LL ( 1)文法的条件及其判别,计算first 集和follow 集3.递归下降分析方法、预测分析表的构造及其预测过程。

本章难点1. 非终结符的First 集合,产生式候选的First 集合,非终结符的follow 集合的求解;2. 左递归消除;3. 递归下降分析程序的编写;作业题一、单项选择题:1. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于分析法。

a.自左至右b.自顶向下c.自底向上d.自右向左 2. 上下文无关文法可以用来描述。

a.正则表达式b.正规文法c.扩展的BNFd.翻译模式3. 自上而下分析面临的四个问题中,不包括a.需消除左递归;b.存在回朔;c.虚假匹配;d.寻找可归约串4. 语法分析器接收以 ________ 为单位的输入,并产生有关信息供以后各阶段使用。

a.表达式;b.产生式;c.单词;d.语句;5. 自上而下分析的主旨是,对任何单词符号串,试图用一切可能的办法,从文法开始符号 (根结点)出发, ________ 。

a.为输入串寻找最右推导;b.为输入串寻找最左直接子树;c.为输入串建立最右直接子树;d.为输入串寻找最左推导;6. 把规则T T F | T*F 表示成扩展的巴克斯范式以后,画出它的语法图应该是。

7. 下列文法中, ________ 是LL(1)文法。

a. S T aSb|abb. S T ab|Sab8. 设有文法G :S T Ap|Bq A T a|cA B T b|dB则,First(Ap)={ ______________ } a. a,c b. b,d c. p, q d. A, p.答案:1. b ; 2. c ; 3. d ; 4. c ; 5. d ; 6.图 a ;、填空题:1. _________________________________________________ 语法分析器的工作本质上就是按 ,识别输入符号串是否为一个句子。

编译原理 第四章习题

编译原理 第四章习题

S→aA A→Ab|b (1) 构造识别该文法项目活前缀的DFA (2) 判定该文法是否为LR(0)文法。若是的话构造相应的LR分析 表。 (3) 对句子abbb#进行分析。、 6.已知文法G[S] S→ r D D→ D , i D→ i (1) 构造识别该文法项目活前缀的DFA (2) 判定该文法为哪类LR文法?构造相应. 对文法G[S] S→a|∧|(T) T→T,S|S (1) 给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。 (2) 对文法G,进行改写,然后对每个非终结符写出不带回 溯的递归子程序。 (3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。 (4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的 句子。 2. 已知文法G[S]: S→MH|a H→LSo|ε K→dML|ε L→eHf M→K|bLM (1)求出各个非终结符的First集Follow集。 (2)判断G是否是LL(1)文法,如果是,构造LL(1)分析表。 3.已知文法G[Z] Z→aAAa A→bF’b F’→F F→cF|c (1) 求出各个非终结符的FIRSTVT 集和LASTVT集。 (2) 判断该文法是否为算符优先文法。(请以a,b,c,’,#的顺 序构造相应的算符优先矩阵。) 4. 设有文法G[S]: S→V V→T|ViT T→F|T+F F→)V*|( (1) 求出各个非终结符的FIRSTVT 集和LASTVT集。 (2) 判断该文法是否为算符优先文法。(请以i,+,*,(,),#的顺 序构造相应的算符优先矩阵) (3)给出(+(i(#的分析过程。 5. 已知文法G[s]

编译原理第4章.doc

编译原理第4章.doc

第四章作业4.1 对下面文法,设计递归下降分析程序。

S→aAS|(A) , A→Ab|c解:将左递归去掉,将规则A→Ab|c 改成 A→c{b}非终结符号S的分析程序如下:非终结符号A的分析程序如下:4.2 设有文法G[Z]:Z∷=(A) , A∷=a|Bb , B∷=Aab若采用递归下降分析方法,对此文法来说,在分析过程中,能否避免回溯?为什么?解:若采用递归下降分析方法,对此文法来说,在分析过程中,不能避免回朔。

因为A∷=a|Bb和B∷=Aab构成了间接的左递归,不满足实现没有回溯的递归下降分析方法的条件,因此在分析过程中,将造成回溯。

4.3 若有文法如下,设计递归下降分析程序。

<语句>→<语句><赋值语句>|ε<赋值语句>→ID=<表达式><表达式>→<项>|<表达式>+<项>|<表达式>-<项><项>→<因子>|<项>*<因子>|<项>/<因子><因子>→ID|NUM|(<表达式>)解:首先,去掉左递归(1)<语句>→<语句><赋值语句>|ε改为: <语句>→{<赋值语句>}(3)<表达式>→<项> | <表达式> + <项> | <表达式> - <项> 改为:<表达式>→<项>{(+ | -)<项>}(4)<项>→<因子> | <项> * <因子> | <项> / <因子>改为:<项>→<因子>{(* | /)<因子>}则文法变为:<语句>→{<赋值语句>}<赋值语句>→ID=<表达式><表达式>→<项>{(+ | -)<项>}<项>→<因子>{(* | /)<因子>}<因子>→ID|NUM|(<表达式>)非终结符号 <语句>→{<赋值语句>} 的分析程序如下:非终结符号 <赋值语句>→ID=<表达式> 的分析程序如下:非终结符号<表达式>→<项>{(+ | -)<项>} 的分析程序如下:非终结符号 <项>→<因子>{(* | /)<因子>} 的分析程序如下:非终结符号 <因子>→ID|NUM|(<表达式>) 的分析程序如下:4.4 有文法G[A]:A::=aABe|ε,B::=Bb|b(1)求每个非终结符号的FOLLOW集。

编译原理第4章习题答案

编译原理第4章习题答案

S-> S’ S’->(S)SS’| First( (S)SS’) = { ( } Follow(S)=Follow(S’)= { (, ),$ }
预测分析表
非终结符 S ( S->S’ ) S->S’ $ S->S’
S’
S’->(S)SS’
S’->
S’->
S’->
冲突
仔细分析后,发现该文法 S->S(S)S| 是二义性文法。 二义性文法不可能是LL(1)文法。 例如:( ) ( )
S->aS’ S’->aS’AS’|Ɛ A->+|*
First(S) = First(aS’)={a} First(S’)= First(aS’AS’) ∪ First(Ɛ)= {a} ∪{Ɛ}= {a, Ɛ} First(A) = { +,*}
Follow(S) ={$} 因为 S->aS’,所以把Follow(S)加入到Follow(S’)中。 因为 S’->aS’AS’的第一个S’ ,所以把First(AS’)={+,*}加入到Follow(S’)中。 因为 S’->aS’AS’的第二个S’ ,所以Follow(S)加入到Follow(S’)中。 所以,Follow(S’)= {$, +,*} 对 S’->aS’AS’的A ,当A后面的S’推导出非空时,把First(S’)-{Ɛ}={a}加入到Follow(A)中。 对 S’->aS’AS’的A ,当A后面的S’推导出空时,把Follow(S’)={$,+,*}加入到Follow(A)中。 所以,Follow(A)= {a, +,*,$} 对于S’->aS’AS’|Ɛ,因为First(aS’AS’) ∩Follow(S’)={a} ∩{$,+,*}=空集,所以没有冲突。 对于A->+|*,因为First(+) ∩First(*)={+} ∩{*}=空集,所以没有冲突。 所以该文法是LL(1)文法。

编译原理第四章

编译原理第四章

FIRST( F ) = { (, id
}
FIRST( T ) = FIRST( F ) = { (, id } FIRST( E ) = FIRST( T ) = { (, id } FIRST( E' ) = { +,ε }
FIRST( T' ) = { *, ε }
定义
教学进度
FOLLOW( A ) 的计算法(P67)
计算机科学与工程系
表达式文法直接左递归的消除
E → E + T|T T → T * F|F F → ( E )|id
E E' T T' F → → → → → T + F * ( E' T E'|ε T' F T'|ε E )|id
教学进度
计算机科学与工程系
把直接左递归改为直接右递归:
将规则A →A1|A2|...|Am|1|2|...|n 改写为: A → 1 A’ |2 A’ |...|n A’ A’ → 1A’|2 A’ |...|m A’ | ε
• top down parsing:推导
• bottom up parsing:归约
教学进度
4.2 自顶向下语法分析
• 基本思想:
计算机科学与工程系
• 从文法的开始符号出发,向下推导出句子; • 试图用一切可能的办法,从文法开始符号出发, 自上而下地为输入串建立一课语法树;(寻找一 个最左推导) • 此分析过程本质上是一种试探过程。 • 非确定的自上而下分析法实际上采用的是一种 穷尽一切可能的试探法。
• E → T E' • E'→ + T E'|ε • T → F T' • T'→ * F T'|ε • F → ( E )|id 按照最左推导过程,构造分析树

蒋立源编译原理第三版第四章-习题与答案

蒋立源编译原理第三版第四章-习题与答案

蒋立源编译原理第三版第四章-习题与答案(总15页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--第五章习题5-1 设有文法G[S]:S→A/ A→aA∣AS∣/(1) 找出部分符号序偶间的简单优先关系。

(2) 验证G[S]不是简单优先文法。

5-2 对于算符文法G[S]:S→E E→E-T∣T T→T*F∣F F→-P∣P P→(E)∣i(1) 找出部分终结符号序偶间的算符优先关系。

(2) 验证G[S]不是算符优先文法。

5-3 设有文法G′[E]:E→E1 E1→E1+T1|T1 T1→T T→T*F|F F→(E)|i其相应的简单优先矩阵如题图5-3所示,试给出对符号串(i+i)进行简单优先分析的过程。

题图5-3 文法G′[E]的简单优先矩阵5-4 设有文法G[E]:E→E+T|TT→T*F|FF→(E)|i其相应的算符优先矩阵如题图5-4所示。

试给出对符号串(i+i)进行算符优先分析的过程。

题图5-4 文法G[E]的算符优先矩阵5-5 对于下列的文法,试分别构造识别其全部可归前缀的DFA和LR(0)分析表,并判断哪些是LR(0)文法。

(1) S→aSb∣aSc∣ab(2) S→aSSb∣aSSS∣c(3) S→A A→Ab∣a5-6 下列文法是否是SLR(1)文法若是,构造相应的SLR(1)分析表,若不是,则阐明其理由。

(1) S→Sab∣bR R→S∣a(2) S→aSAB∣BA A→aA∣B B→b(3) S→aA∣bB A→cAd∣ε B→cBdd∣ε5-7 对如下的文法分别构造LR(0)及SLR(1)分析表,并比较两者的异同。

S→cAd∣b A→ASc∣a5-8 对于文法G[S]:S→A A→BA∣ε B→aB∣b(1) 构造LR(1)分析表;(2) 给出用LR(1)分析表对输入符号串abab的分析过程。

5-9 对于如下的文法,构造LR(1)项目集族,并判断它们是否为LR(1)文法。

编译原理第四章(6-6)

编译原理第四章(6-6)

(3) 若状态i为X→ α · A β, A∈Vn
则从i引ε弧到所有A → · r的状态 (4) 将NFA确定化为 DFA M.
12
5)LR(0)分析表构造---只适用于LR(0)文法
根据LR(0)文法的 C={ C0 , C1 ,……, Cn } (1)若GO(Ci,a)=Cj , a∈Vt 置ACTION(i,a)=Sj (2)若A→ α· ∈ Ci , 所有a∈Vt (含#) 置ACTION(i,a)=rj (3)若S→δ · ∈ Ck , (S为拓广文法开始符号) 置ACTION(k,#)=acc (4)若GO(Ci,A)=Cj , A∈Vn ,置GOTO(i,A)=j (5)其它:空白(error)
(若其中某项目集已经存在就略去)
4
例题 DFA构造
G[E]:E→E+T∣E-T∣T T →i∣(E) 拓广文法 G[S]:S →E# E→E+T∣E-T∣T T →i∣(E) 所有项目 S → · E# S →E · # S →E# · E→ · E+T E→E · +T E→E+ · T E→ · E-T E→E · -T E→E- · T E→ · T E→T · T→·i T→i· T → · (E) T →(·E) T →(E ·)
8
拓广文法 G[S]: S →E# E→E+T∣E-T∣T T →i∣(E)
0
5
# E
T
( 2 1 i
+ - 3 i ( i
T 6 8
7
i
T 9 +
(

T
E ) 10 11
(
4
识别活前缀和可归前缀的FA
9

编译原理第四章作业答案

编译原理第四章作业答案

非终结符
FIRSTVT
LASTVT
E
+ * ↑( i
+ * ↑) i
T
* ↑( i
* ↑) i
F
↑( i
↑)i
P
(i
)i
2).关系 1.由#E#,知 # = # ;由(E)知 ( = ) 2.求 < 关系 考察对象:文法中终结符号在前,非终结符号在后的相邻符号对 由#E # < FIRSTVT(E) 由+T + < FIRSTVT(T) 由*F * < FIRSTVT(F) 由↑F ↑< FIRSTVT(F) 由(E ( < FIRSTVT(E)
T→F
F→-P
F→P
P→(E)
P→i
(1) 构造 G 的算符优先矩阵;
(2) 指出 G 不是算符优先文法,即指出具有多重定义的优先矩阵元素;
(3)将 G 改写为算符优先文法。
解:
(1)求每个非终结符号的 FIRSTVT 集和 LASTVT 集
S→E
E→E-T|T
T→T*F|F
F→-P|P
P→(E)|i
Z 11 Z 12 Z 13
(S
A
B ) = (φ (S ) + () [S ] + [])Z 21
Z 22
Z
23
Z 31 Z 32 Z 33
Z 11 Z 12 Z 13 ε φ φ A B φ Z 11 Z 12 Z 13
Z 21
Z 22
Z
23
=
φ
ε
φ
+
ε
φ
φ
Z
21
Z 22
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第四章语法分析—自上而下分析本章要点1. 语法分析器的功能;2. 自上而下分析方法,LL(1)文法3. 递归下降分析程序构造;4. 预测分析表的构造及预测分析过程;5. LL(1)分析中的错误处理。

本章目标理解和掌握语法分析器的功能、自上而下分析所面临的问题、LL(1)分析法、递归下降分析的构造过程、预测分析程序等内容。

本章重点1.语法分析器的功能,自上而下的基本概念2.LL(1)文法的条件及其判别,计算first集和follow集3.递归下降分析方法、预测分析表的构造及其预测过程。

本章难点1. 非终结符的First集合,产生式候选的First集合,非终结符的follow集合的求解;2. 左递归消除;3. 递归下降分析程序的编写;作业题一、单项选择题:1. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于分析法。

a. 自左至右b. 自顶向下c. 自底向上d. 自右向左 2. 上下文无关文法可以用 来描述。

a. 正则表达式b. 正规文法c. 扩展的BNFd. 翻译模式 3. 自上而下分析面临的四个问题中,不包括a. 需消除左递归;b. 存在回朔;c. 虚假匹配;d. 寻找可归约串4. 语法分析器接收以________为单位的输入,并产生有关信息供以后各阶段使用。

a. 表达式;b. 产生式;c. 单词;d. 语句;5. 自上而下分析的主旨是,对任何单词符号串,试图用一切可能的办法,从文法开始符号(根结点)出发,________。

a. 为输入串寻找最右推导;b. 为输入串寻找最左直接子树;c. 为输入串建立最右直接子树;d. 为输入串寻找最左推导;6. 把规则T→F | T*F 表示成扩展的巴克斯范式以后,画出它的语法图应该是 。

图a图b图c图d7. 下列文法中,_______是LL(1)文法。

a. S →aSb|abb. S →ab|Sabc. S →aS|bd. S →aS|a 8. 设有文法G : S→Ap|Bq A→a|cAB→b|dB则,First(Ap)={_______________} a. a,c b. b,d c. p, q d. A, p一.答案:1. b ;2. c ;3. d ;4. c ;5. d ;6. 图a ;二、填空题:1. 语法分析器的工作本质上就是按____________________,识别输入符号串是否为一个句子。

这里所说的输入串是指由____________________组成的有限序列。

2. 自顶向下分析会遇到的主要问题是____________________和__________________。

3. 自上而下地为输入串建立一棵语法树,就是为输入串寻找一个______________。

4. 在扩充的巴科斯范式中,用______________表示符号或串α的出现可有可无。

5. 对于一个文法,当给出一串符号时,怎么能知道它是不是该文法的一个句子呢?这就要判断,看是否能。

6. 文法exp → exp addop term | term 消除左递归的结果为。

7. 写出E→T | E+T的EBNF范式为。

8. 扩展的巴克斯范式描述语法的好处是,直观易懂,便于表示。

二.答案:1. 文法的产生式,单词符号(文法的终结符)2. 左递归,回溯;3.最左推导;4. 方括号(或[α]);5. 从文法的开始符号出发推导出这个输入串。

(或:能否建立一棵与输入串相匹配的语法分析树。

)6. exp → term exp′;exp′→ addop term exp′| ε;7. E→T{+T};8. 左递归消去和左因子提取。

三、判断题:1. LL(k)文法都不是二义性的。

()2. 存在一种算法,能判定任何上下文无关文法是否是LL(1)的。

( )3. 一个文法是含有左递归的,如果存在非终结符P,使得P⇒*αP。

()4. 提取公共左因子的副产品是引进了大量的非终结符和ε产生式。

( )5. 把一个文法改造成任何非终结符的所有后选终结首符集两两不相交的办法是消除左递归。

( )6. 若X∈V T,则FIRST(X)={ X }。

( )7. 一个文法的预测分析表含有多重定义入口,说明该文法是LL(1)的。

()8. 自上而下分析及自下而上分析中的“下”是指被分析的源程序串。

()三.答案:1. √;2. √;3. ×;4. √;5. ×;6. √;7. ×;8. √;四、名词解释:1. 左递归;2. 递归下降分析器;3. LL(1)文法;4. 预测分析表5. 自上而下分析四.答案:1.一个文法如果存在非终结符P,P=>+Pα,则称该文法是左递归的。

2. 当一个文法满足LL(1)条件时,可以为它构造一个不带回溯的的自上而下分析程序,该程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。

这样的分析程序称为递归下降分析器。

3. 一个文法G,如果满足以下条件,则称为LL(1)文法:(1)文法不含左递归;(2)对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交;(3)对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则A的First集合和Follow 集合的交集为空。

4. 预测分析表是一个M[A, a]形式的矩阵。

其中A为非终结符,a是终结符或“#”。

矩阵元素M[A, a]中存放着一条关于A的产生式,指出当A面临输入符号a时所应采取的候选。

M[A, a]中也可能存放一个“出错标志”,指出A根本不该面临输入符号a。

5. 自上而下分析是,对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树。

或者说,为输入串寻找一个最左推导。

五、简答题:1. 词法分析和语法分析都是对字符串进行识别的,二者有何区别?2. 试说明没有一个左递归文法是LL(1)的。

3. 试说明没有一个LL(1)文法是二义性的。

4. 为什么要消除回溯?5. 为什么要提取左因子?6. 下面文法是有左递归吗?若有,提取左递归。

Declist→Declist; Decl | DeclDecl→idList:TypeIdList→Idlist, id | idType→ScalarType | array (ScalarTypeList) of TypeScalarType→id | Bound..BoundBound→Sign IntLiteral | idSign→+ | - | eScalarTypeList→ScalarTypeList, ScalarType | ScalarType五.答案:1. 答:词法分析的输入符号串是一个单词,而语法分析的输入符号串是一个句子。

词法分析的一个输入符号串是由单个符号组成的单词;语法分析的输入符号串是由词法分析得来的单词组成的句子。

2. 对于任一个左递归文法来说,存在一个A∈V N,有A A...,因此,在文法中必有如下的规则序列:A → A1...A1 → A2........................An→ Aα|βAαβ。

显然,FIRST(Aα)∩FIRST(β)≠Φ。

因此,没有一个左递归文法是LL(1)的。

3. 解:设有一个LL(1)文法G是二义性的,那么,一定存在一个W∈L(G),W=a1, a2......, a n,有两棵不同的分析树。

如果按最左推导构造这两棵分析树,按么,一定有两个最左推导序列,这来年改革最左推导序列的不同在于,于对某一个A∈V N和当前要匹配的a i(1≤i≤n),分别使用A的两个不同的候选式A→α和A→β进行推导以匹配a i(i) 若αε且βε,则必有a i∈FIRST(α)且a i∈FIRST(β),FIRST(α)∩FIRST(β)≠Φ(ii) 若α和β有一个能推导出ε,比如βε,则a i∈FIRST(α)且a i∈FOLLOW(A)显然,FIRST(α)∩FOLLOW(A)≠Φ无论(i)还是(ii),都和G是LL(1)文法矛盾。

4. 假定当前轮到非终结符A去执行匹配任务,A共有n个候选α1、α2、……αn,这时候该用哪一个候选去替换A,原始的办法是采用对所有候选采取“试探”的方法。

如果某个候选不成功就需要“回退”。

这个回退的过程会导致前次匹配的许多工作推到重来,效率低。

而且,最终匹配不成功的时候,难以直到输入串中出错的确切位置。

5. 假定当前轮到非终结符A去执行匹配任务,A共有n个候选α1、α2、……αn,即A→α1|α2|……|αn。

A面临的第一个输入符号为a,如果a属于某个First(αi),则用该αi来匹配A。

但是,若a既属于某个First(αi),又属于某个First(αj),则说明αi和αi存在共同的左部,也就是说,有共同的左因子。

此时无法确定到底是用αi还是用αj来匹配A。

所以要消除左因子。

六、应用题1. 已知文法G[S]:S → (L) | aL → L,S | Sⅰ.消除左递归,若有左因子则提取之;ⅱ.对(1)中得到的文法求First集合和Follow集合ⅲ.对(1)中得到的文法构造一个预测分析表;ⅳ.给出对句子(a,(a,a))上的分析动作1.答案:将所给文法消除左递归得G′:S → (L) | aL → SL′L′→ ,SL′ |ε实现预测分析器的不含递归调用的一种有效方法是使用一张分析表和一个栈进行联合控制,下面构造预测分析表:根据文法G′有FIRST(S) = { ( , a } FOLLOW(S) = {#, ) , ′,′}FIRST(L) = { ( , a } FOLLOW(S) = { ) }FIRST(L′) = {′,′, ε} FOLLOW(L′) = { ) }2. 考查文法G(s):S→( T ) | a + S | aT→T, S | Sⅰ. 消除文法的左递归,提取公共左因子ⅱ. 改造后的文法是LL(1)的吗?为什么?ⅲ. 如果是LL(1)文法,对每个非终结符,写出不带回朔的递归子程序。

2.答案:ⅰ.消除文法的左递归G ( s ):S→ ( T ) | a + S | aT→ S T′T`→ , S T′| ε再提取公共左因子,最后得到改造后的文法G[S]:①S→( T ) | a S′②S′→ + S | ε③T→ S T′④T′→, S T′ | εⅱ.First(S)={(,a };Follow(S)={#,‘,’};First(S’)={+,ε};Follow(S’)= {#,‘,’};First(T)={(,a };Follow(T)={ ) };First(T’)={‘,’ ,ε}; Follow(T’) ={ ) };产生式①的两个候选的First集合:Fist((T))={(},First(aS’)={a}不相交,满足条件。

相关文档
最新文档