用于字母数字字的ANTLR解析器,字母数字字之间可能有空格

用于字母数字字的ANTLR解析器,字母数字字之间可能有空格,antlr,antlr4,Antlr,Antlr4,首先,我尝试识别一个正常的词,下面的方法很好: grammar Test; myToken: WORD; WORD: (LOWERCASE | UPPERCASE )+ ; fragment LOWERCASE : [a-z] ; fragment UPPERCASE : [A-Z] ; fragment DIGIT: '0'..'9' ; WHITESPACE : (' ' | '\t')+; 就在我在“myToken”下面添加解析器规则的时候,甚至我的单词标记也没有被输入字符串识别

首先,我尝试识别一个正常的词,下面的方法很好:

grammar Test;

myToken: WORD;
WORD: (LOWERCASE | UPPERCASE )+ ;
fragment LOWERCASE  : [a-z] ;
fragment UPPERCASE  : [A-Z] ;
fragment DIGIT: '0'..'9' ;
WHITESPACE  : (' ' | '\t')+;
就在我在“myToken”下面添加解析器规则的时候,甚至我的单词标记也没有被输入字符串识别为“abc”


有人知道为什么吗?

这是因为ANTLR的lexer匹配“先到先得”。这意味着它将尝试将给定的输入与第一个指定的(在源代码中)规则匹配,如果其中一个可以匹配输入,它将不会尝试将其与其他规则匹配

在您的情况下,
ALPHA\u NUMERIC\u WS
确实与
WORD
(及更多)匹配相同的内容,并且因为它是在
WORD
之前指定的,
WORD
永远不会用于匹配输入,因为没有任何输入可以被
WORD
匹配,而第一次处理的
字母数字\WS
无法匹配。(这同样适用于
WS
数字
)规则

我猜您想要的不是创建一个
字母数字\u WS
-标记(通过将其指定为lexer规则来实现),而是将其作为一个解析器规则,这样就可以从另一个parsre规则引用它,从而允许任意序列的
单词
s、
数字
s和
WS
s

因此,你应该这样写:

alpha_numweric_ws: ( WORD | DIGIT | WHITESPACE)+;

如果您确实想要创建相应的标记,您可以删除以下规则,或者您需要考虑词法分析器的工作是什么,以及在词法分析器和解析器之间的界限在哪里(您需要重新设计语法以使其工作)。

这是因为ANTLR的词法分析器匹配“先到先服务”。这意味着它将尝试将给定的输入与第一个指定的(在源代码中)规则匹配,如果其中一个可以匹配输入,它将不会尝试将其与其他规则匹配

在您的情况下,
ALPHA\u NUMERIC\u WS
确实与
WORD
(及更多)匹配相同的内容,并且因为它是在
WORD
之前指定的,
WORD
永远不会用于匹配输入,因为没有任何输入可以被
WORD
匹配,而第一次处理的
字母数字\WS
无法匹配。(这同样适用于
WS
数字
)规则

我猜您想要的不是创建一个
字母数字\u WS
-标记(通过将其指定为lexer规则来实现),而是将其作为一个解析器规则,这样就可以从另一个parsre规则引用它,从而允许任意序列的
单词
s、
数字
s和
WS
s

因此,你应该这样写:

alpha_numweric_ws: ( WORD | DIGIT | WHITESPACE)+;
如果您确实想要创建相应的标记,您可以删除以下规则,或者您需要考虑词法分析器的工作是什么,以及在词法分析器和解析器之间的界限在哪里(您需要重新设计语法以使其工作)