我已经在python中使用ANTLR成功生成了AST,但是我一辈子都无法弄清楚如何保存它以便以后使用。我唯一能弄清的选择是使用tree.toStringTree()
方法,但是此方法的输出是混乱的,并且不会过于方便或易于使用。
我如何保存它?将来最好/最容易使用哪种格式,并能够对其进行可视化和加载?
编辑:我可以在Java文档中看到有一个DotGenerator()来生成树的DOT文件,但是我找不到在python中做类似的事情的方法。
您正在寻找的是解析树的序列化器/反序列化器。序列化的StackOverflow已在前面阐述这里。运行时(ASAIK)不支持它,因为它没有用:可以通过重新解析输入来非常快速地重建树。即使您要使用转换来更改树,也可以用解析器中甚至不存在的节点类型的子树替换树中的节点,打印出树,然后重新解析以重建树带有语法的解析类型。只有用语义分析进行的解析非常慢时才有意义。因此,您应该仔细考虑该问题。
但是,编写不考虑空格或注释之类的“非频道”内容的原始序列化器/解串器并不难。这个C#程序(您可以适应python)是一个使用grammars-v4 / sexpression.g4语法针对目标语法算术.g4重构树的示例。使用toStringTree(rule-names)
,树首先被序列化为字符串。(请注意,toStringTree()
没有解析器规则名称很难理解,这就是我问的原因。)然后,解析s表达式,并使用Antlr访问者执行自下而上的重构。以来toStringTree()
如果没有使用令牌的类型标记解析树的叶子(例如,区分数字还是符号),则将字符串词法化以重建值。它还使用反射来创建正确的解析树节点类型。
使用自上而下的递归访问器,为解析树输出Dot图也很容易,我将其包含在程序中。在这里,递归函数将每个边输出到特定节点的子节点。由于每个节点名称必须是唯一的(它是一棵树),因此我在名称中添加了该节点的预购树编号。
-肯
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句