编译原理平时作业答案Word文件下载.docx
《编译原理平时作业答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理平时作业答案Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。
考虑有一个自动机M1接受S1,那么自动机M1如下:
和L(M1)等价的正规表达式,即S1为:
((00|11)|(01|10)(00|11)*(01|10))*(01|10)(00|11)*
类似的考虑有一个自动机M2接受S2,那么自动机M2如下:
和L(M2)等价的正规表达式,即S2为:
((00|11)|(01|10)(00|11)*(01|10))*
因此,S为:
((00|11)|(01|10)(00|11)*(01|10))*(01|10)(00|11)*0|
((00|11)|(01|10)(00|11)*(01|10))*1
(6)
不包含子串011的由0和1组成的符号串的全体。
1*|1*0(0|10)*(1|ε)
(7)
由0和1组成的符号串,把它看成二进制数,能被3整除的符号串的全体。
假设w的自动机如下:
对应的正规表达式:
(1(01*0)1|0)*
2给出接受下列在字母表{0,1}上的语言的DFA。
所有以00结束的符号串的集合。
所有具有3个0的符号串的集合。
(1)DFA
M=({0,1},{q0,q1,q2},q0,{q2},δ)
其中δ定义如下:
δ(q0,0)=q1
δ(q0,1)=q0
δ(q1,0)=q2
δ(q1,1)=q0
δ(q2,0)=q2
δ(q2,1)=q0
(2)正则表达式:
1*01*01*01*
DFA
M=({0,1},{q0,q1,q2,q3},q0,{q3},δ)
δ(q1,1)=q1
δ(q2,0)=q3
δ(q2,1)=q2
δ(q3,1)=q3
3下面是用正规式表示的变量声明:
(int|float)id(,id)*;
请改用上下文无关文法表示,也就是写一个上下文无关文法,它和该正规式等价。
D→TL;
T→int|float
L→L,id|id
4试分析下面给出的if-then-else语句的文法,它的提出原本是为了矫正dangling-else(悬而未决的-else)文法的二义性:
stmt→ifexprthenstmt
|matched-stmt
matched-stmt→ifexprthenmatched-stmtelsestmt
|other
试说明此文法仍然是二义性的。
考虑句子ifethenifethenotherelseifethenotherelseother它具有如下所示的两种分析树stmtexprtheneifstmtifmatched-stmtexprthenmatched-stmteotherifeslestmtmatched-stmtexprthenmatched-stmteothereslestmtmatched-stmtotherstmtmatched-stmtifexprthenmatched-stmteifeslestmteslestmtmatched-stmtexprthenestmtotherexprthenmatched-stmteotherifmatched-stmtother
则上面给出的if-then-else文法仍是二义性的。
5证明下面文法是SLR
(1)文法,并构造其SLR分析表。
E→E+T|T
T→TF|F
F→F*|a|b
该文法的拓广文法G'
为
(0)E'
→E
(1)E→E+T
(2)E→T
(3)T→TF
(4)T→F
(5)F→F*
(6)F→a
(7)F→b
其LR(0)项目集规范族和goto函数(识别活前缀的DFA)如下:
I0={E'
→·
E,E→·
E+T,E→·
T,T→·
TF,T→·
F,F→·
F*,
F→·
a,F→·
b}
I1={E'
→E·
E→E·
+T}I2={E→T·
T→T·
F*,F→·
b}
I3={T→F·
F→F·
*}I4={F→a·
}I5={F→b·
}
I6={E→E+·
b}I7={T→TF·
*}I8={F→F*·
}
I9={E→E+T·
求FOLLOW集:
FOLLOW(E)={+,$}
FOLLOW(T)={+,$,a,b}
FOLLOW(F)={+,$,a,b,*}
构造的SLR分析表如下:
显然,此分析表无多重定义入口,所以此文法是SLR文法。
6为下面的文法构造LALR
(1)分析表
S→E
E→E+T|T
T→(E)|a
其拓广文法G'
:
(0)S'
→S
(1)S→E
(2)E→E+T
(3)E→T
(4)T→(E)
(5)T→a
构造其LR
(1)项目集规范族和goto函数(识别活前缀的DFA)如下:
I0={[S’→·
S,$],[S→·
E,$],[E→·
E+T,$/+],[E→·
T,$/+],
[T→·
(E),$/+],[T→·
a,$/+]}
I1={[S’→S·
$]}I2={[S→E·
$],[E→E·
+T,$/+]}I3={[E→T·
$/+]}
I4={[T→(·
E),$/+],[E→·
E+T,)/+],[E→·
T,)/+],
(E),)/+],[T→·
a,)/+]}
I5={[T→a·
$/+]}I6={[E→E+·
T,$/+],[T→·
a,$/+]}
I7={[T→(E·
),$/+],[E→E·
+T,)/+]}I8={[E→T·
)/+]}
I9={[T→(·
E),)/+},[E→·
T,)/+],[T→·
I10={[T→a·
)/+]}I11={[E→E+T·
$/+]}I12={[T→(E)·
I13={[E→E+·
a,)/+]}I14={[T→(E·
),)/+],[E→E·
+T,)/+]}
I15={[E→E+T·
)/+]}I16={[T→(E)·
合并同心的LR
(1)项目集,得到LALR的项目集和转移函数如下:
·
+T,$/+]}I3,8={[E→T·
$/+/)]}
I4,9={[T→(·
E),$/+/)],[E→·
I5,10={[T→a·
$/+/)]}I6,13={[E→E+·
T,$/+/)],[T→·
(E),$/+/)],[T→·
a,$/+/)]}
I7,14={[T→(E·
),$/+/)],[E→E·
+T,)/+]}I11,15={[E→E+T·
$/+/)]}
I12,16={[T→(E)·
LALR分析表如下:
7
(1)通过构造识别活前缀的DFA和构造分析表,来证明文法E→E+id|id是SLR
(1)文法。
先给出接受该文法活前缀的DFA如下:
再构造SLR分析表如下:
动作
转移
id+$
E
0
s2
1
s3acc
2
r2r2
3
s4
4
r1r1
表中没有多重定义的条目,因此该文法是SLR
(1)的。
(2)下面左右两个文法都和
(1)的文法等价
E→E+Mid|idE→ME+id|id
M→εM→ε
请指出其中有几个文法不是LR
(1)文法,并给出它们不是LR
(1)文法的理由。
只有文法
E→ME+id|id
M→ε
不是LR
(1)文法。
因为对于句子id+id+…+id来说,分析器在面临第一个id时需要做的空归约次数和句子中+id的个数一样多,而此时句子中+id的个数是未知的。
8根据自上而下的语法分析方法,构造下面文法的LL
(1)分析表。
D→TL
T→int|real
L→idR
R→,idR|ε
先计算FIRST和FOLLOW
FIRST(D)=FIRST(T)={int,real}
FIRST(L)={id}
FIRST(R)={,,ε}
FOLLOW(D)=FOLLOW(L)={$}
FOLLOW(T)={id}
FOLLOW(R)={$}
LL
(1)分析表如下:
int
real
id
$
D
D->
TL
T
T->
int
real
L
L->
idR
R
R->
idR
ε
9下面的文法产生的表达式是对整型和实型常数应用算符+形成的。
当两个整数相加时,结果仍为整数,否则就是实数。
T→num.num|num
(a)给出一个语法制导定义以确定每个子表达式的类型。
(b)扩充(a)中的语法制导定义把表达式翻译