1

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

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

在这个特定的例子中,我知道它month总是一个单一的标记,所以它总是需要检查的标记 3 isYear()。不过,一般来说,month直到运行时,我才知道构成规则的令牌数量。有没有办法获得它的令牌数?

4

1 回答 1

1

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

于 2013-07-30T03:26:32.533 回答