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

时间:2010-02-14 01:42:37

标签: grammar context-free-grammar recursive-descent

我目前正在玩BNF语法,希望能够与LL(1)形式争吵。但是,我刚刚完成了第三次手动更改和计算新的FIRST和FOLLOW语法集,我已经厌倦了。必须有更好的方法!

有人会建议一个工具,给定一个语法,会自动计算所有非终端的第一组和后续数组吗?

3 个答案:

答案 0 :(得分:3)

一年前,我在大学参加了一个学期项目,我们的任务是创建一门编程语言。作为一个组,我们决定能够从头开始手工编写解析器,因此我们不得不瞄准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 version:使用AtoCC包中的kfgEdit。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

DMS Software Reengineering Toolkit有一个解析器生成器,用于计算FIRST和FOLLOW集;它还可以让你检查它生成的L(AL)R状态机。

但是,如果你有一个合法的无上下文语法,你就不必将它“纠缠”成LL形状; DMS解析器生成器从任何无上下文语法生成GLR解析器。