close

一道編譯原理習題及答案

以下是一道編譯原理習題,很具有代表性。
題目如下:
設有文法G1為:
S->a|^|(T)
T->T,S|S
1)給出 (a,(a,a)) 的最右推導
和規範歸約過程;
2)給出 (((a,a),^,(a)),a) 的最左推導;
3)畫出 (a,(a,a)) 最左推導的語法樹
(((a,a),^,(a)),a)最右推導的語法樹,並指出規約過程中每一步的控制碼;
4)判定G1是否是LL1)文法,如果是構造LL1)分析表,並分析輸入串(a,a#
5)計算文法中各非終結符的FIRSTVTLASTVT並構造算符優先表。


答案:
1
S=>(T) =>(T,S) =>(T,(T)) =>(T,(T,S)) =>(T,(T,a)) =>(T,(S,a)) =>(T,(a,a)) =>(S,(a,a)) =>(a,(a,a))

(a,(a,a))的規範歸約過程。

 

 

 

步驟

 

堆疊

 

 

 

 

 

1

 

#

 

(a, (a, a))#

 

移進

 

2

 

#(

 

a, (a, a))#

 

移進

 

3

 

#(a

 

, (a, a))#

 

歸約,Sa

 

4

 

#(S

 

, (a, a))#

 

歸約,LS

 

5

 

#(T

 

, (a, a))#

 

移進

 

6

 

#(T,

 

(a, a))#

 

移進

 

7

 

#(T, (

 

a, a))#

 

移進

 

8

 

#(T, (a

 

, a))#

 

歸約,Sa

 

9

 

#(T, (S

 

, a))#

 

歸約,TS

 

10

 

#(T, (T

 

, a))#

 

移進

 

11

 

#(T, (T,

 

a))#

 

移進

 

12

 

#(T, (T,a

 

))#

 

歸約,Sa

 

13

 

#(T, (T, S

 

))#

 

歸約,TT, S

 

14

 

#(T, (T

 

))#

 

移進

 

15

 

#(T, (T)

 

)#

 

歸約,S(T)

 

16

 

#(T, S

 

)#

 

移進

 

17

 

#(T, S)

 

#

 

歸約,TT, S

 

18

 

#(T)

 

#

 

歸約,S(T)

 

19

 

#S

 

#

 

接受

 

 

2 S=>(T) =>(T,S) =>(S,S) =>((T),S) =>((T,S),S) =>((T,S,S),S) =>((S,S,S),S) =>(((T),S,S),S) =>(((T,S),S,S),S) =>(((S,S),S,S),S) =>(((a,S),S,S),S) =>(((a,a),S,S),S) =>(((a,a),^,S),S) =>(((a,a),^,(T)),S) =>(((a,a),^,(S)),S) =>(((a,a),^,(a)),S) =>(((a,a),^,(a)),a)

3
(a, ((a, a), (a, a)))的一個最右推導

(a,a),^,(a)),a)的最右推導過程
最右推導 每一步歸約時的句柄

<S>

((<T>)

(<T>)

 

((<T>,<S>)

<T>,<S>

 

((<T>,a)

a

 

((<S>,a)

<S>

 

(((<T>),a)

(<T>)

 

(((<T>,<S>),a)

<T>,<S>

 

(((<T>,(<T>)),a)

(<T>)

 

(((<T>,(<S>)),a)

<S>

 

(((<T>,(a)),a)

a

 

(((<T>,<S>,(a)),a)

<T>,<S>

 

(((<T>,^,(a)),a)

^

 

(((<S>,^,(a)),a)

<S>

 

((((<T>),^,(a)),a)

(<T>)

 

((((<T>,<S>),^,(a)),a)

<T>,<S>

 

((((<T>,a),^,(a)),a)

a

 

((((<S>,a),^,(a)),a)

<S>

 

((((a,a),^,(a)),a)

a

(((a,a),^,(a)),a)的推導樹如下圖所示:


(((a,a),^,(a)),a)的推導樹


構造過程如下圖所示:

(((a,a),^,(a)),a)的推導樹自下而上的構造過程


4
)改寫文法為:

0) S->a
1) S->^
2) S->( T )
3) T->S N2
4) N2->, S N2
5) N2->ε

 

 

 

FIRST

 

FOLLOW

 

S

 

a   ^ (

 

# , )

 

T

 

a  ^ (

 

)

 

N2

 

, ε

 

)

 

對左部為N2的產生式可知:

FIRST (->, S N2)={,}
FIRST (->ε)={ε}
FOLLOW (N2)={)}
{,}∩ {)}=Ø
所以文法是LL(1)的。

Predicting Analysis Table

預測分析表

 

 

 

a

 

^

 

(

 

)

 

,

 

#

 

S

 

->a

 

->^

 

->( T )

 

 

 

 

 

 

 

T

 

->S N2

 

->S N2

 

->S N2

 

 

 

 

 

 

 

N2

 

 

 

 

 

 

 

->ε

 

->, S N2

 

 

 

 



(4)
對輸入串(a,a#的分析過程為:

步驟

 

狀態堆疊

 

當前符號

 

賸餘輸入字串

 

操作

 

1

 

#S

 

(

 

a,a)#

 

S->(T)

 

2

 

#)T(

 

(

 

a,a)#

 

匹配

 

3

 

#)T

 

A

 

,a)#

 

T->SN2

 

4

 

#)N2S

 

A

 

,a)#

 

S->a

 

5

 

#)N2a

 

A

 

,a)#

 

匹配

 

6

 

#)N2

 

,

 

a)#

 

N2->,SN2

 

7

 

#)N2S,

 

,

 

a)#

 

匹配

 

8

 

#)N2S

 

a

 

)#

 

S->a

 

9

 

#)N2a

 

a

 

)#

 

匹配

 

10

 

#)N2

 

)

 

#

 

N2->ε

 

11

 

#)

 

)

 

#

 

匹配

 

12

 

#

 

#

 

 

 

 

 

 

STATE CUR_CHAR INOUT OPERATION
#S ( a,a)#
#)T( ( a,a)# S->(T)
#)T a ,a)#
#)N2S a ,a)# T->SN2
#)N2a a ,a)# S->a
#)N2 , a)#
#)N2S, , a)# N2->,SN2
#)N2S a )#
#)N2a a )# S->a
#)N2 ) #
#) ) # N2->ε
# #

 可見輸入串(a,a)#是文法的句子。

5
G[S]FIRSTVTLASTVT

FIRSTVT (S) ={a , ^ , (} FIRSTVT (T) ={ a , ^ , ( , ,}
LASTVT(S) ={ a , ^ , } } LASTVT(T) ={ a , ^ , } , , }

FIRSTVTLASTVT

 

 

 

FIRSTVT

 

LASTVT

 

S

 

a^、(

 

a^、)

 

T

 

,、a^、(

 

,、a^)

   
      G[S]
的算符優先關係表

算符優先關係

 

 

 

a

 

(

 

)

 

,

 

^

 

#

 

a

 

 

 

 

 

 

 

 

 

 

(

 

 

 

 

 

 

 

 

 

)

 

 

 

 

 

 

 

 

 

 

,

 

 

 

 

 

 

 

 

^

 

 

 

 

 

 

 

 

 

 

#

 

 

 

 

 

 

 

 

 

 


     G[S]的優先函數

對應的算符優先函數為:

 

 

 

a

 

(

 

)

 

,

 

^

 

#

 

S

 

2

 

1

 

2

 

2

 

2

 

1

 

T

 

3

 

3

 

1

 

1

 

3

 

1



arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Bluelove1968 的頭像
    Bluelove1968

    藍色情懷

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()