पार्स ट्री और एएसटी के बीच अंतर क्या है?


90

क्या वे एक संकलन प्रक्रिया के विभिन्न चरणों द्वारा उत्पन्न होते हैं? या वे एक ही चीज के लिए सिर्फ अलग-अलग नाम हैं?


पार्स ट्री आपकी कलाकृतियों के साथ आपके व्याकरण का परिणाम है (आप एक ही भाषा के लिए व्याकरण के एक अनन्तता लिख ​​सकते हैं), एक एएसटी पार्स ट्री को भाषा के निकटतम संभव को कम करता है। एक ही भाषा के लिए कई व्याकरण अलग-अलग पार्स पेड़ देंगे, लेकिन एक ही एएसटी का परिणाम होना चाहिए। (आप अलग-अलग स्क्रिप्ट्स (एक ही व्याकरण के अलग-अलग पार्स ट्री) को एक ही AST तक घटा सकते हैं)
Guillaume86

1
इस एसओ जवाब में विस्तार से dfference पर चर्चा की: stackoverflow.com/a/1916687/120163
इरा बैक्सटर

जवाबों:


95

यह Terrence Parr द्वारा एक्सप्रेशन इवैल्यूएटर व्याकरण पर आधारित है ।

इस उदाहरण के लिए व्याकरण:

grammar Expr002;

options 
{
    output=AST;
    ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}

prog    :   ( stat )+ ;

stat    :   expr NEWLINE        -> expr
        |   ID '=' expr NEWLINE -> ^('=' ID expr)
        |   NEWLINE             ->
        ;

expr    :   multExpr (( '+'^ | '-'^ ) multExpr)*
        ; 

multExpr
        :   atom ('*'^ atom)*
        ; 

atom    :   INT 
        |   ID
        |   '('! expr ')'!
        ;

ID      : ('a'..'z' | 'A'..'Z' )+ ;
INT     : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WS      : ( ' ' | '\t' )+ { skip(); } ;

इनपुट

x=1
y=2
3*(x+y)

पार्स ट्री

पार्स ट्री इनपुट का एक ठोस प्रतिनिधित्व है। पार्स ट्री इनपुट की सारी जानकारी को बरकरार रखता है। खाली बक्से लाइन के व्हाट्सएप, यानी अंत का प्रतिनिधित्व करते हैं।

पार्स ट्री

एएसटी

एएसटी इनपुट का एक सार प्रतिनिधित्व है। ध्यान दें कि parens एएसटी में मौजूद नहीं हैं क्योंकि संघ पेड़ की संरचना से व्युत्पन्न हैं।

एएसटी

स्पष्टीकरण के माध्यम से अधिक जानकारी के लिए कंपाइलर और कंपाइलर जेनरेटर पीजी देखें। 23
या सार सिंटैक्स पेड़ पृष्ठ पर। 21 प्रोग्रामिंग भाषाओं के सिंटैक्स और शब्दार्थ में


5
आप पार्स ट्री से एएसटी कैसे प्राप्त करते हैं? AST में पार्स ट्री को सरल बनाने की विधि क्या है?
CMCDragonkai

3
पार्स पेड़ से एएसटी को प्राप्त करने के लिए कोई विशिष्ट एल्गोरिथ्म नहीं है। एएसटी में जो जाता है वह एक व्यक्तिगत प्राथमिकता है, लेकिन कार्य को पूरा करने के लिए पर्याप्त जानकारी होनी चाहिए। मैंने ANTLR का उपयोग करके Parens को AST से बाहर रखा ! व्याकरण में ऑपरेटर की आवश्यकता नहीं है, लेकिन डिफ़ॉल्ट रूप से ANTLR ने उन्हें शामिल किया होगा। मैं तोते के पेड़ के बारे में सोचता हूं कि आपको वह सब कुछ देना है, जिसकी आपको आवश्यकता है या नहीं, और एएसटी आपको नंगे न्यूनतम देने के रूप में। याद रखें कि आप पेड़ों को बहुत पीछे छोड़ देंगे, इसलिए आकार मायने रखता है।
गाय कोडर

2
आप सीएसटी (कंक्रीट सिंटैक्स ट्री) बनाम एएसटी (अमूर्त सिंटैक्स ट्री) की तरह हैं?
CMCDragonkai

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


16

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

मुझे यह पृष्ठ मिला जो इस सटीक प्रश्न को हल करने का प्रयास करता है।


11

मार्टिन फावलर की डीएसएल पुस्तक इसे अच्छी तरह से समझाती है। एएसटी में केवल सभी 'उपयोगी' तत्व होते हैं जो आगे की प्रक्रिया के लिए उपयोग किए जाएंगे, जबकि पार्स ट्री में आपके द्वारा पार्स किए गए मूल दस्तावेज से सभी कलाकृतियां (रिक्त स्थान, कोष्ठक, ...) शामिल हैं।


4

पास्कल असाइनमेंट लें आयु: = 42;

वाक्यविन्यास वृक्ष स्रोत कोड की तरह दिखेगा। नीचे मैं नोड्स के चारों ओर कोष्ठक लगा रहा हूं। [उम्र] [: =] [42] [;]

एक सार पेड़ इस तरह दिखेगा [=] [आयु] [४२]

असाइनमेंट 2 तत्वों, आयु और 42 के साथ एक नोड बन जाता है। विचार यह है कि आप असाइनमेंट निष्पादित कर सकते हैं।

यह भी ध्यान दें कि पास्कल सिंटैक्स गायब हो जाता है। इस प्रकार एक से अधिक भाषा एक ही एएसटी उत्पन्न करना संभव है। यह क्रॉस लैंग्वेज स्क्रिप्ट इंजन के लिए उपयोगी है।


1

पार्स ट्री में आंतरिक नोड्स गैर टर्मिनल हैं, पत्तियां टर्मिनल हैं। सिंटैक्स ट्री में आंतरिक नोड्स ऑपरेटर होते हैं, पत्तियां ऑपरेंड होती हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.