我无法理解我的语法错误。文件 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 ,一切都会好起来的。怎么了?
最佳答案
当两个词法规则都匹配相同的文本字符串,并且没有其他词法规则匹配更长的文本字符串时,ANTLR根据语法中最先出现的规则分配标记类型。在您的情况下,词法分析器规则永远无法生成 TEXT
标记,因为 WORD
规则将始终匹配相同的文本和 WORD
规则出现在语法中的 TEXT
规则之前。如果您在语法中颠倒这些规则的顺序,您会开始看到 TEXT
标记,但永远不会看到 WORD
标记。
关于ANTLR:输入不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18795301/