当规则在antlr4中匹配,并且您获得该规则的文本时,空格通常被词法分析器删除
WS: [ \n\t\r]+ -> skip;
是否有可能在解析树访问者中询问“此规则是否跳过任何空格?”
例如 .
WS: [ \n\t\r]+ -> skip;
ALPHA: [a-z];
NUMERIC: [0-9];
myrule: (ALPHA | NUMERIC)+;
然后在访客(我正在使用C):
antlrcpp::Any MyVisitor::visitMyrule(dlParser::MyruleContext *ctx) {
if (ctx->didSkipSomeWhitespace()) {
/* There was whitespace */
} else {
/* There was no whitespace */
}
return false;
}
所以:
f56fhj => no whitespace
o9f g66ff o => whitespace
我已经尝试获取令牌的开始/停止索引,以便我可以将文本长度与进入它的字符数进行比较,但是停止令牌并不总是可用,如果是,那么值不会与我期望的索引对齐,并且访问形成令牌的原始输入字符似乎并不简单 .
1 回答
在这种情况下,你不应该
skip
这些空间标记 . 这样解析器就不知道它们 . 相反,您应该将这些空间标记放在不同的通道上(例如,HIDDEN
) . 这样,解析器不会使用这些令牌,但令牌会出现在令牌流中,并且可以在您的代码中访问 .Java快速演示(我没有运行C):
运行课程:
将以下内容打印到您的控制台: