編譯原理習題上(3,4,5章)

詞法分析

3.3.5

包含5個元音的所有小寫字母串,這些串中的元音按順序出現

vowel -> other* a (other|a)* e (other|e)* i (other|i)* o (other|o)* u (other|u)*
other -> [bcdfghjklmnpqrstvwxyz]

3.4.1

給出識別下列各個正則表達式所描述的語言狀態轉換圖。

  1. a(a|b)*a

NFA:
在這裏插入圖片描述

DFA:

NFA DFA a b
{0} A B
{1,2,3,5,8} A B C
{2,3,4,5,7,8,9} C C D
{2,3,5,6,7,8} D C D

在這裏插入圖片描述

最少狀態的 DFA(狀態轉換圖):合併不可區分的狀態 B 和 D

在這裏插入圖片描述

  1. ((ε|a)b*)*

在這裏插入圖片描述

  1. (a|b)*a(a|b)(a|b)
    NFA:
    在這裏插入圖片描述

DFA:

NFA DFA a b
{0,1,2,4,7} A B C
{1,2,3,4,6,7,8,9,11} B D E
{1,2,4,5,6,7} C B C
{1,2,4,5,6,7,12,13,14,16} E H I
{1,2,3,4,6,7,8,9,10,11,13,14,15,16,18} F F G
{1,2,4,5,6,7,12,13,14,16,17,18} G H I
{1,2,3,4,6,7,8,9,11,15,18} H D E
{1,2,4,5,6,7,17,18} I B C

最少狀態的 DFA(狀態轉換圖):合併不可區分的狀態 A 和 C
在這裏插入圖片描述

  1. a*ba*ba*ba*

在這裏插入圖片描述

3.7.1

將下圖的NFA轉換爲DFA
1.
在這裏插入圖片描述
NFA轉換表

state a b ε
0 {1} {3}
1 {2} {0}
2 {3} {1}
3 {0} {2}
state a b
0 {0,1,2,3} {0,1,2,3}
1 {0,1,2,3} {0,1,2,3}
2 {0,1,2,3} {0,1,2,3}
3 {0,1,2,3} {0,1,2,3}
NFA DFA a b
{0,1,2,3} A A A

在這裏插入圖片描述

在這裏插入圖片描述

state a b
0 {0,1} {0}
1 {1,2} {1}
2 {0,1,2} {0,2,3}
3
NFA DFA a b
{0} A B A
{0,1} B C B
{0,1,2} C C D
{0,1,2,3} D C D

在這裏插入圖片描述

語法分析

4.4.2

有沒有可能通過某種方法修改下面文法,構造出一個與該練習中的語言(運算分量爲 a 的後綴表達式)對應的預測分析器?

S -> SS+ | SS* | a

  1. 提取左公共因子
S -> SSA | a
A -> + | *
  1. 消除左遞歸
S -> aB
B -> SAB | ε
A -> + | *
  1. 構造預測分析表
  • First(S) = {a},First(B) = {a, ε},First(A) = {+,*}
  • Follow(S) = {+,*,$},Follow(B) = {+,*,$},Follow(A) = {a}
非終結符號 輸入符號
+ * a $
S S -> aB
A A -> + A -> *
B B -> ε B -> ε B -> SAB B -> ε

4.4.1

對下面的文法構造預測分析表

    bexpr -> bexpr or bterm | bterm
    bterm -> bterm and bfactor | bfactor
    bfactor -> not bfactor | ( bexpr ) | true | false
  1. 無左公共因子
  2. 消除左遞歸
	bexpr -> bterm A
	A -> or bterm A | ε
	bterm -> bfactor B
	B -> and bfactor B | ε
	bfactor -> not bfactor | ( bexpr ) | true | false
  1. 預測分析表
first(bexpr) =first(bterm)  = first(bfactor)=  {not,(,true,false};
first(A) = {or,ε};
first(B) = {and,ε};
follow(bexpr) = follow(A) = {),$};
follow(bterm) = follow(B) = {or,),$};
follow(bfactor) = {and,or,),$};
非終結符號 輸入符號
and or not ( ) true false $
bexpr bexpr -> bterm A bexpr -> bterm A bexpr -> bterm A bexpr -> bterm A
A A -> or bterm A A -> ε A -> ε
bterm bterm -> bfactor B bterm -> bfactor B bterm -> bfactor B bterm -> bfactor B
B B -> and bfactor B | ε B -> ε B -> ε
bfactor bfactor -> not bfactor bfactor -> (bexpr) bfactor -> true bfactor -> false

4.5.2

對於文法 S -> S S + | S S * | a 和下面各個最右句型,指出最右句型的句柄。

  1. SSS+a*+
    SS+
  2. SS+a*a+
    SS+
  3. aaa*a++
    a

