ANTLR:输入不匹配

时间:2013-09-13 21:09:26

标签: antlr

我无法理解语法中的错误。 Bug.g4文件是:

grammar Bug;

text: TEXT;

WORD: ('a'..'z' | 'A'..'Z')+ ;
TEXT: ('a'..'z' | 'A'..'Z')+ ;

NEWLINE: [\n\r] -> skip ;

运行antlr4和javac后,我运行

grun Bug text -tree
aa
line 1:0 mismatched input 'aa' expecting TEXT
(text aa)

但如果我改为使用文字:语法中的WORD,那么事情就可以了。怎么了?

1 个答案:

答案 0 :(得分:8)

当两个词法分析器规则每个匹配相同的文本字符串,并且没有其他词法分析器规则匹配更长的文本字符串时,ANTLR根据语法中首先出现的规则分配令牌类型。在您的情况下,词法分析器规则永远不会生成TEXT令牌,因为WORD规则将始终匹配相同的文本,WORD规则出现在TEXT规则之前在语法中。如果您要在语法中颠倒这些规则的顺序,您将开始看到TEXT令牌,但您永远不会看到WORD令牌。