解析antlr4中的歧义

parsing ambiguity in antlr4

我正在尝试识别像 a for b in c for d in e 这样的列表理解表达式,我有以下语法:

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))

即一个 listcomp 和两个 iter。我应该如何更改语法才能达到这种效果?

关联性解决了歧义:

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;

在您的各种输入中尝试使用此语法。它解析您提供的两个输入。