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


84

मैं इस बारे में थोड़ा पढ़ रहा हूं कि कैसे दुभाषियों / संकलक काम करते हैं, और एक क्षेत्र जहां मैं भ्रमित हो रहा हूं वह एएसटी और सीएसटी के बीच का अंतर है। मेरी समझ यह है कि पार्सर एक सीएसटी बनाता है, इसे सिमेंटिक विश्लेषक को सौंपता है जो इसे एएसटी में बदल देता है। हालाँकि, मेरी समझ यह है कि सिमेंटिक एनालाइज़र बस यह सुनिश्चित करता है कि नियमों का पालन किया जाए। मुझे वास्तव में समझ में नहीं आता है कि यह वास्तव में कंक्रीट के बजाय इसे अमूर्त बनाने के लिए कोई बदलाव क्यों करेगा।

क्या ऐसा कुछ है जो मैं शब्दार्थ विश्लेषक के बारे में याद कर रहा हूं, या एएसटी और सीएसटी के बीच का अंतर कुछ कृत्रिम है?

जवाबों:


62

एक ठोस वाक्यविन्यास वृक्ष स्रोत पाठ का प्रतिनिधित्व पार्स रूप में करता है। सामान्य तौर पर, यह स्रोत भाषा को परिभाषित करने वाले संदर्भ-मुक्त व्याकरण के अनुरूप है।

हालांकि, कंक्रीट व्याकरण और पेड़ में बहुत सारी चीजें हैं जो स्रोत पाठ को स्पष्ट रूप से पार्स करने योग्य हैं, लेकिन वास्तविक अर्थ में योगदान नहीं करते हैं। उदाहरण के लिए, ऑपरेटर की पूर्ववर्ती स्थिति को लागू करने के लिए, आपके सीएफजी में आमतौर पर अभिव्यक्ति घटकों (शब्द, कारक, आदि) के कई स्तर होते हैं, ऑपरेटरों के साथ उन्हें विभिन्न स्तरों पर जोड़ते हैं (आप अभिव्यक्ति प्राप्त करने के लिए शब्दों को जोड़ते हैं, शब्दों को कारकों से मिलकर बनाया जाता है। , आदि।)। भाषा की वास्तव में व्याख्या या संकलन करने के लिए, हालाँकि, आपको इसकी आवश्यकता नहीं है; आपको बस एक्सप्रेशन नोड्स की आवश्यकता है जिसमें ऑपरेटर और ऑपरेंड हों। अमूर्त सिंटैक्स ट्री, प्रोग्राम के अर्थ को दर्शाने के लिए आवश्यक चीजों के लिए ठोस सिंटैक्स ट्री को सरल बनाने का परिणाम है। इस पेड़ की बहुत सरल परिभाषा है और इस प्रकार निष्पादन के बाद के चरणों में प्रक्रिया करना आसान है।

आप आमतौर पर एक ठोस वाक्यविन्यास पेड़ बनाने की जरूरत नहीं है। आपके YACC (या Antlr, या Menhir, या जो कुछ भी ...) में व्याकरण क्रिया सीधे सार सिंटैक्स ट्री का निर्माण कर सकती है, इसलिए कंक्रीट सिंटैक्स ट्री केवल एक वैचारिक इकाई के रूप में मौजूद है जो आपके स्रोत पाठ के पार्स संरचना का प्रतिनिधित्व करता है।


2
अनुपूरक: पायथन दुभाषिया पहले एक सीएसटी बनाता है और फिर एएसटी में परिवर्तित होता है।
cgsdfc

33

एक ठोस वाक्यविन्यास पेड़ से मेल खाता है जो व्याकरण के नियमों का कहना है कि वाक्यविन्यास है। अमूर्त सिंटैक्स ट्री का उद्देश्य "सिंटैक्स ट्री" में जो आवश्यक है उसका "सरल" प्रतिनिधित्व है।

एएसटी आईएमएचओ में एक वास्तविक मूल्य यह है कि यह सीएसटी से छोटा है, और इसलिए इसे संसाधित करने में कम समय लगता है। (आप कह सकते हैं, कौन परवाह करता है? लेकिन मैं एक उपकरण के साथ काम करता हूं, जहां हमारे पास लाखों टन नोड्स एक बार रहते हैं)।

अधिकांश पार्सर जनरेटर जिनका वाक्यविन्यास पेड़ों के निर्माण के लिए कोई समर्थन है, आप व्यक्तिगत रूप से यह निर्दिष्ट करते हैं कि वे कैसे इस धारणा के तहत निर्मित होते हैं कि आपका पेड़ नोड्स सीएसटी की तुलना में "सरल" होगा (और इसमें, वे आम तौर पर सही हैं, जैसा कि प्रोग्रामर सुंदर हैं। आलसी)। यकीनन इसका मतलब है कि आपको कम पेड़ आगंतुक कार्यों को कोड करना होगा, और यह मूल्यवान है, इसमें भी, यह इंजीनियरिंग ऊर्जा को कम करता है। जब आपके पास 3500 नियम हों (उदाहरण के लिए, COBOL के लिए) तो यह मायने रखता है। और यह "सरल" नेस "लघुता" की अच्छी संपत्ति की ओर जाता है।

लेकिन इस तरह के एएसटी होने से एक समस्या पैदा होती है: यह व्याकरण से मेल नहीं खाता है, और अब आपको दोनों को मानसिक रूप से ट्रैक करना होगा। और जब 3500 नियम व्याकरण के लिए 1500 एएसटी नोड होते हैं, तो यह बहुत मायने रखता है। और अगर व्याकरण विकसित होता है (वे हमेशा करते हैं!), तो अब आपके पास सिंक्र में रखने के लिए दो विशाल सेट हैं।

एक अन्य उपाय यह है कि पार्सर केवल आपके लिए सीएसटी नोड्स का निर्माण करें और बस उन का उपयोग करें। व्याकरण का निर्माण करते समय यह एक बड़ा लाभ है: 3500 व्याकरण नियमों को मॉडल करने के लिए 1500 विशेष एएसटी नोड्स का आविष्कार करने की आवश्यकता नहीं है। बस व्याकरण के लिए पेड़ के isomorphic होने के बारे में सोचो। व्याकरण इंजीनियर के दृष्टिकोण से यह पूरी तरह से मस्तिष्कहीन है, जो उसे व्याकरण को सही करने और उसके दिल की सामग्री को हैक करने पर ध्यान केंद्रित करने देता है। संभवतः आपको अधिक नोड आगंतुक नियम लिखने होंगे, लेकिन इसे प्रबंधित किया जा सकता है। इस पर और बाद में।

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

    L = e ;
    L = L e ;
    L2 = e2 ;
    L2 = L2  ','  e2 ;

और इस तरह के रूपों की एक विस्तृत विविधता। आप व्याकरण के नियमों और आभासी सीएसटी के संदर्भ में सोचते हैं; उपकरण संपीड़ित प्रतिनिधित्व पर काम करता है। आपके मस्तिष्क पर आसान, रनटाइम पर तेज / छोटा।

उल्लेखनीय रूप से, इस तरह से निर्मित संकुचित सीएसटी एक बहुत एएसटी लगता है जिसे आपने हाथ से डिज़ाइन किया होगा (उदाहरण के लिए लिंक को अंत में देखें)। विशेष रूप से, संकुचित सीएसटी किसी भी नोड को नहीं ले जाता है जो कि केवल ठोस सिंटैक्स हैं। उदाहरण के लिए, जबकि '(' और ')' के लिए ठोस नोड्स प्रतिष्ठित अभिव्यक्ति subgrammars में पाया वृक्ष, "कोष्ठक नोड" में नहीं हैं: वहाँ awkwardness की नाबालिग बिट्स हैं करता संकुचित सीएसटी में दिखाई देते हैं और नियंत्रित किया जाना चाहिए। एक सच्चे एएसटी में यह नहीं होगा। ऐसा लगता है कि एएसटी निर्माण को निर्दिष्ट नहीं करने की सुविधा के लिए भुगतान करने के लिए एक बहुत छोटी कीमत है। और पेड़ के लिए दस्तावेज़ हमेशा उपलब्ध है और सही है: व्याकरण है प्रलेखन।

