在Ruby中打印树数据结构非常漂亮

在Ruby中打印树数据结构非常漂亮,ruby,expression-trees,abstract-syntax-tree,Ruby,Expression Trees,Abstract Syntax Tree,我正在构建一个编译器,并在其中生成一个表示传入的源程序的树。我想展示这是一种树状的方式,这样我就可以向任何感兴趣的人展示程序的结构 现在我只在一行上打印树,如下所示: ProgramNode -> 'Math' BlockNode -> DeclarationNode -> ConstantDeclarationNode -> const ConstantListNode -> [m := 7, ConstantANode -> [n := StringLit

我正在构建一个编译器,并在其中生成一个表示传入的源程序的树。我想展示这是一种树状的方式,这样我就可以向任何感兴趣的人展示程序的结构

现在我只在一行上打印树,如下所示:

ProgramNode -> 'Math' BlockNode -> DeclarationNode -> ConstantDeclarationNode -> const ConstantListNode -> [m := 7, ConstantANode -> [n := StringLiteralNode -> ""TEST"" ]] ; 
我想要的是这样的:

   ProgramNode 
    /     \
'Math' BlockNode
           |
    DeclarationNode
           |
    ConstantDeclarationNode ------------------------------
        /      \                                         |
     const ConstantListNode                              |
             /  |  \      \                              |
             m  :=  7    ConstantANode                   |
                            /  |    \                    |
                           n   :=  StringLiteralNode     |
                                      /    |   \         |
                                      "   TEST  "        ;
我还没有在Ruby中真正使用过树,它们通常是如何表示的


任何帮助都将不胜感激。

这种漂亮的印刷需要相当多的数学知识。此外,还不清楚如果树对于控制台窗口来说太宽会发生什么。我不知道任何现有的图书馆会这样做。我个人使用

它有很多选择,看看吧

您需要查看宝石。这是惊人的和非常简单的工作。您可以选择树的方向和节点的形状,以及颜色等等。我是去年在Rubyconf第一次发现这件事的,当时我被吹走了

这很简单:

digraph do
  edge "Programnode", "Blocknode"
  edge "Programnode", "Math"
  edge "Blocknode", "DeclarationNode"
end
显然,您希望以编程方式输入边:)

以下是演讲的一部分,将提供更多信息:

如果你有兴趣,这里还有一段视频

干杯,
Sean

+1对于漂亮的ascii树:)您是否只希望以ascii格式生成树?将树侧向打印,首先打印根节点,并缩进childen。有关表示/打印树的规范方法,请参见LISP S表达式。正确完成此操作需要1-2个小时。@Sean它不一定必须是ascii,我只是简单地这么做了example@IraBaxter谢谢你的建议,我会研究这些。谢谢你,我从来没有听说过这一点,但它看起来真的很有希望。关于如何在类之间传递这些数据,有什么想法吗?上面树中的每个节点都代表编译器中的一个类,我是否应该从每个节点返回一个数组并以某种方式将它们聚集到一个哈希中?谢谢,我一定会研究这个问题
digraph do
  edge "Programnode", "Blocknode"
  edge "Programnode", "Math"
  edge "Blocknode", "DeclarationNode"
end