在ANTLR4中,似乎谓词只能放在子规则的前面,以便它们能够跳过子规则。在我的语法中,一些谓词依赖于出现在子规则末尾附近的令牌,在其前面有一个或多个规则调用。例如:
date :
{isYear(_input.LT(3).getText())}?
month day=INTEGER year=INTEGER { ... }
在这个特定的例子中,我知道month
总是一个单一的令牌,所以始终需要由isYear()
检查令牌3。但是,一般情况下,我不知道构成像month
这样的规则的令牌数量,直到运行时。有没有办法获得其令牌数?
答案 0 :(得分:1)
没有以编程方式获取规则长度的内置方法。您可以将ATNState
的文档与解析器中的_ATN
字段结合使用来计算规则中的所有路径 - 如果规则中的所有路径都包含相同数量的令牌,则您已经计算了确切的规则使用的令牌数量。