2012-06-19 21 views
7

Bir derleyicide bir bina üzerinde çalışıyorum ve bunun içinde geçirilen kaynak programı temsil eden bir ağaç oluşturuyorum. Bunu göstermek istiyorum, moda gibi bir ağaç bu yüzden görüntüleyebiliyorum Programın yapısı ilgilenen herkese. Gerçekten ağaçları ile çalışmamışPretty Ruby'de bir ağaç veri yapısını yazdırma

ProgramNode 
    / \ 
'Math' BlockNode 
      | 
    DeclarationNode 
      | 
    ConstantDeclarationNode ------------------------------ 
     / \           | 
    const ConstantListNode        | 
      /| \  \        | 
      m := 7 ConstantANode     | 
          /| \     | 
          n := StringLiteralNode  | 
            / | \   | 
             " TEST "  ; 

: Ben istiyorum ne

ProgramNode -> 'Math' BlockNode -> DeclarationNode -> ConstantDeclarationNode -> const ConstantListNode -> [m := 7, ConstantANode -> [n := StringLiteralNode -> ""TEST"" ]] ; 

böyle bir şeydir:

Şu anda sadece bu gibi tek bir hat üzerinde ağaç baskı var Ruby'de, genellikle nasıl temsil edilir?

Herhangi bir yardım için teşekkür ederiz.

+1

1 :) –

+0

sadece ASCII oluşturulan ağaçları istiyor musunuz? – Sean

+2

Ağacı * yanlamasına *, önce kök düğümünü, yazdırılan delikli olarak yazdırın. Ağaçları temsil/yazdırma için kanonik yollar için LISP S ifadelerine bakınız. Tamam, bu size 1-2 saat sürecek. –

cevap

3

Bu tür güzel baskılar oldukça fazla matematik gerektirir. Ayrıca, eğer ağaç konsol penceresi için çok geniş olursa, ne olması gerektiği net değildir. Bunu yapacak mevcut kütüphaneleri bilmiyorum. Kişisel olarak awesome_print'u kullanıyorum.

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

require 'awesome_print' 

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

Çok sayıda seçenek var, bir göz atın!

+0

[Nasıl yapmalı?] (Http://www.kernel.org/pub/software /scm/git/docs/git-log.html) –

+0

Teşekkür ederim, bunu hiç duymadım ama gerçekten umut verici görünüyor. –

+0

Bu verileri sınıflar arasında nasıl geçirebileceğime dair herhangi bir fikir var mı? Yukarıdaki ağaçtaki düğümlerin her biri derleyicimde bir sınıfı temsil ediyor, sadece bu düğümlerin her birinden bir dizi döndürmeli ve onları bir şekilde bir karmaşaya toplamalı mıyım? –

2

Graph gem ürününü incelemeye ihtiyacınız var. Çalışmak inanılmaz ve son derece basittir. Ağacınızın yönünü ve düğümlerin şeklini, yanı sıra renkleri ve daha fazlasını seçebilirsiniz. Geçen yıl Rubyconf'ta bunu öğrendim ve uçup gitti.

kadar basittir:

: programlı kenarları :) İşte

girmek isteyeyim Açıkçası

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

üzerine daha fazla bilgi verecektir konuşma bir link to a pdf olduğunu

İlgilendiğinizde, Confreaks numaralı telefondan konuşmanın bir videosu da var.

Alkış oldukça ASCII ağaç için Sean

+0

Teşekkür ederim, kesinlikle buna bakacağım –

İlgili konular