【问题标题】:Is there a way to get the number of tokens in an ANTLR4 parser rule?有没有办法在 ANTLR4 解析器规则中获取令牌的数量?
【发布时间】:2013-07-29 20:40:46
【问题描述】:

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

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

在这个特定的示例中,我知道month 始终是一个单独的令牌,因此始终需要isYear() 来检查令牌3。不过,一般来说,直到运行时,我才知道构成像 month 这样的规则的令牌数量。有没有办法获取它的令牌数?

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

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

    【讨论】:

    • 哦,我明白了。解析器在评估谓词之后才识别月份,因此它的长度是不可知的,除非月份的所有路径都包含相同数量的标记。那么,如果 ANTLR 允许将谓词放置在子规则中的任何位置(例如,就在谓词中使用的标记之前)并且使整个子规则失败,这似乎是一种改进。假设 _input.LT(1) 在子规则中间使用时总是指代下一个标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    相关资源
    最近更新 更多