编译原理题库
- 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表