有没有办法获取ANTLR4解析器规则中的令牌数?
在ANTLR4中,谓词似乎只能放在子规则的前面,以便它们导致跳过子规则。在我的语法中,一些谓词依赖于出现在子规则末尾附近的标记,其前面有一个或多个规则调用。例如:有没有办法获取ANTLR4解析器规则中的令牌数?,antlr,antlr4,Antlr,Antlr4,在ANTLR4中,谓词似乎只能放在子规则的前面,以便它们导致跳过子规则。在我的语法中,一些谓词依赖于出现在子规则末尾附近的标记,其前面有一个或多个规则调用。例如: date : {isYear(_input.LT(3).getText())}? month day=INTEGER year=INTEGER { ... } 在这个特定的示例中,我知道month始终是一个令牌,因此isYear()始终需要检查令牌3。不过,一般来说,直到运行时,我才知道组成规则(
date :
{isYear(_input.LT(3).getText())}?
month day=INTEGER year=INTEGER { ... }
在这个特定的示例中,我知道
month
始终是一个令牌,因此isYear()
始终需要检查令牌3。不过,一般来说,直到运行时,我才知道组成规则(如month
)的令牌数量。是否有方法获取其令牌计数?没有内置方法以编程方式获取规则的长度。您可以将的文档与解析器中的\u ATN
字段结合使用来计算通过规则的所有路径-如果通过规则的所有路径都包含相同数量的令牌,则您已经计算了规则使用的令牌的确切数量。没有内置方法来获取规则的长度以编程方式。您可以将的文档与解析器中的\u ATN
字段结合使用来计算通过规则的所有路径-如果通过规则的所有路径都包含相同数量的令牌,则您已经计算了规则使用的令牌的确切数量。哦,我明白了这一点。解析器直到对谓词求值之后才识别month,因此其长度是不可知的,除非month的所有路径都包含相同数量的标记。如果ANTLR允许将谓词放置在子规则中的任何位置(例如,在谓词中使用的标记之前),并使整个子规则失败,那么这似乎是一种改进。假设当一个子规则的中间使用时,输入.lt(1)总是指下一个令牌。哦,我明白了。解析器直到对谓词求值之后才识别month,因此其长度是不可知的,除非month的所有路径都包含相同数量的标记。如果ANTLR允许将谓词放置在子规则中的任何位置(例如,在谓词中使用的标记之前),并使整个子规则失败,那么这似乎是一种改进。假设在一个子规则的中间使用时,输入.lt(1)总是指下一个令牌。