ANTLR:输入不匹配

use*_*332 3 antlr

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

grammar Bug;

text: TEXT;

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

NEWLINE: [\n\r] -> skip ;
Run Code Online (Sandbox Code Playgroud)

运行antlr4和javac后,我跑了

grun Bug text -tree
aa
line 1:0 mismatched input 'aa' expecting TEXT
(text aa)
Run Code Online (Sandbox Code Playgroud)

但是如果我改为使用文字:语法中的WORD,那就没关系了.怎么了?

Sam*_*ell 8

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