【问题标题】:Generating n statements from context-free grammars从上下文无关文法生成 n 条语句
【发布时间】:2010-05-15 15:22:53
【问题描述】:

所以不要重新发明轮子,我想知道在从上下文无关语言(如 yacc 生成的语言等)生成随机语句方面已经做了什么。这些语法主要用于解析,但也许有人为测试解析器做了一些生成? 谢谢

【问题讨论】:

标签: random context-free-grammar


【解决方案1】:

查看this blog post。基本上,它会随机化在每个规则应用程序中选择的 RHS。

【讨论】:

    【解决方案2】:

    有一篇古老但仍然很有趣的文章 here 说明了为什么你需要更多的约束来有效生成随机句子而不是解析——它还提出了一种提供这些额外约束的简单方法,并给出了一个完整的示例程序(......在 Fortran IV 中......但是,嘿,它 已经超过 40 岁......!-)。

    不幸的是,我不知道有关此主题的任何最新工作(或更现代语言的实现 - 但将 Fortran 尘土飞扬的甲板转码为您最喜欢的任何语言不应该像提出这些概念那么难)自己的;-) -- 这只是我在大学时在实际的纸质图书馆中细读过的那种已经很古老的东西,我很惊讶 ACM 的在线搜索工具允许我找到我的参考文献依稀记得,这么快(赞,ACM!-)。我从未对这个主题进行过任何原创性研究。

    【讨论】:

      【解决方案3】:

      像这样生成一系列随机标记有点简单;从目标符号开始,选择任何未填充的非终结符的随机扩展。您可能希望在生成的解析树的任何分支上进行某种分支定界搜索,以便控制深度/大小。

      但我认为以这种方式测试解析器并没有多大价值,至少如果您的解析器生成器直接接受上下文无关语言描述,则不会。当您使用 GLR(我们在程序转换系统 DMS 中使用的)或 Earley 解析器等完整的上下文无关解析器生成器/工具时,就会发生这种情况。

      你还有另一个问题:如果你想测试一个解析器,你需要给它提供它想要的东西,而且肯定不是令牌。现在您必须为终端叶生成有效的词位。这也不是太难,但如果你想对这种方法保持纯粹,你会以无扫描风格编写语法。

      但最后一个问题是很难找到适用于大多数语言的上下文无关语法。所以现在你也必须调试你的黄金语法;你会怎么做? 一旦你到了那个阶段,你很可能会放弃,调试解析器,然后继续你的生活。

      随机子树的生成在错误恢复中很有用,如果你可以拼接随机树来修复源流。我们为 DMS 的解析器做了一个简化的形式,这意味着我们只有一个错误处理机制。

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        • 2012-01-04
        • 2014-04-26
        • 2018-03-29
        • 1970-01-01
        相关资源
        最近更新 更多