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

In ANTLR how do I skip the value in a simple expression parser?

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

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。我该怎么做?

你必须插入谓词,像这样(未经测试):

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
     ;