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



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

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

VAL : [0-9]+ ;
[ tnr]+ -> skip ;

它匹配以下表达式

1 + 1
0 + 3
4

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

您必须插入谓词,类似于以下内容(未经测试):

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

但不要这样做这不是语法问题,而是语义的问题。这是您应该在解析后验证的东西,除非您想为了这样一点好处而使语法复杂化。

所有支票都使用访问者。


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

有了ANTLR4,你可以写下:

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

此语法通过语法强制非平凡表达式:

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

相关内容

  • 没有找到相关文章

最新更新