在 TatSu (Python) 中生成随机语法扩展

Generate random grammar expansions in TatSu (Python)

提问人:bookofproofs 提问时间:10/23/2021 最后编辑:bookofproofs 更新时间:11/7/2021 访问量:150

问:

我正在为使用 TatSu 生成的语法解析器编写解释器。我正在寻找一种方便的方法来为我的语法生成用例,这样我就可以为我的解释器编写单元测试。目前,我正在手动生成测试用例。

我想知道 TatSu 包是否确实提供了任何(可能未记录的)方法来自动生成随机语法派生,以便我可以将它们用作我的解释器的测试用例。此外,最好指定语法规则,为此我需要随机生产。

随机 语法 扩张

评论

1赞 Apalala 10/28/2021
也许您正在寻找从语法(派生)生成的随机输入?随机制作听起来很奇怪。
0赞 bookofproofs 10/28/2021
是的,对不起,就像标题中一样,我正在寻找“扩展”(=派生),不要与语法产品(规则)混淆。
0赞 bookofproofs 10/28/2021
解决我问题的一种方法是为使用自己的 TatSu 语法编译的 TatSu 解析器实现一个 TatSu 语义类,该解析器将生成所有选项、选择和序列规则的集合,以及给定语法中的终端。然后,这样的类可用于随机生成给定语法的派生。我在问自己,现有的 TatSu 包 (5.6.1) 中是否有内部结构已经提供了这些集合。
0赞 Apalala 10/30/2021
所以首先,修改你的问题,让它说“派生”。在那之后,有些语言派生出无限的语言。但是我对如何以最小的方式生成一些推导有一些想法。
0赞 bookofproofs 10/30/2021
我如你所愿修改了这个问题。我认为我正在寻找的 TatSu 内部结构是编译解析器中“规则映射”对象的结构。我也已经有了关于如何将其用于我的目的的想法,并且我已经在进行概念验证。如果有效,我会将其作为可能的答案发布。是的,无限推导是可能的,算法需要一些策略来避免它们。

答:

1赞 Apalala 10/31/2021 #1

如果你看一下里面的方法,你会看到一个通过语法将其转换为可读内容的示例。__str__()grammars.py

您也可以使用 .Visitor

因为语法的派生集可能是无限的,所以你需要一种策略来生成一些有趣的样本,然后再退出():Ctrl-C

  • 首先选择广度,否则访问者将递归,直到运行时堆栈耗尽
  • 由于 PEG,请首先使用选项 () 中的最后一个选项,该选项应该是产生最短导数的选项|

由于 TatSu 跳过空格,因此您可能需要添加一个步骤来漂亮地打印输出。

这是一个有趣的项目,如果最后将其作为拉取请求添加到 TatSu 中,那就太好了。

我很抱歉只提供指南而不是示例。

评论

0赞 bookofproofs 10/31/2021
谢谢,我已经开始研究基于已编译的 tatsu 解析器的规则映射属性的解决方案。感谢您关于在选择中使用最后一个选项的建议。如果我成功了。我将创建一个拉取请求。tatsu 包中有一个“grammars.py”,但没有“grammar.py”。它的 __str__() 方法可能不是你的意思。
0赞 Apalala 11/1/2021
确实是.tatsu/grammars.py
0赞 bookofproofs 11/7/2021 #2

我创建了一个实验性的公共存储库 TatSu Random Derivation Generator,它可以为使用 TatSu 编译的许多语法规则生成随机推导。如果语法非常复杂,则程序会遇到 RecursionError。

尽管如此,它对于测试语法很有用,特别是如果您想测试特定生产规则的派生。

以及许多测试向您展示了如何使用该工具。example.py