4.5.3

對於下面的輸入符號串和文法,說明相應的自底向上語法分析過程。
練習 文法 S -> S S + | S S * | a ,串 aaa*a++

輸入 句柄 動作
$ aaa*a++$ 移入
$a aa*a++$ a 歸約:S -> a
$S aa*a++$ 移入
$Sa a*a++$ a 歸約:S -> a
$SS a*a++$ 移入
$SSa *a++$ a 歸約:S -> a
$SSS *a++$ 移入
$SSS* a++$ SS* 歸約:S -> SS*
$SS a++$ 移入
$SSa ++$ a 歸約:S -> a
$SSS ++$ 移入
$SSS+ +$ SS+ 歸約:S -> SS+
$SS +$ 移入
$SS+ $ SS+ 歸約:S -> SS+
$S $ 接受

4.6.2

爲下面的文法構造SLR項集。計算這些項集的GOTO函數。給出這個函數的語法分析表。這個文法是SLR文法嗎?

S->SS+|SS*|a
  1. 提取左公因子和消除左遞歸後的增廣文法
	S' -> S
    S -> a B
    B -> a B A B
    B -> ε
    A -> +
    A -> *
  1. LR(0)項目集

在這裏插入圖片描述

  1. 語義分析表
	FOLLOW(S) = [$]
    FOLLOW(A) = [a,+,*, $]
    FOLLOW(B) = [+, * ,$]
狀態 ACTION GOTO
a + * $ S A B
0 s2 1
1 acc
2 s4 r3 r3 r3 3
3 r1
4 s4 r3 r3 r3 5
5 s7 s8 6
6 s4 r3 r3 r3 9
7 r4 r4 r4 r4
8 r5 r5 r5 r5
9 r2 r2 r2

無衝突,這顯然是一個 SLR 文法

  1. 利用語法分析表,給出處理輸入aa*a+時的各個動作。
符號 輸入 動作
(1) 0 aa*a+$ 移入
(2) 02 a a*a+$ 移入
(3) 024 aa *a+$ 歸約:B -> ε
(4) 0245 aaB *a+$ 移入
(5) 02458 aaB* a+$ 歸約:A -> *
(6) 02456 aaBA a+$ 移入
(7) 024564 aaBAa +$ 歸約:B -> ε
(8) 0245645 aaBAaB +$ 移入
(9) 02456457 aaBAaB+ $ 歸約:A -> +
(10) 02456456 aaBAaBA $ 歸約:B -> ε
(11) 024564569 aaBAaBAB $ 歸約:B -> aBAB
(12) 024569 aaBAB $ 歸約:B -> aBAB
(13) 023 aB $ 歸約: S -> aB
(14) 0 S $ 接受

4.6.6

說明下面的文法

	S->SA|A
    A->a

是SLR(1)的,但不是LL(1)的

左遞歸文法和二義性的文法都不可能是LL(1)文法。

  1. 無左公共因子,消除左遞歸
	S' -> S
	S -> AB
	B -> AB
	B ->  ε
	A->a
  1. 預測分析表
	first(S) = first(A)= {a};
	first(B) = {a, ε};
	follow(S) = follow(B) = {$};
	follow(A)= {a,$};
狀態 ACTION GOTO
a $ S A B
0 s3 s1 s2
1 acc
2 s3 r3 s5 s4
3 r4 r4
4 r1
5 s3 r3 s5 s6
6 r2

該文法生成的語法分析表是沒有衝突的

4.7.1

爲練習 4.2.1 的文法 S -> S S + | S S * | a 構造

  1. 規範 LR 項集族
  2. LALR 項集族

4.7.5

說明下面的文法

    S -> A a | b A c | B c | b B a
    A -> d
    B -> d

是 LR(1) 的,但不是 LALR(1) 的

  1. 構造該文法的增廣文法如下:
	S' -> S
	S -> Aa
	S -> bAc
	S -> Bc
	S -> bBa
	A -> d
	B -> d
  1. 構造該文法的LR(1)項目集如下:

在這裏插入圖片描述

  1. 構造LR(1)分析表
GOTO(I0,S)=I1  GOTO(I0,A)=I2   GOTO(I0,b)=I3   GOTO(I0,B)=I4  GOTO(I0,d)=I5 
GOTO(I1,$)=acc  
GOTO(I2,a)=I6   
GOTO(I3,A)=I7  GOTO(I3,B)=I8 GOTO(I3,d)=I9  
GOTO(I4,c)=I10  
GOTO(I7,c)=I11  
GOTO(I8,a)=I12
狀態 ACTION GOTO
a b c d $ S A B
0 s3 s5 1 2 4
1 acc
2 s6
3 s9 7 8
4 s10
5 r5 r6
6 r1
7 s11
8 s12
9 r6 r5
10 r3
11 r2
12 r4