हम "अतिरिक्त आगंतुकों" से कैसे बचें? हम पूरी तरह से नहीं करते हैं, लेकिन डीएमएस एक एएसटी पुस्तकालय प्रदान करता है जो एएसटी चलता है और सीएसटी और एएसटी के बीच अंतर को पारदर्शी रूप से संभालता है। DMS एक "विशेषता व्याकरण" मूल्यांकनकर्ता (AGE) भी प्रदान करता है, जो कि पेड़ के ऊपर और नीचे एक नोड की गणना करने वाले मानों को पारित करने की एक विधि है; AGE सभी पेड़ प्रतिनिधित्व मुद्दों को संभालता है और इसलिए उपकरण इंजीनियर केवल व्याकरण नियमों पर सीधे प्रभावी रूप से गणना लिखने की चिंता करता है। अंत में, डीएमएस "सतह-वाक्यविन्यास" पैटर्न भी प्रदान करता है, जो व्याकरण से कोड के टुकड़े को विशिष्ट प्रकार के उपशीर्षक खोजने के लिए उपयोग किया जाता है, जिसमें अधिकांश नोड प्रकार शामिल नहीं होते हैं।

अन्य उत्तरों में से एक यह देखता है कि यदि आप ऐसे उपकरणों का निर्माण करना चाहते हैं जो स्रोत को पुन: उत्पन्न कर सकते हैं, तो आपके एएसटी को सीएसटी से मिलान करना होगा। यह वास्तव में सही नहीं है, लेकिन अगर सीएसटी नोड्स हैं तो स्रोत को फिर से बनाना आसान है। डीएमएस स्वचालित रूप से अधिकांश प्रीपाइटर को उत्पन्न करता है क्योंकि इसकी पहुंच दोनों तक है: -}

नीचे पंक्ति: एएसटी छोटे के लिए अच्छे हैं, दोनों फाइटिक और वैचारिक। सीएसटी से स्वचालित एएसटी निर्माण दोनों प्रदान करता है, और आपको दो अलग-अलग सेटों को ट्रैक करने की समस्या से बचने देता है।

EDIT मार्च 2015: सीएसटी बनाम "एएसटी" के उदाहरणों का लिंक इस तरह बनाया गया


25

यह 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 AST में मौजूद नहीं हैं क्योंकि संघ पेड़ की संरचना से व्युत्पन्न हैं।

एएसटी

संपादित करें

स्पष्टीकरण के माध्यम से अधिक जानकारी के लिए कंपाइलर और कंपाइलर जेनरेटर पीजी देखें। 23


20

यह ब्लॉग पोस्ट सहायक हो सकता है।

यह मुझे लगता है कि एएसटी "दूर फेंकता है" बहुत सारे मध्यवर्ती व्याकरणिक / संरचनात्मक जानकारी है जो शब्दार्थ में योगदान नहीं करेगा। उदाहरण के लिए, आप परवाह नहीं है कि 3 एक परमाणु है एक शब्द है एक कारक है एक .... आप सिर्फ परवाह है कि यह है 3जब आप घातांक अभिव्यक्ति या जो भी लागू कर रहे हैं।


9

ठोस वाक्य रचना पेड़ भाषा के व्याकरण के नियमों का पालन करती। व्याकरण में, "अभिव्यक्ति सूचियों" को आमतौर पर दो नियमों के साथ परिभाषित किया जाता है

  • अभिव्यक्ति_सूची हो सकती है: अभिव्यक्ति
  • अभिव्यक्ति_सूची हो सकती है: अभिव्यक्ति, अभिव्यक्ति_सूची

शाब्दिक रूप से अनुसरण किए गए, ये दो नियम प्रोग्राम में दिखाई देने वाली किसी भी अभिव्यक्ति सूची को एक कंघी आकार देते हैं।

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


2

बस, एएसटी में केवल कोड का शब्दार्थ होता है, पार्स ट्री / सीएसटी में यह भी जानकारी शामिल होती है कि कोड वास्तव में कैसे लिखा गया था।


1

