《编译原理》复习题
51.写出C语言标识符集(字母或下划线开头的由字母、数字、下划线构成的串)的正规式。 解答:用D表示数字0-9,用L表示字母a-z|A-Z,则C语言标识符的正规式为:
(L|_)(L|D|_)*
52.有一语法制导定义如下,其中+表示符号连接运算:
S→B print B.vers B→a B.vers=a B→b B.vers=b
B→Ba B.vers=a+B.vers B→Bb B.vers=b+B.vers
若输入序列为abab,且采用自底向上的分析方法,则输出序列为(__________baba_________)。 用分析树表示求解过程。
S B B b B a B b a Print baba B.vers=baba B.vers=aba B.vers=ba B.vers=a
53.假设第一个四元式的序号是100,写出布尔表达式ae的四元式序列。
100 (j<, a, b, 106) 101 (j, _, _ , 102) 102 (jnz, c, _ ,104) 103 (j,_ ,_ ,q) 104 (j>,d, e, 106) 105 (j,_ , _ , q ) T:106 …… F:q …….
54.设有如下文法: G[E]:E→EWT|T T→T/F|F
F→(E)|a|b|c W→+|-
证明符号串a/(b-c)是句子。 解答:有推导
25
E?T?T/F?F/F?a/F?a/(E)?a/(EWT)?
a/(TWT)? a/(FWT)? a/(bWT)? a/(b-T)? a/(b-c),即从文法开始符号E能够推导出a/(b-c),所以a/(b-c)是文法G[E]的句子。 55.对于下列文法 G[S]: S→Sb|bA A→aA|a
(1)构造一个与G等价的LL(1)文法G′。 (2)对于文法G′,构造相应的LL(1)分析表。 解: (1)(5分)G′:S→bAS′ S′→b S′|ε
A→aA′
A′→A|ε
(2)(1分)FIRST(S)={ b } FIRST(S′)={ b,ε} FIRST(A)={a}
FIRST(A′)={a,ε} FOLLOW(S)={#} FOLLOW(S′)={#} FOLLOW(A)={b,#}
FOLLOW(A′)=(b,#)
LL(1)分析表:
a b #
S S→
bAS′
S′ S′→b S′→ε
S′
A A→
aA′
A′ A′→A A′→A′→ε
ε
56.构造下述文法的SLR(1)分析表。
G[S]:S→(A) A→ABB|B B→b 解:拓广文法:(1分) S′→S (0)
S→(A) (1) A→ABB (2)
A→B (3) B→b (4) 识别活前缀的DFA:(4分)
《编译原理》复习题
S→(L) S.num=L.num+1
(1)
0S→a S.num=0 L→L,S
(1)(1) S→.(A) L.num=if L.num>S.num then L.num else
( S.num L→S L.num= S.num
60.设有文法G[S]: ) S→aAcB|Bd I2:S→(.A) I3:S→(A.) I6: S→(A). A→.ABB A A→A.BB A→AaB|c
B I:A→AB.B B B→.b A→.B B→bScA|b 7I8:A→ABB. B→.b B→.b 该文法句型aAcbBdcc的句柄是
_______Bd_____________。 b B b 61.2.已知文法G[S]如下:构造该文法的LR(0)分析表。 I5: A→B. I4: B→b. G[S]:S→BB
FIRST集和follow集:(1分) B→aB|b
First(S)={(,c} follow( S)={#} 解:拓广文法:(1分) First(A)={b} follow(A)={b,)} (0)S?→S First(B)={b} follow(B)={b,)} (1)S→BB SLR(1)分析表:(4分) (2)B→aB
(3)B→b ACTION GOTO 识别活前缀的DFA 如下: b # S A B ( ) I:S′→.S S I:S′→S. 1 0 1 2 3 4 5 6 7 8 S2 S6 R4 R3 R2 S4 S4 R4 R3 S4 R2 Acc R1 1 3 5 7 8 a I0: S??.S S?.BB B?.ab B?.b b a I3: B?a.B B?.ab B?.b B I6: B?aB. S I1: S??S. B b I2: S?B.B B?.ab B?.b b B I5: S?BB. a b I4: B?b. 57.有一语法制导定义如下: S→bAb print “1” A→(B print “2” A→a print “3” B→aA) print “4” 若输入序列为b(a(a(aa)))b,且采用自下而上的分析方法,则输出序列为(__34242421____)。 58.写出赋值语句X= -(a+b)/(c-d)-(a+b*c)的逆波兰表示。Xab+-cd-/abc*+-= 59.为文法
G[S]:S→(L)|a L→L,S|S
写一语法制导定义,它输出句子中括号嵌套的最大层次数。
解: 使用num属性描述括号的嵌套最大层次数
S?→S print(S.num)
26
状态 LR(0)分析表如下:
Action a 0 1 2 3 4 5 6 S3 S3 S3 R3 R1 R2 b S4 S4 S4 R3 R1 R2 # acc R3 R1 R2 Goto S 1 B 2 5 6