2017-08-09 69 views
0

解析歧義我試圖識別列表理解這樣的表達式a for b in c for d in e和我有以下語法:在antlr4

iter : 'for' ID 'in' expr ; 

expr : ID 
    | expr iter+ # listcomp 
    | ID + ID # binary 
    ; 

但由於a for b in c for d in e它解析爲:

(a for b in (c for d in e)) 

listcomplistcomp

而不是:

(a (for b in c) (for d in e)) 

即,具有兩個iters的單個listcomp。我應該如何改變語法來獲得這種效果?

回答

0

關聯性解決該不確定性:

grammar Compre; 
program: iter+; 
iter : expr (forr ID inr expr)+ ; 
expr : ID    # IdExpr 
    | expr iter+  # listcomp 
    | expr '+' expr # BinaryExp 
    | NUM   # NumExpr 
    ; 
forr : <assoc=left>'for' ; 
inr : <assoc=right> 'in'  ; 
NUM : [0-9]+; 
ID : [a-z]; 
WS : [ \t\r\n]+ -> skip; 

嘗試在你的各種輸入該語法。它解析你提供的兩個輸入。 enter image description here

+0

謝謝。我希望不要添加括號來解決含糊不清的問題(我認爲它具有相關性?),就像在標準的python中一樣。 – JRR

+0

謝謝@TomServo。我實際上需要修改我的語法(參見上文),它允許'listcomp'採用python中的'expr'而不是'ID'(例如,'1 + x for x in l')。這似乎破壞了你的解決方案:( – JRR

+0

@JRR請看我最近的編輯。這也處理表達式在開始。 – TomServo