假设我有这个语法,用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 : [ trn]+ -> 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
规则(,这意味着两个表达式都应该以相同的方式解析?
Lexer 规则匹配尽可能多的字符,因此- 1
被标记为MINUS
和INT
,-1
(没有空格(作为单个INT
。
您必须意识到词法分析器不侦听解析器。如果解析器尝试匹配输入1-1
INT MINUS INT
的标记,则词法分析器不会生成这些标记。由于词法分析器匹配尽可能多的字符,因此它将始终为该输入创建两个INT
标记(没有MINUS
!解析和标记化是 2 个独立的步骤。