詞法分析
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
給出識別下列各個正則表達式所描述的語言狀態轉換圖。
- 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
- ((ε|a)b*)*
- (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
- 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
- 提取左公共因子
S -> SSA | a
A -> + | *
- 消除左遞歸
S -> aB
B -> SAB | ε
A -> + | *
- 構造預測分析表
- 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
- 無左公共因子
- 消除左遞歸
bexpr -> bterm A
A -> or bterm A | ε
bterm -> bfactor B
B -> and bfactor B | ε
bfactor -> not bfactor | ( bexpr ) | true | false
- 預測分析表
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 和下面各個最右句型,指出最右句型的句柄。
- SSS+a*+
SS+ - SS+a*a+
SS+ - 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
- 提取左公因子和消除左遞歸後的增廣文法
S' -> S
S -> a B
B -> a B A B
B -> ε
A -> +
A -> *
- LR(0)項目集
- 語義分析表
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 文法
- 利用語法分析表,給出處理輸入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)文法。
- 無左公共因子,消除左遞歸
S' -> S
S -> AB
B -> AB
B -> ε
A->a
- 預測分析表
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 構造
- 規範 LR 項集族
- LALR 項集族
4.7.5
說明下面的文法
S -> A a | b A c | B c | b B a
A -> d
B -> d
是 LR(1) 的,但不是 LALR(1) 的
- 構造該文法的增廣文法如下:
S' -> S
S -> Aa
S -> bAc
S -> Bc
S -> bBa
A -> d
B -> d
- 構造該文法的LR(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)文法
- 合併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) | ||
2) | ||
3) | ||
4) | ||
5) | ||
6) | ||
7) | ||
8) | ||
9) |
(3+4)*(5+6)n 語法分析樹
5.2.2
對於圖 5-8 中的 SDD,給出下列表達式對應的註釋語法分析樹:
- 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) | ||
2) | ||
3) | ||
4) | ||
5) | ||
6) |
5.4.3
下面的 SDT 計算了一個由 0 和 1 組成的串的值。它把輸入的符號串當做正二進制數來解釋。
改寫這個 SDT,使得基礎文法不再是左遞歸的,但仍然可以計算出整個輸入串的相同的 B.val 的值。
- 提取左公共因子
- 消除左遞歸
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}