在ANTLR中,如何跳过简单表达式解析器中的值?

时间:2015-03-21 19:07:09

标签: antlr antlr4

您好我一直在尝试编写一个简单的表达式解析器,这是语法。

grammar extremelysimpleexpr ;

stat : expr ;
expr : sub ;
sub : add ( '-' add )* ;
add : VAL ( '+' VAL )* 
    | VAL
    ;  


VAL : [0-9]+ ;
[ \t\n\r]+ -> skip ;

它匹配这些表达式

1 + 1
0 + 3
4

但我不希望它匹配VAL的单次出现。我希望它与1 + 1匹配,但不匹配4。我该怎么做?

2 个答案:

答案 0 :(得分:1)

您必须插入谓词,类似这样(未经测试):

stat : expr { expr.start != expr.stop }? ;

但是不要这样做!这不是语法问题,而是语义问题。这是你应该在解析后验证的东西,除非你想让你的语法复杂化以获得这么小的好处。

使用访问者代替所有支票。


顺便说一句,你的语法为-+运算符指定了不同的优先级......我不确定这是你想要的。

使用ANTLR4,您可以写下:

expr : '(' expr ')'
     | '-' expr
     | expr ('*'|'/') expr
     | expr ('+'|'-') expr
     | VAL
     ;

答案 1 :(得分:0)

这个语法通过语法强制非平凡的表达式:

stat : expr ( '+' expr )+
     | expr ( '-' expr )+
     ;

expr : expr ( '+' expr )+
     | expr ( '-' expr )+
     | VAL
     ;