首先,我检查了类似的问题,但没有一个人能够提供我所寻求的信息。
我想知道,如果给出无上下文语法,可以:
如果这些问题的答案是肯定的,那么这些算法或工具是否可用?我自己的研究没有结果。
Another answer提到Dragon Book有一个算法来消除左递归,并留下一个无上下文语法的因子。我可以访问这本书并检查它,但我不清楚语法是否保证是LL(1)。对无上下文语法的限制(无空生成和无循环)对我来说是合适的。
答案 0 :(得分:2)
从大学编译课程中我记得LL(1)语法是无上下文语法,但无上下文语法比LL(1)大得多。没有通用算法(意思不是NP难)来检查并从无上下文(可以转换为LL(1))转换为LL(1)。
当你想要集成一个函数时,应用像删除左递归,删除第一次跟随冲突,左因素等等的技巧包类似于数学转换...你需要的经验有时非常接近于艺术。转换通常是相反的。
为生成的解析器现在使用LR类型语法的一个原因是它们覆盖了比LL(1)更广泛的上下文无关语法。
顺便说一下。例如C语法可以表示为LL(1),但C#不能表示(例如lambda函数x -> x + 1
,你无法决定是否看到lambda参数或已知变量)。