将无上下文语法转换为LL(1)语法

时间:2012-05-16 09:32:15

标签: parsing compiler-construction grammar

首先,我检查了类似的问题,但没有一个人能够提供我所寻求的信息。

我想知道,如果给出无上下文语法,可以:

  • 知道是否存在等效的LL(1)语法。等同于它应该生成相同的语言。
  • 如果存在,则将无上下文语法转换为等效的LL(1)语法。如果存在等效的LL(1)语法,则转换应该成功。如果等效项不存在则不会终止。

如果这些问题的答案是肯定的,那么这些算法或工具是否可用?我自己的研究没有结果。

Another answer提到Dragon Book有一个算法来消除左递归,并留下一个无上下文语法的因子。我可以访问这本书并检查它,但我不清楚语法是否保证是LL(1)。对无上下文语法的限制(无空生成和无循环)对我来说是合适的。

1 个答案:

答案 0 :(得分:2)

从大学编译课程中我记得LL(1)语法是无上下文语法,但无上下文语法比LL(1)大得多。没有通用算法(意思不是NP难)来检查并从无上下文(可以转换为LL(1))转换为LL(1)。

当你想要集成一个函数时,应用像删除左递归,删除第一次跟随冲突,左因素等等的技巧包类似于数学转换...你需要的经验有时非常接近于艺术。转换通常是相反的。

为生成的解析器现在使用LR类型语法的一个原因是它们覆盖了比LL(1)更广泛的上下文无关语法。

顺便说一下。例如C语法可以表示为LL(1),但C#不能表示(例如lambda函数x -> x + 1,你无法决定是否看到lambda参数或已知变量)。