7

私はコンパイラの構築に取り組んでおり、その中で渡されるソースプログラムを表すツリーを生成します。これをファッションのようなツリーとして表示したいので、興味のある人にプログラムの構造を表示できます。

現在、次のようにツリーを1行に印刷しています。

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 でツリーを実際に扱ったことはありませんが、ツリーは通常どのように表現されますか?

どんな助けでも大歓迎です。

4

2 に答える 2

3

Graph gemを確認する必要があります。驚くほど簡単に操作できます。木の方向やノードの形状、色などを選択できます。昨年のRubyconfで初めて知り、衝撃を受けました。

次のように簡単です。

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

明らかに、プログラムでエッジを入力したいでしょう:)

これは、それに関する詳細情報を提供する講演のpdfへのリンクです。

興味のある方はConfreaksのトーク動画もあります。

乾杯、ショーン

于 2012-06-19T18:04:41.903 に答える
3

この種のきれいな印刷には、かなりの計算が必要です。さらに、ツリーがコンソール ウィンドウに対して大きくなりすぎた場合にどうなるかは不明です。これを行う既存のライブラリは知りません。私は個人的に使用しますawesome_print

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

require 'awesome_print'

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

たくさんのオプションがあります、チェックしてください!

于 2012-06-19T15:05:27.213 に答える