1

我有以下模棱兩可文法,其中大寫字母規則是簡單的詞法令牌:我的語法中的歧義在哪裏?

program : function | function program 
function : FN ID ARROW TYPE invariants DASH block 
fn_call : ID L_PAREN CONSTANT R_PAREN 


invariants : invariant | invariant invariants 
invariant : TYPE ID COLON invariant_tests 
invariant_tests : test | test COMMA invariant_tests 
test : OPERATOR CONSTANT | STAR 


block : expression | expression block 
expression : loop | fn_call | assignment | def | constant 
loop : FOR def IN CONSTANT COLON block 
assignment : ID ASSIGN CONSTANT | ID ASSIGN ID 
def : TYPE assignment 

我接收8移/減少錯誤(使用Python 2.7和PLY時)。

模糊是我如何定義「一個或多個」的結果,例如。 block : expression | expression block

+1

只是出於好奇;爲什麼你使用PLY(建立在較老的Lex和Yacc上)而不是Flex和Bison? – nic

+1

@nic我在Python中更加舒適,而不是C.因爲這是我的第一個語法,我以爲我應該留在家鄉。使用Flex/Bison有巨大的好處嗎? – sdasdadas

+1

Flex被認爲比Lex快得多(即使Lexing是一項快速任務,因爲它可能是個好消息),並且在Berkeley許可下發布(Lex在一些AT&T許可下發布)。我相信Bison是一個比Yacc更穩定。奇怪的是,PLY是建立在舊版本之上的..我認爲只是玩L&Y就和F&B一樣好,如果你需要,很容易做出開關。 – nic

回答

0

正如前面的發言人所說,你必須區分「阻止用法」。 例如,嘗試:

loop : FOR def IN CONSTANT COLON block END FOR 
+1

前面的發言人是我 - 但由於我幾天不能接受我的答案,我會接受您的正確答案。謝謝! – sdasdadas

0

問題是我如何定義的loop

loop : FOR def IN CONSTANT COLON block

因爲如果塊屬於循環或函數解析器不明白。

基本上,dangling else問題的另一個變體。