我正在尝试编写一个语法来解析算术表达式。
当我尝试添加对一元减 (-) 的支持时,我面临以下问题:
仅当我在之间留有空格时,输入才会匹配,例如 - 10。
如果输入为 -10,则它与单词匹配,因为它也是有效的词法分析器。
如何更改语法,以便可以使用没有空格的一元运算符。
grammar Arithmetic;
parse
: expression EOF
;
expression
: op=SUBTRACT exp=expression
| left=expression op= EXPONENT right=expression
| left=expression op= DIVIDE right=expression
| left=expression op= MULTIPLY right=expression
| left=expression op= MODULUS right=expression
| left=expression op= ADD right=expression
| left=expression op= SUBTRACT right=expression
| INTEGER
| WORD
;
ADD : '+';
SUBTRACT : '-' ;
MULTIPLY : '*' ;
DIVIDE : '/' ;
MODULUS : '%' ;
EXPONENT : '^' ;
INTEGER : [0-9]+;
WORD : (ALPHANUMERIC | '_' | '-' | '.' | SQ | DQ)+;
WS : [ \r\t\u000C\n]+ -> skip;
ALPHANUMERIC : [a-zA-Z0-9];
SQ : '\''.*? '\'';
DQ : '"'.*? '"';
如果输入为 -10,则它与单词匹配,因为它也是有效的词法分析器。
如何更改语法以便可以使用没有空格的一元运算符。
那是不可能的。您需要更改与
Word
匹配的词法分析器规则。 ANTLR 的词法分析器以非常可预测的方式工作(无论解析器试图匹配什么):
因此,这清楚地表明
-10
将始终成为 Word
代币。没有办法绕过它。