编译原理-龙书答案Word文档格式.doc
《编译原理-龙书答案Word文档格式.doc》由会员分享,可在线阅读,更多相关《编译原理-龙书答案Word文档格式.doc(24页珍藏版)》请在冰豆网上搜索。
(a,a)
ii)SÞ
(a,(L))Þ
(a,(L,S))Þ
(a,(S,S))Þ
(a,(a,S)Þ
(a,(a,a))
iii)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)))
d)构造b)中句子的最右推导
(L,a)Þ
(S,a)Þ
(L,(L))Þ
(L,(L,S))Þ
(L,(L,a))Þ
(L,(S,a))Þ
(L,(a,a))Þ
(S,(a,a))Þ
(L,(L))Þ
(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),(S,S)))Þ
(S,((a,a),(a,a)))Þ
e)该文法产生的语言是什么
设该文法产生语言(符号串集合)L,则
L={(A1,A2,…,An)|n是任意正整数,Ai=a,或Ai∈L,i是1~n之间的整数}
(Aho)4.2考虑文法
S→aSbS|bSaS|e
a)为句子构造两个不同的最左推导,以证明它是二义性的
SÞ
aSbSÞ
abSÞ
abaSbSÞ
ababSÞ
abab
abSaSbSÞ
b)构造abab对应的最右推导
aSbaSbSÞ
aSbaSbÞ
aSbabÞ
aSbÞ
abSaSbÞ
abSabÞ
c)构造abab对应语法树
d)该文法产生什么样的语言?
生成的语言:
a、b个数相等的a、b串的集合
(Aho)4.3考虑文法
bexpr→bexprorbterm|bterm
bterm→btermandbfactor|bfactor
bfactor→notbfactor|(bexpr)|true|false
a)试为句子not(trueorfalse)构造分析树
b)试证明该文法产生所有布尔表达式
证明:
一、首先证明文法产生的所有符号串都是布尔表达式
变换命题形式——以bexpr、bterm、bfactor开始的推导得到的所有符号串都是布尔表达式
最短的推导过程得到true、false,显然成立
假定对步数小于n的推导命题都成立
考虑步数等于n的推导,其开始推导步骤必为以下情况之一
bexprÞ
bexprorbterm
bterm
btermÞ
btermandbfactor
bfactor
bfactorÞ
notbfactor
(bexpr)
而后继推导的步数显然<
n,因此由归纳假设,第二步句型中的NT推导出的串均为布尔表达式,这些布尔表达式经过or、and、not运算或加括号,得到的仍是布尔表达式
因此命题一得证。
二、证明所有布尔表达式均可由文法生成
变换命题——所有析取式均可由bexpr推导出来,所有合取式均可由bterm(bexpr)推导出来,所有对子布尔表达式施加not运算或加括号或简单true、false都可由bfactor(bexpr、bterm)推导出来
最简单的布尔表达式true和false显然成立
假定对长度小于n的布尔表达式,均可由文法推导出来
考虑长度等于n的布尔表达式B,显然,B只能是以下形式之一
B=B1orB2
B=B1andB2
B=notB1
B=(B1)
以上几种情况,B1、B2的长度均小于n
对于情况1:
B为析取式,B1可为析取式也可为合取式,B2为合取式,根据假设可由bexpr合bterm推导出来,显然可构造推导过程,由bexpr推导出B
其他情况类似,命题二得证
综合一、二,可知文法产生的语言就是布尔表达式
c)
(Aho)4.4考虑文法
R→R‘|’R|RR|R*|(R)|a|b
c)构造等价的非二义性文法
R→R‘|’A|A
A→AB|B
B→B*|C
C→(R)|a|b
(Aho)4.5下面if-then-else文法试图消除空悬else的二义性,证明它仍是二义性的
stmt→ifexprthenstmt
|matched_stmt
matched_stmt→ifexprthenmatched_stmtelsestmt
|other
用S、M、E表示stmt、matched_stmt和expr,用i、t、e、o表示if、then、else和other
则句子iEtiEtoeiEtoeo对应两个最左推导:
iEtSÞ
iEtMÞ
iEtiEtMeSÞ
iEtiEtoeSÞ
iEtiEtoeM
Þ
iEtiEtoeiEtMeSÞ
iEtiEtoeiEtoeSÞ
iEtiEtoeiEtoeM
iEtiEtoeiEtoeo
MÞ
iEtMeSÞ
iEtiEtMeSeSÞ
iEtiEtoeSeSÞ
iEtiEtoeiEtSeS
iEtiEtoeiEtMeSÞ
iEtiEtoeiEtoeSÞ
iEtiEtoeiEtoeM
iEtiEtoeiEtoeo
因此文法是二义性文法
直接构造比较困难,可从SLR分析表的构造角度考虑,LR(0)项目集规范族中,项目
I8={M→iEtM·eS,S→·M},有移进/归约冲突,这就是是二义性所在。
显然,存在句型...iEtMeS...和...iEtSeS...,当M位于栈顶时,产生移进/归约冲突。
按此思路,构造形如...iEtSeS...的句型即可
(Aho)4.6为下列语言设计上下文无关文法。
哪些语言是正规式?
a)满足这样条件的二进制串:
每个0之后都紧跟着至少一个1
S→0A| 1S|e
A→1S
正规式:
(1|01)*
b)0和1个数相等的二进制串
S→0S1S|1S0S|e
d)不含011子串的二进制串
S→0A|1S|e
A→0A|1B|e
B→0A|e
1*(0|01)*
e)具有形式xy的二进制串,x≠y
S→A|B|AB|BA
A→DAD|0
B→DBD|1
D→0|1
A、B分别表示中心符号为0、1的长度为奇数的二进制串
将AB串接,长度为偶数,将它从中间分为长度相等的两部分,x、y
虽然A、B长度可能不一样,但容易得到,A的中心0在x中的位置,与B的中心1在y中的位置是相同的,因此x≠y
BA的情况类似
f)形如xx的0、1串
此语言无法用上下文无关文法描述
(Aho)4.11对习题4.1中文法
a)消除左递归
S→(L)|a
L→SL’
L’→,SL’|e
b)构造预测分析表,对4.1(b)中句子,给出预测分析器的运行过程
FIRST(S)={(,a)
FIRST(L)={(,a}
FIRST(L’)={‘,’,e}
FOLLOW(S)={‘,’,),$}
FOLLOW(L)={)}
FOLLOW(L’)={)}
预测分析表:
a
(
)
$
S→a
S→(L)
L
L’
L’→e
L’→,SL’
(a,a)的分析过程
栈
输入
输出
$S
(a,a)$
$)L(
$)L
a,a)$
$)L’S
$)L’a
$)L’
a)$
$)L’S,
a)$
)$
$)
其他两个句子的分析过程类似
(Aho)4.13下面文法产生除e外所有长度为偶数的a的串
S→aSa|aa
a)试为该文法构造一个带回溯的递归下降语法分析器,对S的两个候选式首先考虑aSa。
S所对应的过程可以成功分析2、4、8个a的串,但6个a的串不行。
aa的分析过程,其中√表示匹配成功,×
表示匹配失败,匹配失败则尝试下个候选式
aaaa分析过程:
aaaaaa分析过程:
aaaaaaaa分析过程:
b)此语法分析器能识别什么样的语言?
由a)的解可以看出,2N个a的串分析过程中,步骤如下
1)产生2N+1个S的语法树,对第2N+1个S进行扩展时输入缓冲已空,失败
2)对第2N个S尝试候选式aa,第二个a匹配失败
3)对第2N-1个S尝试候选式aa,左边N-1个a匹配,右边最后一个a匹配,倒数第二个a失败
4)对第2N-2个S尝试候选式aa,左边N-2个a匹配,右边最后一个a和倒数第二个a匹配,倒数第三个a失败
5)对第2N-4个S尝试候选式aa,左