【发布时间】:2019-05-03 20:33:04
【问题描述】:
我用 C++ 编写了一个简单的编译器,并希望可视化它生成的抽象语法树。目前,我将 AST 转储为类似于以下内容的超长字符串:
Program(decls=[ConstDecl(type=BasicTypeKind::Int, value=Num(n=1, loc=Location(1, 21)), name=positive, loc=Location(1, 10)), ConstDecl(type=BasicTypeKind::Int, value=Num(n=-1, loc=Location(2, 21)), name=negative, loc=Location(2, 10)), ConstDecl(type=BasicTypeKind::Int, value=Num(n=100, loc=Location(3, 26)), name=max_heap_size, loc=Location(3, 10)), ConstDecl(type=BasicTypeKind::Character, value=Char(c=99, loc=Location(4, 23)), name=...
如您所见,这个转储在可视化方面不是很人性化。人们无法自然地将 tree 的概念与这么长的字符串联系起来。我尝试了漂亮打印 AST 的方法,并找到了用于 Python 的astpretty。它主要用于调试,但如果我想要 AST 的插图怎么办?图形格式肯定更合适。
实际上,我有关于我期待的输出的图片。 Graphviz 在这个领域做得很好,C++ 文档工具 Doxygen 生成的各种图表在概念上非常接近我的目的。
将这些放在一起,我想要一种方法将内存中的 AST 作为 C++ 对象转换为体面的图形输出(静态的也可以)。有什么好的起点吗?
编辑: 正如 cmets 所说,以 Graphviz 识别的格式转储我的 AST 是一个很好的起点。我会尝试这样做,直到出现新的更具体的问题。谢谢大家。
【问题讨论】:
-
为什么不在你的输出中的数组元素等之间添加换行符,加上一些缩进呢?之后应该看起来好多了。
-
使用点格式以便graphviz能够正确绘制
-
在我看来你已经有了一个合适的起点。将您的 AST 表示转换为 graphviz 格式并从那里渲染。当然,除非这个问题还有更多内容,否则我建议您编辑您的帖子。
-
@bipll 我已经有一个漂亮的打印机,虽然是在 Python 中。 png 会比纯文本更好,因为我持有它。
-
这个 SO 答案显示了如果您 a)将 AST 打印为带有缩进的嵌套树,并且 b)如果您走 AST 并为节点吐出 GraphVis(“点”)命令,则可以产生什么和弧线。 stackoverflow.com/a/17393852/120163
标签: c++ abstract-syntax-tree graph-visualization