我无法理解语法中的错误。 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,那么事情就可以了。怎么了?
答案 0 :(得分:8)
当两个词法分析器规则每个匹配相同的文本字符串,并且没有其他词法分析器规则匹配更长的文本字符串时,ANTLR根据语法中首先出现的规则分配令牌类型。在您的情况下,词法分析器规则永远不会生成TEXT
令牌,因为WORD
规则将始终匹配相同的文本,WORD
规则出现在TEXT
规则之前在语法中。如果您要在语法中颠倒这些规则的顺序,您将开始看到TEXT
令牌,但您永远不会看到WORD
令牌。