2012-06-19 63 views
7

我正在構建一個編譯器,並在其中生成一個代表傳入的源代碼程序的樹。我想顯示這是一棵像時尚的樹,所以我可以顯示該計劃的結構給任何感興趣的人。漂亮的打印Ruby中的樹形數據結構

現在我只是有一行這樣的樹印:

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中,它們通常如何表示?

任何幫助,將不勝感激。

+1

+1爲漂亮的ASCII樹:) –

+0

你只是想在ASCII產生的樹? – Sean

+2

首先打印樹*側面*,根節點,縮進。請參閱LISP S表達式以瞭解表示/打印樹的規範方法。完成這件事需要1-2個小時。 –

回答

3

這種漂亮的打印需要相當多的數學。此外,如果樹的控制檯窗口變得太大,還不清楚會發生什麼。我不知道任何現有的庫會這樣做。我個人使用awesome_print

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

require 'awesome_print' 

ap tree 
# >> { 
# >>  "ConstantDeclarationNode" => [ 
# >>   [0] "const", 
# >>   [1] { 
# >>    "ConstantListNode" => [ 
# >>     [0] "m", 
# >>     [1] ":=", 
# >>     [2] "7" 
# >>    ] 
# >>   } 
# >>  ] 
# >> } 

它有噸的選項,檢查出來!

+0

[git'如何做?](http://www.kernel.org/pub/software /scm/git/docs/git-log.html) –

+0

謝謝,我從來沒有聽說過這個,但它看起來很有前途。 –

+0

關於如何在類之間傳遞數據的任何想法?上面的樹中的每個節點代表我的編譯器中的一個類,我是否應該從每個節點返回一個數組並將它們收集到一個哈希中? –

2

您需要查看Graph寶石。合作非常神奇,而且非常簡單。您可以選擇樹的方向和節點的形狀,以及顏色等等。我去年在Rubyconf中首次發現它,並且被吹走了。

這是非常簡單:

digraph do 
    edge "Programnode", "Blocknode" 
    edge "Programnode", "Math" 
    edge "Blocknode", "DeclarationNode" 
end 

很明顯,你會希望以編程方式進入邊緣:)

這裏是講這將給有關的更多信息的link to a pdf

如果您有興趣,還有一個關於Confreaks的演講視頻。

乾杯, 肖恩

+0

謝謝,我一定會研究這個 –