gpt4 book ai didi

ANTLR 解析器规则匹配 : x and/or y and/or z in any order

转载 作者:行者123 更新时间:2023-12-04 01:04:18 25 4
gpt4 key购买 nike

使用 ANTLR,有没有一种方法可以编写解析器规则,以便它可以在不编写 Java 的情况下以任何顺序表达:x 和/或 y 和/或 z。例如,它应该匹配:“x y”、“y z”和“x y z”而不是“x x y”。我能想到的最好的是下面的规则,但我需要检查树步行者的“x x y”。

rule: ( x | y | z )* ;

最佳答案

虽然您可以做一些类似于:

rule: x
| y
| z
| x y
| y x
| x z
| z x
| y z
| z y
| x y z
| x z y
| y x z
| y z x
| z x y
| z y x;

或者(有点荒谬):

rule: x? y? z?
| x? z? y?
| y? x? z?
| y? z? x?
| z? x? y?
| z? y? x?
;

我怀疑你的例子比你的实际应用程序简单得多,而且这种方法会变得太乏味(它已经变得荒谬了)。

您也可以使用语义谓词来研究某些内容,但这会将您的语法锁定到特定的目标语言。 (这也会使你的语法复杂化。)

总的来说,我发现 ANTLR 用户(通常是解析器编写者)经常过于努力地将“所有规则”编码到语法中。

这看起来不错,但它会导致语法非常复杂,并导致“不太理想”的错误消息(因为它们来自解析器 (ANTLR) 本身)。

我认为您会发现最好保留一个规则,就像您拥有的规则一样,该规则将创建一个 ParseTree 来准确表示解释(也称为“解析”)输入的正确方法。然后您将这样的规则视为语义关注点(与句法关注点(解析器的域)相对)。

这意味着您将编写类似验证监听器的内容来针对您的解析树运行,并且您可以多次检查同一子规则的使用情况。如果您遇到它,您可以制作一条对最终用户更有用的非常具体的错误消息。

关于ANTLR 解析器规则匹配 : x and/or y and/or z in any order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67008322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com