有没有办法在ANTLR4解析器规则中获取令牌数量?

时间:2013-07-29 20:40:46

标签: antlr antlr4

在ANTLR4中,似乎谓词只能放在子规则的前面,以便它们能够跳过子规则。在我的语法中,一些谓词依赖于出现在子规则末尾附近的令牌,在其前面有一个或多个规则调用。例如:

date :
    {isYear(_input.LT(3).getText())}?
        month  day=INTEGER  year=INTEGER     { ... }

在这个特定的例子中,我知道month总是一个单一的令牌,所以始终需要由isYear()检查令牌3。但是,一般情况下,我不知道构成像month这样的规则的令牌数量,直到运行时。有没有办法获得其令牌数?

1 个答案:

答案 0 :(得分:1)

没有以编程方式获取规则长度的内置方法。您可以将ATNState的文档与解析器中的_ATN字段结合使用来计算规则中的所有路径 - 如果规则中的所有路径都包含相同数量的令牌,则您已经计算了确切的规则使用的令牌数量。