ANTLR:输入不匹配

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)

但是如果我在语法中使用文本:WORD,一切都没问题。出了什么问题?

1个回答

10
当两个词法规则都匹配同一个字符串,且没有其他词法规则匹配更长的文本时,ANTLR将根据语法中首次出现的规则赋予令牌类型。在你的情况下,词法规则永远无法产生一个名为“TEXT”的令牌类型,因为“WORD”规则将始终匹配相同的文本,并且“WORD”规则出现在语法中“TEXT”规则之前。如果你反转这些规则在语法中的顺序,你会开始看到“TEXT”令牌,但永远不会看到“WORD”令牌。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接