嗨,我一直在尝试编写一个简单的表达式解析器,这是语法。
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
;