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



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

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的词法分析器匹配"先到先得"。这意味着它将托盘将给定的输入与第一个指定的(在源代码中)规则匹配,如果该规则可以匹配输入,则不会尝试将其与其他规则匹配。

在您的情况下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)+;

如果你真的想创建相应的令牌,你可以删除以下规则,或者你需要考虑词法分析器的工作是什么,以及在哪里画词法器和解析器之间的界限(你需要重新设计你的语法才能工作)。

最新更新