gpt4 book ai didi

parsing - 在 ANTLR4 中使用什么来解决更复杂情况下的歧义(而不是句法谓词)?

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

在 ANTLR v3 中,句法谓词可用于解决歧义,即明确告诉 ANTLR 应该选择哪个备选方案。 ANTLR4 似乎只接受具有类似歧义的语法,但在解析过程中它会报告这些歧义。尽管存在这些歧义(根据文档,通过选择第一个替代方案),它仍会生成解析树。但是,如果我想让它选择其他选择,我该怎么办?换句话说,我怎样才能明确地解决歧义?

(对于悬挂 else 问题的简单案例,请参阅:What to use in ANTLR4 to resolve ambiguities (instead of syntactic predicates)?)

一个更复杂的例子:

如果我有这样的规则:

expr
: expr '[' expr? ']'
| ID expr
| '[' expr ']'
| ID
| INT
;

这会将 foo[4] 解析为 (expr foo (expr [ (expr 4) ]))。但我可能想将其解析为 (expr (expr foo) [ (expr 4) ])。 (即,如果可能,总是采用第一个备选方案。它是第一个备选方案,因此根据文档,它应该具有更高的优先级。那么为什么要构建这棵树?)

如果我没理解错的话,我有2个解决方案:

  1. 基本上用语义谓词实现句法谓词(但是,在这种情况下,我不确定如何实现)。

  2. 重组语法。

例如,将expr替换为e:

e   :   expr | pe
;

expr
: expr '[' expr? ']'
| ID expr
| ID
| INT
;

pe : '[' expr ']'
;

这似乎可行,尽管语法变得更加复杂。

我可能误解了一些东西,但这两种解决方案似乎都没有句法谓词优雅且复杂。虽然,我喜欢使用 ?? 运算符解决悬空 else 问题的解决方案。但我不确定在这种情况下如何使用。可能吗?

最佳答案

您可以通过将 ID 替代项放在 ID expr 之上来解决此问题。当左递归被消除时,所有非左递归的备选方案都会在左递归的备选方案之前被解析。

对于您的示例,第一个非左递归替代 ID expr 匹配整个表达式,因此之后没有任何内容需要解析。

关于parsing - 在 ANTLR4 中使用什么来解决更复杂情况下的歧义(而不是句法谓词)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21441651/

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