Piuttosto Stampa di una struttura dati dell'albero in Ruby

abstract-syntax-tree expression-trees ruby

Domanda

Sto lavorando a costruire un compilatore e al suo interno creo un albero che rappresenta il programma sorgente che viene passato. Voglio mostrare che questo è un albero come la moda, così posso mostrare la struttura del programma a chiunque sia interessato.

In questo momento ho solo la stampa ad albero su una singola riga come questa:

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

Quello che vorrei è qualcosa del genere:

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

Non ho davvero lavorato con gli alberi in Ruby, come vengono solitamente rappresentati?

Qualsiasi aiuto sarebbe apprezzato.

Risposta accettata

Questo tipo di stampa carina richiede un bel po 'di matematica. Inoltre, non è chiaro cosa dovrebbe accadere se l'albero si allarga troppo per la finestra della console. Non conosco alcuna libreria esistente che faccia questo. Io personalmente uso awesome_print .

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

require 'awesome_print'

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

Ha un sacco di opzioni, dai un'occhiata!


Risposta popolare

Devi controllare la gemma Graph . È fantastico e straordinariamente semplice da lavorare. Puoi scegliere la direzione del tuo albero e la forma dei nodi, così come i colori e molto altro ancora. L'ho scoperto per la prima volta al Rubyconf l'anno scorso e sono rimasto senza parole.

È semplice come:

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

Ovviamente vorresti inserire i bordi a livello di codice :)

Ecco un link a un pdf del talk che darà maggiori informazioni su di esso:

Se sei interessato, c'è anche un video del talk su Confreaks .

Saluti, Sean



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché