ANTLR4 - Lexer 无法匹配由片段组成的标记

ANTLR4 - Lexer can't match a token made of fragments

我的语法有问题

prog : start line* end ;
start : SIMBOL START NUM NL ;

SIMBOL : [a-zA-Z]+ ;
NUM : [0-9]+ ;
START : S T A R T ;
WS : [ \t]+ -> skip ;
NL  :   '\r'? '\n' ;

fragment A : [aA] ;
fragment B : [bB] ;
fragment C : [cC] ;
fragment D : [dD] ;
fragment E : [eE] ;
fragment F : [fF] ;
fragment G : [gG] ;
fragment H : [hH] ;
fragment I : [iI] ;
fragment J : [jJ] ;
fragment K : [kK] ;
fragment L : [lL] ;
fragment M : [mM] ;
fragment N : [nN] ;
fragment O : [oO] ;
fragment P : [pP] ;
fragment Q : [qQ] ;
fragment R : [rR] ;
fragment S : [sS] ;
fragment T : [tT] ;
fragment U : [uU] ;
fragment V : [vV] ;
fragment W : [wW] ;
fragment X : [xX] ;
fragment Y : [yY] ;
fragment Z : [zZ] ;

我正在测试的字符串如下

test    start   1010
        add     30
        end     simbol

'test'字符合SIMBOL规则,正确。问题是 'start' 不匹配。

通过使用 ErrorListener,我在 syntaxError 方法中得到以下消息

mismatched input 'start' expecting START

位置 1:8,即 'start' 单词的开头。

我是 ANTLR 的新手,我不知道我哪里错了。

顺便说一句,我正在使用 ANTLR 4.7.1,它在 python 3.

中具有适当的运行时

我完全忘记了词法分析器规则顺序很重要。我在 START 规则之上设置了 SIMBOL 规则,因此 'start' 单词作为 SIMBOL 令牌而不是 START 令牌不匹配。

我通过将 SIMBOL 规则移到语法末尾解决了这个问题。