ANTLR4 - Lexer无法匹配由片段

时间:2018-02-16 05:03:09

标签: python-3.x antlr4 mismatch

我在使用这个语法时遇到了麻烦

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规则匹配,这是正确的。问题是“开始”不匹配。

通过使用ErrorListener,我在syntaxError方法

中得到以下消息
mismatched input 'start' expecting START

在位置1:8,这是“开始”一词的开头。

我是ANTLR的新手,我无法弄清楚我错在哪里。

BTW,我正在使用ANTLR 4.7.1,它在python 3中运行正常。

1 个答案:

答案 0 :(得分:1)

我完全忘记了词法分析器的规则很重要。我将SIMBOL规则置于START规则之上,以便“开始”#39;单词作为SIMBOL令牌而不是START令牌不匹配。

我通过将SIMBOL规则移到语法的末尾来解决问题。