可見該分析表中不存在二義性的條目,故該文法是LR(1)文法

  1. 合併I5和I9項目集,構造LALR分析表
狀態 ACTION GOTO
a b c d $ S A B
0 s3 s59 1 2 4
1 acc
2 s6
3 s59 7 8
4 s9
59 r5|r6 r5|r6
6 r1
7 s10
8 s11
9 r3
10 r2
11 r4

可見該分析表中存在二義性的條目,故該文法不是LALR(1)文法

語法制導的翻譯

5.1.2

擴展圖 5-4 中的 SDD,使它可以像圖 5-1 所示的那樣處理表達式

在這裏插入圖片描述
在這裏插入圖片描述

產生式 語義規則
1) LEnL \to E n L.val=E.valL.val = E.val
2) ETEE \to TE' E.inh=T.valE'.inh = T.val
E.val=E.synE.val = E'.syn
3) E+TE1E' \to +TE_1' E1.inh=E.inh+T.valE_1'.inh = E'.inh + T.val
E.syn=E1.synE'.syn = E_1'.syn
4) EεE' \to ε E.syn=E.inhE'.syn = E'.inh
5) TFTT \to FT' T.inh=F.valT'.inh = F.val
T.val=T.synT.val = T'.syn
6) TFT1T' \to *FT'_1 T1.inh=T1.inhF.valT'_1.inh = T'_1.inh*F.val
T.syn=T1.synT'.syn = T'_1.syn
7) TεT' \to ε T.syn=T.inhT'.syn = T'.inh
8) F(E)F \to (E) F.val=E.valF.val = E.val
9) FdigitF \to digit F.val=digit.lexvalF.val = digit.lexval

(3+4)*(5+6)n 語法分析樹

在這裏插入圖片描述

在這裏插入圖片描述

5.2.2

對於圖 5-8 中的 SDD,給出下列表達式對應的註釋語法分析樹:

在這裏插入圖片描述

  1. int a, b , c

在這裏插入圖片描述

5.2.4

這個文法生成了含“小數點”的二進制數:

    S -> L.L|L
    L -> LB|B
    B -> 0|1

設計一個 L 屬性的 SDD 來計算 S.val,即輸入串的十進制數值。比如,串 101.101 應該被翻譯爲十進制數 5.625。

L具有繼承屬性side和綜合屬性m

L.side表示小數點的左邊或右邊(1表示左邊0表示右邊),L.m二進制串的長度即冪次。

產生式 語義規則
1) SL1.L2S \to L_1.L_2 L1.side=1L_1.side = 1
L2.side=0L_2.side = 0
S.val=L1.val+L2.valS.val = L_1.val+L_2.val
2) SLS \to L L.side=1L.side = 1
S.val=L.valS.val = L.val
3) LL1BL \to L_1B L1.side=L.sideL_1.side = L.side
L.m=L1.m+1L.m = L_1.m +1
L.val=L1.side?L1.val2+B.val:L1.val+B.val>>mL.val = L_1.side ? L_1.val*2+B.val : L1.val + B.val >> m
4) LBL \to B L.m=1L.m = 1
L.val=L.side?B.val:B.val/2L.val = L.side ? B.val : B.val / 2
5) B0B \to 0 B.val=0B.val = 0
6) B1B \to 1 B.val=1B.val = 1

5.4.3

下面的 SDT 計算了一個由 0 和 1 組成的串的值。它把輸入的符號串當做正二進制數來解釋。

BB1 0 {B.val=2B1.val}B \to B_1 \ 0 \ \{B.val = 2 * B_1.val\}
 B1 1 {B.val=2B1.val+1}\quad \ | \quad B_1 \ 1\ \{B.val = 2 * B_1.val + 1\}
 1 {B.val=1}\quad \ | \quad 1\ \{B.val = 1\}

改寫這個 SDT,使得基礎文法不再是左遞歸的,但仍然可以計算出整個輸入串的相同的 B.val 的值。

  1. 提取左公共因子

BB1 digit {B.val=2B1.val+digit.val} 1 {B.val=1}B \to B_1\ digit\ \{B.val=2*B_1.val+digit.val\}\\ \quad\ |\quad 1\ \{B.val =1\}
digit0 {digit.val=0} 1 {digit.val=1}digit \to 0\ \{digit.val=0\}\\ \qquad\ |\quad 1\ \{digit.val = 1\}

  1. 消除左遞歸
	B -> 1 {A.i = 1}A
	A -> digit {A_1.i = 2*A.i + digit.val}A_1 {A.val = A_1.i}
	A -> ε {A.val = A.i}
	digit -> 0 {digit.val = 0}
	digit -> 1 {digit.val = 1}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章