2012-06-19 6 views
7

में एक पेड़ डेटा संरचना की सुंदर प्रिंटिंग मैं एक कंपाइलर के निर्माण पर काम कर रहा हूं और इसके भीतर मैं एक पेड़ उत्पन्न करता हूं जो पारित स्रोत कार्यक्रम का प्रतिनिधित्व करता है। मैं यह प्रदर्शित करना चाहता हूं कि यह फैशन जैसा पेड़ है, इसलिए मैं प्रदर्शित कर सकता हूं किसी भी व्यक्ति को कार्यक्रम की संरचना।रूबी

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"" ]] ; 

मैं चाहते हैं क्या कुछ इस तरह है:

अभी मैं सिर्फ इस तरह एक पंक्ति पर पेड़ मुद्रण है रूबी में, वे आम तौर पर कैसे प्रतिनिधित्व करते हैं?

किसी भी मदद की सराहना की जाएगी।

+1

+1 सुंदर ascii पेड़ के लिए :) –

+0

तुम सिर्फ ascii में उत्पन्न पेड़ करना चाहते हैं? – Sean

+2

बच्चे के इंडेंट के साथ पेड़ * किनारे *, रूट नोड पहले प्रिंट करें। पेड़ों का प्रतिनिधित्व/प्रिंट करने के लिए वैधानिक तरीकों के लिए LISP एस-एक्सप्रेशन देखें। सही हो गया यह आपको 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

[यह कैसे गिट करता है?] (Http://www.kernel.org/pub/software /scm/git/docs/git-log.html) –

+0

धन्यवाद, मैंने कभी इसके बारे में नहीं सुना है लेकिन यह वास्तव में आशाजनक दिखता है। –

+0

कक्षाओं के बीच इस डेटा को पारित करने के बारे में कोई विचार कैसे हो सकता है? उपरोक्त पेड़ में प्रत्येक नोड्स मेरे कंपाइलर में एक वर्ग का प्रतिनिधित्व करता है, क्या मुझे बस उन नोड्स से एक सरणी वापस करनी चाहिए और उन्हें किसी भी तरह हैश में इकट्ठा करना चाहिए? –

2

आपको Graph मणि को देखने की आवश्यकता है। यह काम करने के लिए अद्भुत और उल्लेखनीय सरल है। आप अपने पेड़ की दिशा और नोड्स के आकार, साथ ही रंगों और बहुत कुछ चुन सकते हैं। मैंने पहले इसके बारे में पिछले साल रूबीकॉन्फ़ में पाया और उसे उड़ा दिया गया।

यह रूप में सरल है:

:

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

जाहिर है आप प्रोग्राम किनारों :)

यहाँ प्रवेश करने के लिए चाहते हो जाएगा बात जो इसे बारे में अधिक जानकारी दे देंगे की एक link to a pdf है

यदि आप रुचि रखते हैं तो Confreaks पर बातचीत का एक वीडियो भी है।

चीयर्स, शॉन

+0

धन्यवाद, मैं निश्चित रूप से इसमें देख लूंगा –