首页 > 解决方案 > ANTLR4:获取子令牌的类型

问题描述

我正在使用 ANTLR4 为我的语法构建解析器,如果可能的话,我想在另一个令牌中获取令牌类型。例如:

NUMBER_LITERAL
    : INT_LITERAL
    | FLOAT_LITERAL;

当我想为这样的规则构建 AST 时,我可以得到它正在NUMBER_LITERAL使用Token::getType,但是如果我想决定它是否是,INT_LITERAL或者FLOAT_LITERAL我似乎找不到任何方法来这样做。

这是可能的还是我必须创建解析器规则NUMBER_LITERAL

标签: javaantlr

解决方案


令牌在 ANTLR 中没有子令牌,所以没有办法用令牌做你想做的事。我还应该指出,如果NUMBER_LITERAL,INT_LITERALFLOAT_LITERAL都是词法分析器规则(而不是INT_LITERALFLOAT_LITERAL是片段),那么要么NUMBER_LITERAL永远不会匹配INT_LITERAL,要么永远FLOAT_LITERAL不会匹配,这取决于它们的定义顺序。

我要做的是拥有INT_LITERALFLOAT_LITERAL作为标记,然后制定NUMBER_LITERAL解析器规则。这样,您可以通过使用标记的替代项或仅检查哪个INT_LITERAL()FLOAT_LITERAL()不返回来检查文字是浮点数还是整数null


推荐阅读