在antlr4

问题描述:

解析歧义我试图识别列表理解这样的表达式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。我应该如何改变语法来获得这种效果?

关联性解决该不确定性:

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