5

我有以下語法:製作語法LL(1)

小號→一個S B S | b S a S | ε

因爲我試圖爲它編寫一個小編譯器,所以我想使它成爲LL(1)。我看到這裏似乎有一個第一/二次衝突,我知道我必須使用替代來解決它,但我不確定如何去做。這裏是我提出的語法,但我不確定它是否正確:

S-> aSbT | epsilon

T> bFaF | epsilon

F-> epsilon

有人可以幫忙嗎?

回答

4

在他original paper on LR parsing,克努特給出了這種語言,這是他臆想「是這個語言最短的可能明確的語法:」下面的語法

小號→及小量; | aAbS | bBaS

A →ε | aAbA

B →ε | bBaB

直觀上,它試圖將任何As和Bs字符串分解爲完全平衡的塊。一些塊以a開始並以b結束,而其他塊以b開始並以a結束。

我們可以計算FIRST和FOLLOW集如下:

FIRST(S)= {&小量,A,B}

FIRST(A)= {&小量;,一}

FIRST(b)= {&小量,b}

FOLLOW(S)= {$}

FOLLOW(A)= {b}

FOLLOW(B)= {A}

在此基礎上,我們得到以下LL(1)解析表:

| a | b | $ 
--+-------+-------+------- 
S | aAbS | bBaS | e 
A | aAbA | e | 
B | e | bBaB | 

所以這個語法不僅LR(1) ,但它也是LL(1)。

希望這會有所幫助!

+0

感謝您的幫助。我也很好奇你對我提出的語法有什麼看法 - 在我看來,它也是LL(1),與Knuth's沒有太大區別。我也看不到任何可能會失敗的字符串。 – 2013-03-02 02:47:19

+1

@ JohnRoberts-我認爲你的語法不能正常工作 - 例如,它不能得到任何以'b'開頭的字符串。 – templatetypedef 2013-03-03 07:56:21