2011-10-28 14 views
10

हाय मैं कंपाइलर विकास में नया हूं, और सोच रहा हूं कि एएसटी कैसा दिखता है। मेरे पास कोड का एक छोटा सा भाग है, और मैं एएसटी उत्पन्न करने के लिए क्लैंग का उपयोग करता हूं। मुझे इससे ज्यादा जानकारी नहीं मिलती है। इसकी प्रकृति से, सिंटैक्स पेड़ स्रोत के समान ही है, एक संरचना को छोड़कर जो लगभग किसी भी नमूना में परीक्षण किया जाता है।क्लैंग: एएसटी (सार वाक्यविन्यास पेड़) कैसा दिखता है?

स्रोत:

class A { 
public: 
    int *a, *b, *c; 
    int i; 
    void sum() { 
    a = new int[5]; 
    b = new int[5]; 
    c = new int[5]; 
    for (i = 0; i < 5; i++) { 
     a[i] = i; 
     b[i] = i; 
    } 
    for (i = 0; i < 5; i++) { 
     c[i] = a[i] + b[i]; 
    } 
    delete[] a; delete[] b; delete[] c; 
    } 
}; 

class B : public A { 
}; 

int main() { 
    B bclass; 
    bclass.sum(); 
    return 0; 
} 

कमान उत्पन्न करने के लिए एएसटी:

clang++ -cc1 -ast-print ~/sum.cpp 

एएसटी उत्पादन:

struct __va_list_tag { 
    unsigned int gp_offset; 
    unsigned int fp_offset; 
    void *overflow_arg_area; 
    void *reg_save_area; 
}; 
typedef struct __va_list_tag __va_list_tag; 
class A { 
public: 
    int *a; 
    int *b; 
    int *c; 
    int i; 
    void sum()  { 
     this->a = new int [5]; 
     this->b = new int [5]; 
     this->c = new int [5]; 
     for (this->i = 0; this->i < 5; this->i++) { 
      this->a[this->i] = this->i; 
      this->b[this->i] = this->i; 
     } 
     for (this->i = 0; this->i < 5; this->i++) { 
      this->c[this->i] = this->a[this->i] + this->b[this->i]; 
     } 
     delete [] this->a; 
     delete [] this->b; 
     delete [] this->c; 
    } 


}; 
class B : public A { 
}; 
int main() { 
    B bclass; 
    bclass.sum(); 
    return 0; 
} 

धन्यवाद

+6

बस एक नोट: आप -स्ट-प्रिंट की बजाय -स्ट-डंप को आजमा सकते हैं; वह प्रतिनिधित्व जो आप खोज रहे हैं उसके करीब हो सकता है। – servn

+2

यदि सवाल यह है कि एएसटी कैसा दिखता है, और क्लांग की एएसटी कैसा दिखता है, तो आपको यह उत्तर उपयोगी नहीं मिलेगा: http://stackoverflow.com/questions/6376662/how-a-ast-for-an-object -ऑरिएंटेड-प्रोग्रामिंग-भाषा-दिखने वाला/6378 997 # 6378 997 –

उत्तर

16

उपलब्ध विभिन्न विकल्पों के बीच एक छोटा सा भ्रम नहीं है:

  • -ast-print वर्तमान एएसटी, कि है, यह कोड यह यह क्या पार्स करने के लिए यथासंभव करीबी रूप से समझ में आ प्रदान करेगा बहुत-प्रिंट होगा (लेकिन कुछ चीजें स्पष्ट बनाने this)
  • -ast-dump का प्रेत की तरह वर्तमान एएसटी

सुंदर प्रिंटर का एक तुतलाना की तरह प्रतिनिधित्व उत्पन्न होगा cH तक उपयोगी हो सकता है एईसी कि एएसटी लापरवाही है (यानी, const संरक्षित - ऐसी अभिव्यक्ति की भावना, आदि ...) लेकिन वास्तव में विकास के बारे में नहीं है।

यदि आप कंपाइलर पर हैक करना चाहते हैं, तो आपको -ast-dump की आवश्यकता है, जो एक आउटपुट उत्पन्न करेगा जो सीधे पार्स किए गए कोड के इन-मेमोरी प्रस्तुति को मैप करेगा।

5

एएसटी स्मृति में किसी लिंक किए गए संरचना ("है पेड़ "जस्टी नहीं बनाता है चीज की जटिलता के लिए सीई, लेकिन इसका नाम लोगों का उपयोग है)। -ast-print उत्पादन एएसटी का एक पाठपरक प्रतिनिधित्व है। चूंकि जिस विकल्प को सेट किया गया है वह सी/सी ++ से पहले से ही परिचित है - सिंटैक्स की तरह, यह उस प्रस्तुति में मुद्रित होता है जो वाक्यविन्यास का पालन करता है। यह एक डिजाइन पसंद है, एक खुश संयोग नहीं।

यदि आप देखना चाहते हैं कि एएसटी एक परिचित वाक्यविन्यास में उद्देश्य पर मुद्रित नहीं होने पर कैसा दिखता है, तो आप उदाहरण के लिए GIMPLE, जीसीसी के आंतरिक प्रतिनिधित्व को देख सकते हैं।

+0

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

+3

चेतावनी: जिम्प्ले को समझना मुश्किल और समझना मुश्किल है। –

3

और यदि आप गिंपल के साथ खेलना चाहते हैं, तो आप उस उद्देश्य के लिए GCC MELT का भी उपयोग कर सकते हैं। एमईएलटी गिंपल से निपटने के लिए एक उच्च स्तरीय डोमेन विशिष्ट भाषा है!

और कंपाइलर्स के अंदर, आंतरिक प्रतिनिधित्व अक्सर पेड़ नहीं होते हैं, लेकिन किसी भी तरह परिपत्र संरचनाएं होती हैं। जीसीसी में, एक मूल ब्लॉक इसे जोड़ता है, लेकिन द्विपक्षीय अपने मूल ब्लॉक को जान सकते हैं .... (यह थोड़ा अधिक जटिल है, लेकिन आपको विचार मिल गया है)।

संबंधित मुद्दे