可以说我有用Antlr4编写的语法:
grammar Test;
start : expr* ;
expr : expr '-' expr
| INT ;
MINUS : '-' ;
INT: MINUS? DIGIT+ ; // Disclaimer: this definition of an integer is just for illustration purposes
DIGIT : '0'..'9' ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
我的思考过程是1-1
应该与1 - 1
相同;应该是expr '-' expr
。如果是1 - 1
start
expr(-)
expr(1) expr(1)
上面的树似乎是正确的,再次评估为expr '-' expr
。
但是当不使用空格时,antlr认为有两个INT expr。如果是1-1
start
expr(1) expr(-1)
是否不应该跳过所有空格(使用WS
规则,这意味着应该以相同的方式解析两个表达式?
答案 0 :(得分:1)
Lexer规则尽可能匹配字符,因此- 1
被标记为MINUS
,而INT
和-1
(没有空格)被标记为单个{{ 1}}。
您必须认识到词法分析器不会监听解析器。如果解析器尝试匹配输入INT
的标记INT MINUS INT
,则词法分析器不会生成这些标记。由于词法分析器匹配尽可能多的字符,因此它将始终为该输入创建两个1-1
标记(没有INT
!)。解析和标记化是两个单独的步骤。