什么是自动计算FIRST和FOLLOW集合的好工具?

问题描述:

我目前正在玩BNF语法,我希望能够争取成LL(1)形式。但是,我刚刚完成了第三次手动修改和计算新的FIRST和FOLLOW语法集,我对此已经厌倦了。一定有更好的方法!什么是自动计算FIRST和FOLLOW集合的好工具?

有人可以建议一个工具,给定一个语法,将自动计算所有非终端的第一个和后续集?

一年前,我在我参加的大学进行了一个学期的项目,我们的任务是创建一门编程语言。作为一个团队,我们决定我们希望能够从头开始手动编写解析器,所以我们必须瞄准LL(1)语法,因为否则编写解析器将是完全不现实的。

当然,我们的出发点远不是LL(1),所以我们也不得不将它调整到位。为此,我们使用了AtoCC包中的kfgEdit工具。你所要做的就是输入你的规则,然后通过点击一个按钮来检查它是否为LL(1)语法。

一句公正的警告:该工具对于接受的内容有点挑剔。虽然你经常使用EBNF作为真正的语法,所以你可以写? *和+表示该令牌必须出现的次数,不支持。分组也不被支持。你可能会发现这样做需要很长时间,并且在你到达LL(1)之后,你几乎肯定会想要做一些“重新排列”,以使语法更接近可读。

当然,根据您处理的语法类型,这对您来说可能不是什么大问题。我们创建了一种Pascal/C混合体,它有一组相当有限的构造(过程,函数,只有内置的基本类型和它们的数组,ifs,我们用自己来代替标准3 ...),并且我花了至少一个星期的时间才将它翻译成LL(1)语法 - 实际上可能是2。请注意,这是大约4个月的时间,因此花了很多时间。

如果你绝对必须有LL(1)语法,那么当你遇到类似这样的情况时,你显然需要按下按钮,但是如果你允许使用像yacc/bison或SableCC这样的解析器生成器,那么从长远来看,你很可能会发现它很容易沿着这条路线走下去。这并不意味着你应该走这条路 - 我发现实际上手写所有东西都提供了一些我可能不会获得的洞察力 - 但是在不同于目前的情况下获得洞察可能会更好。

tl; dr版本:使用AtoCC包中的kfgEdit。

+0

对于kfgEdit将计算所有非终端的第一组,但只有一些遵循可能发生冲突的地方。这就是说,它对于语法纠纷仍然是非常宝贵的。谢谢! – Zxaos 2010-02-14 22:12:48

对于递归下降解析,这将是值得看看ANTLR。但是,我不确定它是否为您的问题提供了确切的答案 - 查找给定语法的FIRST和FOLLOW集合。

+0

我不记得ANTLR(或ANTLRWorks,就此而言)中的任何实际分析功能。它可以告诉你,如果它发现从语法中生成解析器时出现问题,但是IIRC,如果您仍然试图将语法按摩到LL(1)表单,那么获得的消息并不会有帮助。 – 2010-02-14 02:51:19

DMS Software Reengineering Toolkit有一个解析器生成器,用于计算FIRST和FOLLOW集合;它还可以让您检查它生成的L(AL)R状态机器。然而,如果你有一个合法的上下文无关语法,你不必“把它”转换成LL形状; DMS解析器生成器根据任何上下文无关语法生成GLR解析器。