解析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))
即 listcomp
的 listcomp
而不是:
(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;
在您的各种输入中尝试使用此语法。它解析您提供的两个输入。
我正在尝试识别像 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))
即 listcomp
的 listcomp
而不是:
(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;
在您的各种输入中尝试使用此语法。它解析您提供的两个输入。