कंक्रीट के सिंटैक्स ट्री में सभी जानकारी जैसे अति सूक्ष्म कोष्ठक और व्हाट्सएप और टिप्पणियां, सार सिंटैक्स ट्री इस जानकारी से दूर रहती हैं।

 

NB: मज़ेदार पर्याप्त, जब आप एक रिफैक्टिंग इंजन को लागू करते हैं तो आपके एएसटी में फिर से सभी ठोस जानकारी होगी, लेकिन आप इसे एएसटी के रूप में संदर्भित करते रहेंगे क्योंकि यह क्षेत्र में मानक शब्द बन गया है (इसलिए कोई कह सकता है कि यह लंबे समय तक हो सकता है पहले अपना मूल अर्थ खो दिया)।


ठीक है, यह सभी ठोस जानकारी नहीं हो सकता है। यह आवश्यक है कि यह उस जानकारी को पुन: उत्पन्न करने में सक्षम हो। मेरा जवाब देखिए।
इरा बैक्सटर

कल टिप्पणी की? SO बग या कोई टिप्पणी नेक्रोमैंज़र बैज अर्जित किया जाना है जिसके बारे में मुझे जानकारी नहीं है? :) (पीएस: लेकिन आप से सुनने के लिए अच्छा है, आपने डीएमएस पर अपनी Google टेक बात पर सिर्फ ठोकर खाई है ...)
अक्कू

1

यह एक अंतर है जो एक अंतर नहीं है।

एएसटी को आमतौर पर लेक्सिकल सामग्री को फेंककर एक प्रोग्रामिंग भाषा अभिव्यक्ति के शब्दार्थ को अनुमानित करने के तरीके के रूप में समझाया जाता है। उदाहरण के लिए एक संदर्भ मुक्त व्याकरण में आप निम्नलिखित ईबीएनएफ नियम लिख सकते हैं

term: atom (('*' | '/') term )*

AST मामले में आप केवल mul_rule और div_rule का उपयोग करते हैं जो उचित अंकगणितीय संचालन को व्यक्त करता है।

क्या उन नियमों को पहली बार व्याकरण में पेश नहीं किया जा सकता है? बेशक। आप उपरोक्त कॉम्पैक्ट और अमूर्त नियम को फिर से उल्लेखित एएसटी नोड्स की नकल करने के लिए उपयोग किए जाने वाले अधिक ठोस नियमों में तोड़कर फिर से लिख सकते हैं:

term: mul_rule | div_rule
mul_rule: atom ('*' term)*
div_rule: atom ('/' term)*

अब, जब आप टॉप-डाउन पार्सिंग के संदर्भ में सोचते हैं तो दूसरा शब्द mul_rule और div_rule के बीच एक FIRST / FIRST संघर्ष का परिचय देता है जो एक LL (1) पार्सर के साथ सौदा नहीं कर सकता है। पहला नियम फॉर्म दूसरे के बाएं फैक्टरेड संस्करण था जिसने संरचना को प्रभावी ढंग से समाप्त कर दिया था। आपको यहां एलएल (1) का उपयोग करने के लिए कुछ पुरस्कार देना होगा।

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


0

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

एएसटी (एब्सट्रैक्ट सिंटेक्स ट्री) पार्सड स्रोत का एक पेड़ प्रतिनिधित्व है, जो कंपाइलर के पार्सर भाग द्वारा निर्मित है। यह टोकन + व्याकरण के बारे में जानकारी संग्रहीत करता है।

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

अधिक स्पष्टीकरण इस लिंक पर पाया जा सकता है: http://eli.thegreenplace.net/2009/02/02/16/abstract-vs-concrete-syntax-trees#id6


1
मुझे लगता है कि विशेष रूप से "सरलीकृत" पर इन स्पष्टीकरणों की आवश्यकता है, मैं इसे कम से कम वैचारिक रूप से "जटिल" के रूप में देखता हूं जो विपरीत है, और अभी भी उपयोगी कुछ भी नहीं बताता है।
जोशुआ हेजेज ने

1
मैंने अपने -1 को +1 में बदल दिया। मुझे लगता है कि आपके द्वारा किए गए स्पष्टीकरण पर्याप्त हैं।
यहोशू हेजेज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.