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