您好我一直在尝试编写一个简单的表达式解析器,这是语法。
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
。我该怎么做?
答案 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
;