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

时间:2019-09-17 08:09:46

标签: parsing whitespace 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 : [ \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规则,这意味着应该以相同的方式解析两个表达式?

1 个答案:

答案 0 :(得分:1)

Lexer规则尽可能匹配字符,因此- 1被标记为MINUS,而INT-1(没有空格)被标记为单个{{ 1}}。

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