Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法获取ANTLR4解析器规则中的令牌数?_Antlr_Antlr4 - Fatal编程技术网

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

有没有办法获取ANTLR4解析器规则中的令牌数?,antlr,antlr4,Antlr,Antlr4,在ANTLR4中,谓词似乎只能放在子规则的前面,以便它们导致跳过子规则。在我的语法中,一些谓词依赖于出现在子规则末尾附近的标记,其前面有一个或多个规则调用。例如: date : {isYear(_input.LT(3).getText())}? month day=INTEGER year=INTEGER { ... } 在这个特定的示例中,我知道month始终是一个令牌,因此isYear()始终需要检查令牌3。不过,一般来说,直到运行时,我才知道组成规则(

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

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)总是指下一个令牌。