如何保存由ANTLR生成的AST

克拉夫斯

我已经在python中使用ANTLR成功生成了AST,但是我一辈子都无法弄清楚如何保存它以便以后使用。我唯一能弄清的选择是使用tree.toStringTree()方法,但是此方法的输出是混乱的,并且不会过于方便或易于使用。

我如何保存它?将来最好/最容易使用哪种格式,并能够对其进行可视化和加载?

编辑:我可以在Java文档中看到有一个DotGenerator()来生成树的DOT文件,但是我找不到在python中做类似的事情的方法。

kaby76

您正在寻找的是解析树的序列化器/反序列化器。序列化的StackOverflow已在前面阐述这里运行时(ASAIK)不支持它,因为它没有用:可以通过重新解析输入来非常快速地重建树。即使您要使用转换来更改树,也可以用解析器中甚至不存在的节点类型的子树替换树中的节点,打印出树,然后重新解析以重建树带有语法的解析类型。只有用语义分析进行的解析非常慢时才有意义。因此,您应该仔细考虑该问题。

但是,编写不考虑空格或注释之类的“非频道”内容的原始序列化器/解串器并不难。这个C#程序(您可以适应python)是一个使用grammars-v4 / sexpression.g4语法针对目标语法算术.g4重构树的示例使用toStringTree(rule-names),树首先被序列化为字符串。(请注意,toStringTree()没有解析器规则名称很难理解,这就是我问的原因。)然后,解析s表达式,并使用Antlr访问者执行自下而上的重构。以来toStringTree()如果没有使用令牌的类型标记解析树的叶子(例如,区分数字还是符号),则将字符串词法化以重建值。它还使用反射来创建正确的解析树节点类型。

使用自上而下的递归访问器,为解析树输出Dot图也很容易,我将其包含在程序中在这里,递归函数将每个边输出到特定节点的子节点。由于每个节点名称必须是唯一的(它是一棵树),因此我在名称中添加了该节点的预购树编号。

-肯

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在java中从ANTLR AST生成函数定义?

来自分类Dev

如何访问由Q#编译器生成的AST?

来自分类Dev

如何保存由 qrcode、Django 生成的图像?

来自分类Dev

antlr 4.7 生成 ast 时出错

来自分类Dev

使用Antlr4和StringTemplates从AST生成源代码

来自分类Dev

如何访问LESS生成的AST?

来自分类Dev

JDT AST,如何生成声明

来自分类Dev

保存由函数matplotlib python生成的图

来自分类Dev

如何使用AST生成F#代码?

来自分类Dev

如何从pycparser生成的ast查找switch语句?

来自分类Dev

如何在本地保存由javascript生成的.html文件(在*本地* .html页面上运行)?

来自分类Dev

如何在由python matplotlib生成的AWS Lambda函数中保存图像?

来自分类Dev

如何将此Antlr3 AST转换为Antlr4?

来自分类Dev

从ANTLR AST识别Java变量

来自分类Dev

如何保存由GhostPCL打开的文件

来自分类Dev

如何打开由POST生成的CSV文件

来自分类Dev

如何存储由RESTful API生成的令牌?

来自分类Dev

如何查看由g ++生成的目标代码?

来自分类Dev

如何查找由DataTemplate生成的UIElement

来自分类Dev

如何缩小由dd生成的文件图像?

来自分类Dev

如何重命名由 pyspark 生成的 JSON?

来自分类Dev

如何使用Clang从一串C ++生成AST?

来自分类Dev

如何从AST打字稿解析器生成代码?

来自分类Dev

如何使用Dart分析器从源生成AST并与AST一起使用?

来自分类Dev

如何保存生成的XSD文件

来自分类Dev

如何查找由keytool生成的密钥库(自行生成)的路径

来自分类Dev

如何查找由keytool生成的密钥库(自行生成)的路径

来自分类Dev

如何提交动态生成的表单之一(由php生成)

来自分类Dev

用C ++生成AST

Related 相关文章

热门标签

归档