用于中间可能有空格的字母数字单词的 ANTLR 解析器

ANTLR parser for alpha numeric words which may have whitespace in between

首先我尝试识别一个正常的单词,下面的单词工作正常:

grammar Test;

myToken: WORD;
WORD: (LOWERCASE | UPPERCASE )+ ;
fragment LOWERCASE  : [a-z] ;
fragment UPPERCASE  : [A-Z] ;
fragment DIGIT: '0'..'9' ;
WHITESPACE  : (' ' | '\t')+;

就在我在 "myToken" 下面添加以下解析器规则时,甚至我的 WORD 标记也没有被输入字符串识别为 "abc"

ALPHA_NUMERIC_WS: ( WORD | DIGIT | WHITESPACE)+;

有人知道这是为什么吗?

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

在你的情况下 ALPHA_NUMERIC_WS 确实匹配与 WORD 相同的内容(以及更多)并且因为它是在 WORD 之前指定的,所以 WORD 永远不会被用来匹配输入,因为没有输入可以被 WORD 匹配,而不能被第一个处理的 ALPHA_NUMERIC_WS 匹配。 (这同样适用于 WSDIGIT)规则。

我猜你想要的不是创建一个 ALPHA_NUMERIC_WS-token(通过将它指定为词法分析器规则来完成)而是让它成为一个解析器规则,这样它就可以从另一个 parsre 规则允许 WORDs、DIGITs 和 WSs 的任意序列。

因此你想这样写:

alpha_numweric_ws: ( WORD | DIGIT | WHITESPACE)+;

如果您真的想创建相应的标记,您可以删除以下规则,或者您需要考虑词法分析器的工作是什么以及在何处划定词法分析器和解析器之间的界限(您需要重新设计语法为了这个工作)。