除去语法中的左递归,同时保持运算符的左关联


13

我对此练习有疑问:

令G为λ微积分的以下歧义语法:

E → v | λv.E | EE | (E)

其中E是单个非终结符号,λv.E表示带有E中变量v的抽象,而EE表示应用。

  1. 定义LL(1)语法G',以使L(G')= L(G)并通过施加以下常用约定来解决G的歧义:
    1. 抽象是正确的关联;
    2. 申请保持关联;
    3. 应用程序具有比抽象更高的优先级。
  2. 显示G'的LL(1)解析表和解析字符串时获得的解析树λv1. λv2. v1v2v1

我消除了歧义设置的优先级和关联,获得了以下语法:

E -> EF | F
F -> λv.G | G
G -> (E) | v

这不是LL(1),因为生产E -> EF是递归的。但是,从该生产中消除左递归可以获得:

E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v

不符合要求1.2。

我在Internet上寻找一种解决方案,但似乎无法消除保留左联想的左递归。

但是,此练习几年前已出现在编译器考试中,因此必须有正确的答案。

感谢您的帮助。

Answers:


11

左关联和LL(1)解析的兼容性

您只是遇到了上下文无关(CF)语法使用中的主要矛盾之一。人们希望选择语法,以便语法分析树将接近句子的语义来反映句子的预期结构,特别是在非关联运算符(例如application)的情况下。这几乎是语言学中CF语法的初衷。但是与此同时,他们将自己限制在仅允许某些语法类型的语法分析技术上。

确实,如果解析树要反映运算符的左关联性,则语法必定是左递归的,因为解析树中的顶级应用程序节点必定会添加未分解的连续应用程序的最右边项。因此,LL解析是不可能的。你是对的。

有两种解决方法。一种是不依靠解析器给出严格的“ parse-tree”,以用于以后的处理阶段(例如,在此处减少lambda表达式)。这导致了抽象语法树(AST)的概念,该语法可以从解析树构建,但是结构不同。

另一种解决方案是使用更通用的解析技术,该技术将接受任何CF语法,并根据其进行解析。常规CF解析器是一项发达的技术(我不停地问为什么LL仍然如此受欢迎)。

我不知道对于这些矛盾的要求,什么可以被认为是正确的答案。

我要做的就是证明它们与要求矛盾。给出满足关联性和优先级约束的第一个语法,然后将其转换为LL(1)语法进行解析。

在期刊或考试中出现的事实并不完全是正确的。我可能也错了……但是除了我自己对问题的了解之外,我还进行了一些检查。

关于此特定示例

话虽如此,您建议的第一个语法似乎不太正确。它没有产生λu.λv.v的方法。

要知道的一个技巧是从具有最低优先级(抽象)的运算符(这里是抽象或应用程序)开始。算术表达式相同。


非常感谢您的详细评论。您是对的,我在第一个语法上做错了,也谢谢您。那我去问教授。
Marco DallaG,2015年

如果您有兴趣的话,我可能还会补充一点,并附上有关假人的语法设计的小注释(我也是)。另外,请告诉我们您的教授在这方面怎么说。
2015年

教授回答这个问题后,我将更新主题。无论如何,如果这对您来说不是问题,请随时添加更多信息,当然,我非常感谢。再次感谢你的帮助
马可DallaG

@MarcoDallaG在研究Pierce的TAPL时遇到了这个问题。您的教授碰巧说出了与此答案不同的话吗?:)
lcn

0

我的尝试:

E  -> A | λv.E
A  -> FA'
A' -> A | ɛ
F  -> (E) | v

该语法为LL(1),应尊重所需的属性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.