我对此练习有疑问:
令G为λ微积分的以下歧义语法:
E → v | λv.E | EE | (E)
其中E是单个非终结符号,λv.E表示带有E中变量v的抽象,而EE表示应用。
- 定义LL(1)语法G',以使L(G')= L(G)并通过施加以下常用约定来解决G的歧义:
- 抽象是正确的关联;
- 申请保持关联;
- 应用程序具有比抽象更高的优先级。
- 显示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上寻找一种解决方案,但似乎无法消除保留左联想的左递归。
但是,此练习几年前已出现在编译器考试中,因此必须有正确的答案。
感谢您的帮助。