3

我无法理解我的语法错误。文件 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)

但如果我在语法中改用 text: WORD ,一切都会好起来的。怎么了?

4

1 回答 1

10

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

于 2013-09-13T21:53:09.103 回答