为什么在这种情况下,空格对antlr4很重要?



假设我有这个语法,用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被标记为MINUSINT-1(没有空格(作为单个INT

您必须意识到词法分析器不侦听解析器。如果解析器尝试匹配输入1-1INT MINUS INT的标记,则词法分析器不会生成这些标记。由于词法分析器匹配尽可能多的字符,因此它将始终为该输入创建两个INT标记(没有MINUS!解析和标记化是 2 个独立的步骤。

相关内容

  • 没有找到相关文章

最新更新