所以不要重新发明轮子,我想知道从无上下文语言(如yacc等产生的语言)生成随机语句已经做了些什么。这些语法主要用于解析,但也许有人为测试解析器做了一些生成? 感谢
答案 0 :(得分:4)
结帐this blog post。基本上,它随机化了在每个规则应用程序中选择的RHS。
答案 1 :(得分:3)
有一篇古老但仍然有趣的文章here,它说明为什么你需要一些有效生成随机句子的约束而不是解析 - 它还提出了一种简单的方法来提供这些额外的约束并给出一个完整的示例程序(...在Fortran IV中......但是,嘿, 已超过40年......! - )。
不幸的是,我不知道最近有关于这个主题的工作(或者更现代语言的实现 - 但是将Fortran尘土飞扬的套牌转换成你最喜欢的语言不应该像提出这些概念那么难一个人自己;-) - 这就是我在大学期间在实际的纸质图书馆中看到的那种古老的东西,我很惊讶ACM的在线搜索工具让我找到了参考资料I模糊地记得,如此迅速(荣誉,ACM! - )。我从未对这个问题做过任何原创研究。
答案 2 :(得分:1)
像这样生成一系列随机令牌是有点直截了当的;从目标符号开始,选择未填充的非终结符号的随机扩展。您可能希望在生成的解析树的任何分支中进行某种分支定界搜索,以便您可以控制深度/大小。
但是我没有看到以这种方式测试解析器的很多价值,至少在您的解析器生成器直接接受上下文无关语言描述时也是如此。当您使用完整的上下文无关解析器生成器/工具(如GLR(我们在程序转换系统中使用的DMS)或Earley解析器时)会发生这种情况。
你还有另一个问题:如果你想测试一个解析器,你需要提供它想要的东西,当然这不是令牌。现在你必须为终端叶子生成有效的lexemes。这也不是太难,但是你想要用这种方法纯粹用无扫描方式写你的语法。
但最后一个问题是很难找到大多数语言的无上下文语法。所以现在你必须调试你的黄金语法;你会怎么做? 一旦你进入那个阶段,你可能只是放弃,调试解析器,继续你的生活。
如果您可以在随机树中拼接以修复源流,那么随机子树的生成在错误恢复中非常有用。我们为DMS的解析器做了一个简化形式,这意味着我们只有一个错误处理机制。