编译原理题集
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章
▪什么是编译器?
▪编译程序的结构分为几个阶段,各阶段的任务是什么?▪遍、编译前端及编译后端的含义?
▪编译程序的生成方式有哪些?
第二章
▪ 1. 写一文法,使其语言是偶正整数的集合。
▪要求:(1)允许0打头(2)不允许0打头
解:(1)允许0开头的偶正整数集合的文法
E→NT|D
T→NT|D
N→D|1|3|5|7|9
D→0|2|4|6|8
(2)不允许0开头的偶正整数集合的文法
E→NT|D
T→FT|G
N→D|1|3|5|7|9
D→2|4|6|8
F→N|0
G→D|0
2.证明下述文法G[〈表达式〉]是二义的。
〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/
解:可为句子a+a*a构造两个不同的最右推导:
最右推导1 〈表达式〉⇒〈表达式〉〈运算符〉〈表达式〉
⇒〈表达式〉〈运算符〉a
⇒〈表达式〉* a
⇒〈表达式〉〈运算符〉〈表达式〉* a
⇒〈表达式〉〈运算符〉a * a
⇒〈表达式〉+ a * a
⇒ a + a * a
最右推导2 〈表达式〉⇒〈表达式〉〈运算符〉〈表达式〉
⇒〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉
⇒〈表达式〉〈运算符〉〈表达式〉〈运算符〉 a
⇒〈表达式〉〈运算符〉〈表达式〉 * a
⇒〈表达式〉〈运算符〉a * a
⇒〈表达式〉+ a * a
⇒ a + a * a
3. 给出生成下述语言的上下文无关文法:
(1){ anbnambm| n,m>=0}
(2){ 1n0m1m0n| n,m>=0}
解:(1){ anbnambm| n,m>=0}
S→AA
A→aAb|ε
(2) { 1n0m1m0n| n ,m>=0}
S →1S0|A A →0A1|ε
第三章
1、构造一个DFA ,它接收∑={a, b}上所有满足下述条件的字符串:字符串中的每个a 都有至少一个b 直接跟在其右边。 解:
已知∑={a, b},根据题意得出相应的的正规式为: (b*abb*)* 根据正规式画出相应的DFA M ,如下图所示 用子集法将其确定化
由DFA 得状态图 用最小化方法化简得:{0},{1},{2},{3,4},按顺序重新命名DFA M ’
第四章
练习1:文法G[V]:
V →N|N[E] E →V|V+E N →i
是否为LL(1)文法,如不是,如何将其改造成LL(1)文法。 解:
LL(1)文法的基本条件是不含左递归和回溯(公共左因子),而G[V]中含有回溯,所以先消
除回溯得到文法G’[V]:
G’[V]: V→NV’ V’→ε|[E]
E→VE’ E’→ε|+E
N→i
由LL(1)文法的充要条件可证G’[V]是LL(1)文法
练习2:有文法G[s]:
S→BA A→BS|d B→aA|bS|c
(1)证明文法G是LL(1)文法。
(2)构造LL(1)分析表。
(3)写出句子adccd的分析过程
解:(1)一个LL(1)文法的充要条件是:对每一个非终结符A的任何两个不同产生式A→α|β,有下面的条件成立:
① FIRST(α)∩FIRST(β)=Φ;
②若β* ε, 则有FIRST(α)∩FOLLOW(A)=Φ
对于文法G[s]:
S→BA A→BS|d B→aA|bS|c
其FIRST集如下:
FIRST(B)={a, b, c}; FIRST(A)={a, b, c, d}; FIRST(S)={a, b, c}。
其FOLLOW集如下:
首先, FOLLOW(S)={#};
对S→BA有: FIRST(A)\{ε}加入FOLLOW(B), 即FOLLOW(B)={a, b, c, d };
对A→BS有:FIRST(S)\{ε}加入FOLLOW(B), 即FOLLOW(B)={a, b, c, d };
对B→aA有:FOLLOW(B)加入FOLLOW(A), 即FOLLOW(A)={a, b, c, d };
对B→bS有:FOLLOW(B)加入FOLLOW(S), 即FOLLOW(S)={#, a, b, c, d };
由A→BS|d得:
FIRST(BS) ∩FIRST(d) = { a, b, c } ∩{d} = Φ;
由B→aA|bS|c得:
FIRST(aA) ∩FIRST(bS) ∩FIRST(c) ={a} ∩{b} ∩{c}= Φ。
由于文法G[s]不存在形如β→ε的产生式,故无需求解形如FIRST(α)∩FOLLOW(A)的值。也即,文法G[S]是一个LL(1)文法。
(2) 由G[s]:S→BA A→BS|d B→aA|bS|c的
FIRST(B)={a, b, c}; FOLLOW(B)={a, b, c, d };
FIRST(A)={a, b, c, d}; FOLLOW(A)={a, b, c, d };
FIRST(S)={a, b, c}。 FOLLOW(S)={#, a, b, c, d }可构造LL(1)预测分析表如下:
第五章
1 已知文法G[S]为:
S→a|∧|(T) T→T,S|S
(1) 计算G[S]的FIRSTVT和LASTVT。
(2) 构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。
(3) 给出输入串 (a,(a,a))#的算符优先分析过程。
解:文法:
S→a|∧|(T) T→T,S|S
展开为:
S→a S→∧S→(T)
T→T,S T→S
(1) FIRSTVT -- LASTVT表
(2)算符优先关系表如下: 表中无多重入口所以是算符优先(OPG)文法。