解析antlr4中的歧义

时间:2017-08-09 23:16:16

标签: parsing grammar antlr4

我正在尝试识别像map这样的列表理解表达式,并且我有以下语法:

className={styles['card_content--icn']}

但是给定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)) 。我应该如何改变语法才能达到这个效果?

1 个答案:

答案 0 :(得分: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