2016-03-16 110 views
2

以下語法生成句子a, a,a, b,b, b,...,h, b。不幸的是,它不是LR(1),所以不能用於諸如「yacc」之類的工具。是否有可能將此語法轉換爲LR(1)?

S -> a comma a. 
S -> C comma b. 
C -> a | b | c | d | e | f | g | h. 

是否有可能改變這個語法爲LR(1)(或甚至LALR(1),LL(k)或LL(1)),而不需要擴大非終結C,因此顯著增加製作的數量?

回答

2

只要您在某些規則中將非終結符C的前面逗號保持不變。

在這種情況下,很明顯,解析器無法決定,看到「a」,並且向前看「逗號」,是否減少或移位。所以如果C不變,這個語法就不是LR(1),正如你所說的那樣。

但是,解決方案在於「看到a」和「C不變」這兩個短語。你問,如果有修復不擴大C.沒有,但你可以擴展C「一點點」除去「一」從C,因爲這是問題的根源:

S -> a comma a . 
S -> a comma b . 
S -> C comma b . 
C -> b | c | d | e | f | g | h . 

所以,我們並沒有「顯着」增加製作的數量。

相關問題