【发布时间】:2016-02-29 17:59:44
【问题描述】:
我们正在编译器设计类中进行自上而下的解析。示例都是类 java 语言。我决定尝试一种简单的函数式语言来让它变得有趣,所以我选择了 PCF (see e.g. here)。不过,我似乎无法将其纳入 LL(1) 语法。我认为问题在于函数应用(即两个表达式的并置)。关于如何确定这是否只是我缺乏技能,或者这是一种没有 LL(1) 语法或 LL(k) 的语言,我没有得到明确的答案。有人可以澄清一下我是需要更聪明还是根本不存在这样的语法?
基本上,我的 PCF 版本类似于下面的草图(大写是非终端,“//”开始注释)。我说“类似”是因为我并不完全赞同这一点,而且我已经写了很多变体——只想要一个合理的 PCF 变体。
请注意,我已经尝试过左分解并考虑中间非终结符的优先级。
Exp -> Const // integer and boolean literals, normal ops e.g. +
| if Exp then Exp else Exp
| lambda identifier dot Exp //lambda (function) abstraction
| Exp Exp // function application
| fix Exp // fixpoint operator (recursion)
【问题讨论】:
-
这是标准的左递归消除,例如见here。基本思想是语法
A -> A α | β等价于A -> β A'; A' -> ε | α A'。你必须用更多的βs 来概括这个案例。 -
@Bakuriu 我确实尝试过消除左递归,但也许我这样做只是为了直接左递归。我将不得不再看看你关于间接部分的链接。然而,这个链接确实说明了一些关于搞乱关联性的问题,我也在努力解决这个问题。
标签: parsing functional-programming lambda-calculus