Pretty在Ruby中打印树数据结构

Hun*_*len 7 ruby abstract-syntax-tree expression-trees

我正在构建一个编译器,在其中我生成一个树,代表传入的源程序.我想显示这是一个像时尚的树,所以我可以向任何感兴趣的人显示程序的结构.

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

ProgramNode -> 'Math' BlockNode -> DeclarationNode -> ConstantDeclarationNode -> const ConstantListNode -> [m := 7, ConstantANode -> [n := StringLiteralNode -> ""TEST"" ]] ; 
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的:

   ProgramNode 
    /     \
'Math' BlockNode
           |
    DeclarationNode
           |
    ConstantDeclarationNode ------------------------------
        /      \                                         |
     const ConstantListNode                              |
             /  |  \      \                              |
             m  :=  7    ConstantANode                   |
                            /  |    \                    |
                           n   :=  StringLiteralNode     |
                                      /    |   \         |
                                      "   TEST  "        ;
Run Code Online (Sandbox Code Playgroud)

我没有真正使用Ruby中的树,它们通常如何表示?

任何帮助,将不胜感激.

Ser*_*sev 3

这种漂亮的打印需要大量的数学知识。此外,还不清楚如果树对于控制台窗口来说太宽会发生什么。我不知道有任何现有的库可以做到这一点。我个人使用awesome_print.

tree = {'ConstantDeclarationNode' => ['const',
                                      'ConstantListNode' => ['m', ':=', '7']]}

require 'awesome_print'

ap tree
# >> {
# >>     "ConstantDeclarationNode" => [
# >>         [0] "const",
# >>         [1] {
# >>             "ConstantListNode" => [
# >>                 [0] "m",
# >>                 [1] ":=",
# >>                 [2] "7"
# >>             ]
# >>         }
# >>     ]
# >> }
Run Code Online (Sandbox Code Playgroud)

它有很多选择,请检查一下!