4.1 解析器声明"mismatched input"与简单的回文语法



在这里看不到我的错误。给定一个简单的回文语法:

// test1.g
grammar test1;
start
    : 'a' start 'a'
    | 'b' start 'b'
    | 'a' 
    | 'b'
    |
    ;
WS : [ trn]+ -> skip ;

当给定输入aabbbaa时,生成的解析器报告:

line 1:5 mismatched input 'a' expecting 'b'

但对我来说,这似乎是法律上的投入。Antlr v4.1。

这里的问题是您没有包含如下规则:

entry : start EOF;

通过省略EOF,您遇到了一个错误#118,它可能在某些堆栈敏感的解析情况下表现出来(决策是LL,而不是SLL)。修复此问题对性能的影响是巨大的(不能低估),因此,在我们找到解决此问题的另一种方法之前,您需要意识到这一点,并确保开始解析时使用以显式EOF符号结尾的规则。