编译原理陈意云 课后答案2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
E=>E|T=>E|F=>E|F*=>E|b* =>T|b*=>F|b*=>a|b*
2011-3-28 luanj@mail.ustc.edu.cn 10
3.4 (续) - ab|b*a (续
• 二义的
R R R a R bR b | R * R R a R a R R b R | R * R b R R a E
S a S ε b a S ε (1) 描述的语言是a,b数目相等的串 S b S ε a S b S ε (2) a S b S ε S ε
2011-3-28
luanj@mail.ustc.edu.cn
7
3.4
• 文法 R->R’|’R | RR | R* | (R) | a | b 产生字母表(a, b)上所有不含ε的正规式 该文法是二义的 (a) 证明该文法产生字母表{a,b}上的所有正 规式 (b) 为该文法写一个等价的非二义文法。 (c) 按照上面的两个文法构造ab|b*a的分析 树
2011-3-28 luanj@mail.ustc.edu.cn 14
3.5 (续) (续
• 另一种推导
stmt => if expr then stmt => if expr then matched_stmt => if expr then if expr then matched_stmt else stmt => if expr then if expr then matched_stmt else matched_stmt => if expr then if expr then matched_stmt else if expr then matched_stmt else stmt if expr then if expr then matched_stmt else if expr then matched_stmt else stmt
(2)若β ⇒* α,那么FIRST (α ) I FOLLOW ( β ) = ∅
• 本题中,FIRST(AB)={x}, FIRST(PQx)={d,a,x} 不满足条件(1)
2011-3-28
luanj@mail.ustc.edu.cn
22
3.15
• (a) 用3.1的文法构造(a,(a,a))的最右推导, 说出每个右句型的句柄 • (b) 给出对应(a)的最右推导的移进-归约分 析器的步骤 • (c) 对照(b)的移进-归约,给出自下而上构 造分析树的步骤。
2011-3-28
luanj@mail.ustc.edu.cn
19
3.10 (续) (续
int D T L R
2011-3-28 luanj@mail.ustc.edu.cn
real
D -> TL
id
,
$
D -> TL
T -> int
T -> real
L -> idR
R -> ,idR
R -> ε
2011-3-28
luanj@mail.ustc.edu.cn
23
3.15 (续) (a) (b) (续
S =>(L) =>(L,S) =>(L,(L)) =>(L,(L,S)) =>(L,(L,a)) =>(L,(S,a)) =>(L,(a,a)) =>(S,(a,a)) =>(a,(a,a)) 栈
2011-3-28 luanj@mail.ustc.edu.cn 8
3.4 (续) (续
• 证明该文法产生字母表{a,b}上的所有正规式 证明: 1)该文法产生的串是字母表{a,b}上的正规式 R->a和R->b产生a,b,而a,b是{a,b}上的符号,因此是正规式。 若R1,R2产生正规式α,β 则: R->R1R2产生正规式αβ R->R1|R2产生正规式α|β R->R1* 产生正规式α* R->(R1)产生正规式 (α) 2)字母表{a,b}上的所有正规式都可由此文法产生 字母表{a,b}上的任一正规式(其中α,β为正规式)必为以下形式之一: αβ,可由R->RR产生 α|β,可由R->R|R产生 α*,可由R->R*产生 (α),可由R->(R)产生 a,可由R->a产生 b,可由R->b产生 因而,该文法产生字母表{a,b}上的所有正规式
2011-3-28
luanj@mail.ustc.edu.cn
12
3.5 (续) (续
• 由于matched_stmt不能保证then和else的配对,因而存在 二义性 • 句型if expr then if expr then matched_stmt else if expr then matched_stmt else stmt存在两个不同的最左推导
2011-3-28
luanj@mail.ustc.edu.cn
5
3.2
• 考虑文法 S -> aSbS|bSaS|ε (a) 为句子abab构造两个不同的最左推导, 以说明此文法二义 (b) 为abab构造对应的最右推导 (c) 为abab构造对应的分析树 (d) 这个文法产生的语言是什么
2011-3-28
非二义的
E | T F bF b F * T F a
…
T F a
T
2011-3-28
luanj@mail.ustc.edu.cn
11
3.5
• 下面的条件语句文法
stmt->if expr then stmt | matched_stmt matched_stmt -> if expr then matched_stmt else stmt | other 试图消除悬空else的二义性。请证明此文法仍 是二义的。
编译原理习题课(2) 编译原理习题课(2)
栾 俊 luanj@mail.ustc.edu.cn 3/28/2011
3.1
• 考虑文法 S -> (L)|a L -> L,S|S (a) 建立句子(a,(a,a))和(a,((a,a),(a,a)))的分 析树 (b) 为(a)的两个句子构造最左推导 (c) 为(a)的两个句子构造最右推导 (d) 这个文法产生的语言是什么
luanj@mail.ustc.edu.cn 9
2011-3-Байду номын сангаас8
3.4 (续) (续
• 该文法没有体现运算符 |、*、() 、并置的优 先级,因而是二义的。
R=>R|R=> a|R =>a|R*=>a|b* R=>R*=>R|R*=>a|R*=>a|b*
• E -> E’|’T | T T -> TF | F F -> F* | (E) | a | b
luanj@mail.ustc.edu.cn
6
3.2 (续) (续
• (1) S=>aSbS=>abS=>abaSbS=>ababS=>abab (2) S=>aSbS=>abSaSbS=>abaSbS=>ababS=>abab • S=>aSbS=>aSb=>abSaSb=> abSab =>abab (2)
2011-3-28 luanj@mail.ustc.edu.cn 15
3.8(a)
• 消除3.1的左递归
2011-3-28
luanj@mail.ustc.edu.cn
16
3.8(a) (续) (续
• S -> (L)|a L -> L,S|S • 只有直接左递归 S -> (L)|a L -> SL’ L’-> ,SL’|ε
$ $( $(a $(S $(L $(L, $(L,( $(L,(a
2011-3-28
输入
(a,(a,a))$ a,(a,a))$ ,(a,a))$ (a,a))$ ,(a,a))$ (a,a))$ a,a))$ ,a))$ 移进 移进
2011-3-28
luanj@mail.ustc.edu.cn
17
3.10
• 构造下面文法的LL(1)分析表 D -> TL T -> int|real L -> idR R -> ,idR|ε
2011-3-28
luanj@mail.ustc.edu.cn
18
3.10 (续) (续
• 先计算FIRST和FOLLOW FIRST(D) = FIRST(T) = {int,real} FIRST(L) = {id} FIRST(R) = {,,ε} FOLLOW(D) = FOLLOW(L) = {$} FOLLOW(T) = {id} FOLLOW(R) = {$}
期望的是: if expr then if expr then matched_stmt else if expr then matched_stmt else stmt
2011-3-28
luanj@mail.ustc.edu.cn
13
3.5 (续) (续
• 一种推导,和期望的不一样
stmt => matched_stmt => if expr then matched_stmt else stmt => if expr then if expr then matched_stmt else stmt else stmt => if expr then if expr then matched_stmt else if expr then stmt else stmt => if expr then if expr then matched_stmt else if expr then matched_stmt else stmt if expr then if expr then matched_stmt else if expr then matched_stmt else stmt
S ( L S a L S ( L S L , ) S a L , ( ) S L , ( L S a
4
) S L , ) S a
2011-3-28
luanj@mail.ustc.edu.cn
a
3.1 (续) (续
• 描述的语言: 括号匹配的串,串中的各项由”,”隔开, 项可以是括号匹配的子串或a
2011-3-28 luanj@mail.ustc.edu.cn 2
3.1 (续) - (a,(a,a)) (续
S =>(L) S =>(L) =>(L,S) =>(L,S) =>(S,S) =>(L,(L)) =>(a,S) =>(L,(L,S)) =>(a,(L)) =>(L,(L,a)) =>(a,(L,S)) =>(L,(S,a)) =>(a,(S,S)) =>(L,(a,a)) =>(a,(a,S)) =>(S,(a,a)) =>(a,(a,a)) =>(a,(a,a))
20
3.11
• 下面文法是否LL(1)文法?说明理由 S -> AB|PQx A -> xy B -> bc P -> dP|ε Q -> aQ|ε
2011-3-28
luanj@mail.ustc.edu.cn
21
3.11 (续) (续
• 不是LL(1)文法 • LL(1)文法:对于产生式A->α|β (1) FIRST (α ) I FIRST ( β ) = ∅
S ( L S a L , ( L S a
2011-3-28 luanj@mail.ustc.edu.cn 3
) S L , ) S a
3.1 (续) - (a,((a,a),(a,a))) (续
S =>(L) =>(L,S) =>(S,S) =>(a,S) =>(a,(L)) =>(a,(L,S)) =>(a,(S,S)) =>(a,((L),S)) =>(a,((L,S),S)) =>(a,((S,S),S)) =>(a,((a,S),S)) =>(a,((a,a),S)) =>(a,((a,a),(L))) =>(a,((a,a),(L,S))) =>(a,((a,a),(S,S))) =>(a,((a,a),(a,S))) =>(a,((a,a),(a,a))) S =>(L) =>(L,S) =>(L,(L)) =>(L,(L,S)) =>(L,(L,(L))) =>(L,(L,(L,S))) =>(L,(L,(L,a))) =>(L,(L,(S,a))) =>(L,(L,(a,a))) =>(L,(S,(a,a))) =>(L,((L),(a,a))) =>(L,((L,S),(a,a))) =>(L,((L,a),(a,a))) =>(L,((S,a),(a,a))) =>(L,((a,a),(a,a))) =>(S,((a,a),(a,a))) =>(a,((a,a),(a,a)))
2011-3-28 luanj@mail.ustc.edu.cn 10
3.4 (续) - ab|b*a (续
• 二义的
R R R a R bR b | R * R R a R a R R b R | R * R b R R a E
S a S ε b a S ε (1) 描述的语言是a,b数目相等的串 S b S ε a S b S ε (2) a S b S ε S ε
2011-3-28
luanj@mail.ustc.edu.cn
7
3.4
• 文法 R->R’|’R | RR | R* | (R) | a | b 产生字母表(a, b)上所有不含ε的正规式 该文法是二义的 (a) 证明该文法产生字母表{a,b}上的所有正 规式 (b) 为该文法写一个等价的非二义文法。 (c) 按照上面的两个文法构造ab|b*a的分析 树
2011-3-28 luanj@mail.ustc.edu.cn 14
3.5 (续) (续
• 另一种推导
stmt => if expr then stmt => if expr then matched_stmt => if expr then if expr then matched_stmt else stmt => if expr then if expr then matched_stmt else matched_stmt => if expr then if expr then matched_stmt else if expr then matched_stmt else stmt if expr then if expr then matched_stmt else if expr then matched_stmt else stmt
(2)若β ⇒* α,那么FIRST (α ) I FOLLOW ( β ) = ∅
• 本题中,FIRST(AB)={x}, FIRST(PQx)={d,a,x} 不满足条件(1)
2011-3-28
luanj@mail.ustc.edu.cn
22
3.15
• (a) 用3.1的文法构造(a,(a,a))的最右推导, 说出每个右句型的句柄 • (b) 给出对应(a)的最右推导的移进-归约分 析器的步骤 • (c) 对照(b)的移进-归约,给出自下而上构 造分析树的步骤。
2011-3-28
luanj@mail.ustc.edu.cn
19
3.10 (续) (续
int D T L R
2011-3-28 luanj@mail.ustc.edu.cn
real
D -> TL
id
,
$
D -> TL
T -> int
T -> real
L -> idR
R -> ,idR
R -> ε
2011-3-28
luanj@mail.ustc.edu.cn
23
3.15 (续) (a) (b) (续
S =>(L) =>(L,S) =>(L,(L)) =>(L,(L,S)) =>(L,(L,a)) =>(L,(S,a)) =>(L,(a,a)) =>(S,(a,a)) =>(a,(a,a)) 栈
2011-3-28 luanj@mail.ustc.edu.cn 8
3.4 (续) (续
• 证明该文法产生字母表{a,b}上的所有正规式 证明: 1)该文法产生的串是字母表{a,b}上的正规式 R->a和R->b产生a,b,而a,b是{a,b}上的符号,因此是正规式。 若R1,R2产生正规式α,β 则: R->R1R2产生正规式αβ R->R1|R2产生正规式α|β R->R1* 产生正规式α* R->(R1)产生正规式 (α) 2)字母表{a,b}上的所有正规式都可由此文法产生 字母表{a,b}上的任一正规式(其中α,β为正规式)必为以下形式之一: αβ,可由R->RR产生 α|β,可由R->R|R产生 α*,可由R->R*产生 (α),可由R->(R)产生 a,可由R->a产生 b,可由R->b产生 因而,该文法产生字母表{a,b}上的所有正规式
2011-3-28
luanj@mail.ustc.edu.cn
12
3.5 (续) (续
• 由于matched_stmt不能保证then和else的配对,因而存在 二义性 • 句型if expr then if expr then matched_stmt else if expr then matched_stmt else stmt存在两个不同的最左推导
2011-3-28
luanj@mail.ustc.edu.cn
5
3.2
• 考虑文法 S -> aSbS|bSaS|ε (a) 为句子abab构造两个不同的最左推导, 以说明此文法二义 (b) 为abab构造对应的最右推导 (c) 为abab构造对应的分析树 (d) 这个文法产生的语言是什么
2011-3-28
非二义的
E | T F bF b F * T F a
…
T F a
T
2011-3-28
luanj@mail.ustc.edu.cn
11
3.5
• 下面的条件语句文法
stmt->if expr then stmt | matched_stmt matched_stmt -> if expr then matched_stmt else stmt | other 试图消除悬空else的二义性。请证明此文法仍 是二义的。
编译原理习题课(2) 编译原理习题课(2)
栾 俊 luanj@mail.ustc.edu.cn 3/28/2011
3.1
• 考虑文法 S -> (L)|a L -> L,S|S (a) 建立句子(a,(a,a))和(a,((a,a),(a,a)))的分 析树 (b) 为(a)的两个句子构造最左推导 (c) 为(a)的两个句子构造最右推导 (d) 这个文法产生的语言是什么
luanj@mail.ustc.edu.cn 9
2011-3-Байду номын сангаас8
3.4 (续) (续
• 该文法没有体现运算符 |、*、() 、并置的优 先级,因而是二义的。
R=>R|R=> a|R =>a|R*=>a|b* R=>R*=>R|R*=>a|R*=>a|b*
• E -> E’|’T | T T -> TF | F F -> F* | (E) | a | b
luanj@mail.ustc.edu.cn
6
3.2 (续) (续
• (1) S=>aSbS=>abS=>abaSbS=>ababS=>abab (2) S=>aSbS=>abSaSbS=>abaSbS=>ababS=>abab • S=>aSbS=>aSb=>abSaSb=> abSab =>abab (2)
2011-3-28 luanj@mail.ustc.edu.cn 15
3.8(a)
• 消除3.1的左递归
2011-3-28
luanj@mail.ustc.edu.cn
16
3.8(a) (续) (续
• S -> (L)|a L -> L,S|S • 只有直接左递归 S -> (L)|a L -> SL’ L’-> ,SL’|ε
$ $( $(a $(S $(L $(L, $(L,( $(L,(a
2011-3-28
输入
(a,(a,a))$ a,(a,a))$ ,(a,a))$ (a,a))$ ,(a,a))$ (a,a))$ a,a))$ ,a))$ 移进 移进
2011-3-28
luanj@mail.ustc.edu.cn
17
3.10
• 构造下面文法的LL(1)分析表 D -> TL T -> int|real L -> idR R -> ,idR|ε
2011-3-28
luanj@mail.ustc.edu.cn
18
3.10 (续) (续
• 先计算FIRST和FOLLOW FIRST(D) = FIRST(T) = {int,real} FIRST(L) = {id} FIRST(R) = {,,ε} FOLLOW(D) = FOLLOW(L) = {$} FOLLOW(T) = {id} FOLLOW(R) = {$}
期望的是: if expr then if expr then matched_stmt else if expr then matched_stmt else stmt
2011-3-28
luanj@mail.ustc.edu.cn
13
3.5 (续) (续
• 一种推导,和期望的不一样
stmt => matched_stmt => if expr then matched_stmt else stmt => if expr then if expr then matched_stmt else stmt else stmt => if expr then if expr then matched_stmt else if expr then stmt else stmt => if expr then if expr then matched_stmt else if expr then matched_stmt else stmt if expr then if expr then matched_stmt else if expr then matched_stmt else stmt
S ( L S a L S ( L S L , ) S a L , ( ) S L , ( L S a
4
) S L , ) S a
2011-3-28
luanj@mail.ustc.edu.cn
a
3.1 (续) (续
• 描述的语言: 括号匹配的串,串中的各项由”,”隔开, 项可以是括号匹配的子串或a
2011-3-28 luanj@mail.ustc.edu.cn 2
3.1 (续) - (a,(a,a)) (续
S =>(L) S =>(L) =>(L,S) =>(L,S) =>(S,S) =>(L,(L)) =>(a,S) =>(L,(L,S)) =>(a,(L)) =>(L,(L,a)) =>(a,(L,S)) =>(L,(S,a)) =>(a,(S,S)) =>(L,(a,a)) =>(a,(a,S)) =>(S,(a,a)) =>(a,(a,a)) =>(a,(a,a))
20
3.11
• 下面文法是否LL(1)文法?说明理由 S -> AB|PQx A -> xy B -> bc P -> dP|ε Q -> aQ|ε
2011-3-28
luanj@mail.ustc.edu.cn
21
3.11 (续) (续
• 不是LL(1)文法 • LL(1)文法:对于产生式A->α|β (1) FIRST (α ) I FIRST ( β ) = ∅
S ( L S a L , ( L S a
2011-3-28 luanj@mail.ustc.edu.cn 3
) S L , ) S a
3.1 (续) - (a,((a,a),(a,a))) (续
S =>(L) =>(L,S) =>(S,S) =>(a,S) =>(a,(L)) =>(a,(L,S)) =>(a,(S,S)) =>(a,((L),S)) =>(a,((L,S),S)) =>(a,((S,S),S)) =>(a,((a,S),S)) =>(a,((a,a),S)) =>(a,((a,a),(L))) =>(a,((a,a),(L,S))) =>(a,((a,a),(S,S))) =>(a,((a,a),(a,S))) =>(a,((a,a),(a,a))) S =>(L) =>(L,S) =>(L,(L)) =>(L,(L,S)) =>(L,(L,(L))) =>(L,(L,(L,S))) =>(L,(L,(L,a))) =>(L,(L,(S,a))) =>(L,(L,(a,a))) =>(L,(S,(a,a))) =>(L,((L),(a,a))) =>(L,((L,S),(a,a))) =>(L,((L,a),(a,a))) =>(L,((S,a),(a,a))) =>(L,((a,a),(a,a))) =>(S,((a,a),(a,a))) =>(a,((a,a),(a,a)))