क्या पार्सर का उत्पादन एक पेड़ होना है या यह सामान्य ग्राफ भी हो सकता है?
इसके अलावा, क्या कोई मौजूदा भाषा या एक प्रशंसनीय है जो अपने सिंटैक्स के लिए पेड़ों के बजाय सामान्य रेखांकन प्रतिनिधित्व का उपयोग करता है?
क्या पार्सर का उत्पादन एक पेड़ होना है या यह सामान्य ग्राफ भी हो सकता है?
इसके अलावा, क्या कोई मौजूदा भाषा या एक प्रशंसनीय है जो अपने सिंटैक्स के लिए पेड़ों के बजाय सामान्य रेखांकन प्रतिनिधित्व का उपयोग करता है?
जवाबों:
एक पार्सर के उत्पादन के लिए एक पेड़ नहीं होना चाहिए। वास्तव में, जब आप अमूर्त सिंटैक्स ट्री पर एक चर के उपयोग के संदर्भ में इसके DEFinition ओवरलेड जैसे संदर्भों पर विचार करते हैं, तो आपके पास तुरंत एक ग्राफ होता है।
बात यह है कि आम तौर पर पार्सिंग को एक ही पास में जगह लेने के लिए डिज़ाइन किया गया है - यह ऐतिहासिक कारणों के लिए मायने रखता है, जैसे कि अंतरिक्ष की कमी और प्रोसेसर की गति, लेकिन यह भी क्योंकि इसके बारे में तर्क करना सरल है। फिर बाद के चरणों ने अतिरिक्त जानकारी के साथ पार्स पेड़ को सजाया।
ग्राफ़ व्याकरण के रूप में ऐसी चीजें हैं, हालांकि मुझे नहीं पता कि वे प्रोग्रामिंग भाषाओं को पार्स करने के लिए उपयोग किए जाते हैं या नहीं।
ओपी का सवाल थोड़ा पीछे बताया गया है। बेशक, एक पार्सिंग एल्गोरिदम आउटपुट कर सकता है जो भी वह चाहता है। प्रश्न यह समझने के लिए अधिक है कि पार्सिंग किस लिए है और क्या पार्सर इस परिणाम को पूरा करता है। फिर कोई आश्चर्य कर सकता है कि उसके लिए उपयुक्त प्रतिनिधित्व क्या है, उदाहरण के लिए एक पेड़ या एक ग्राफ।
खैर, मुझे लगता है कि एक पार्सर एक एल्गोरिथ्म है जो आपको भाषा के वाक्यविन्यास की दी गई औपचारिक परिभाषा के अनुसार, इनपुट के रूप में दिए गए वाक्य की वाक्य संरचना प्रदान करेगा।
ध्यान दें कि लोग भाषा के वाक्य विन्यास का गठन करने पर असहमत हो सकते हैं। कुछ लोग इसे एक शुद्ध औपचारिक भाषा की सीमा तक सीमित कर सकते हैं, जबकि अन्य थोड़ा अधिक शब्दार्थवादी विचार प्रस्तुत कर सकते हैं जैसे कि टाइप, शैली, संख्या या अन्य जटिल शब्द (मैं एनएलपी या प्रोग्रामिंग भाषाओं को अलग नहीं कर रहा हूं)। अधिकांश भाषाओं में ऐसी विशेषताएं हैं जिनके लिए ग्राफ़ का प्रतिनिधित्व करने की आवश्यकता होती है, लेकिन यह "कार्यान्वयनकर्ता" (बेहतर शब्द की कमी के लिए) पर निर्भर करता है कि वह सिंटैक्स में शामिल करना चाहता है या नहीं।
इसलिए आप जिस वाक्य-विन्यास को परिभाषित करते हैं, उसके आधार पर, आपको एक अलग प्रकार की औपचारिक संरचना का उत्पादन करना पड़ सकता है।
शुद्ध प्रसंग-मुक्त पार्सिंग के सरल मामले में, एक पार्स ट्री कर सकते हैं, नीचे संबोधित अस्पष्टता की समस्या को छोड़कर, या इस तथ्य के लिए कि आप एएसटी प्राप्त करने के लिए इसे थोड़ा संशोधित करना चाहते हैं (नीचे देखें)।
हालांकि, अधिक जटिल मामलों में, आपको अलग-अलग संरचनाओं की आवश्यकता हो सकती है, अक्सर पेड़ में लिंक द्वारा प्रतिनिधित्व किया जाता है, इस प्रकार एक ग्राफ संरचना के लिए अग्रणी। यह भाषा वाक्य रचना की आपकी परिभाषा पर बहुत निर्भर करता है।
इसके अलावा, आपको किस पेड़ का उत्पादन करना चाहिए, यह स्पष्ट नहीं है। यदि आप पेड़ से सटे व्याकरण (TAG) के मामले को लेते हैं, तो वे इस तरह से काम करते हैं कि वाक्य रचना का पेड़ व्युत्पत्ति के पेड़ के समान नहीं है, हालांकि पूर्व को उत्तरार्द्ध से प्राप्त किया जा सकता है। जिसे आप आउटपुट करना चाहते हैं वह एक प्रासंगिक प्रश्न हो सकता है।
अस्पष्टता के संबंध में एक और मुद्दा भी है। आपकी भाषा से संबंधित एक वाक्य, कई अलग-अलग तरीकों से ऐसा कर सकता है, कई अलग-अलग तरीकों से वाक्य रचना को सौंपा जा सकता है।
फिर आप इनमें से सिर्फ एक संरचना का उत्पादन कर सकते हैं, यादृच्छिक रूप से या कुछ अच्छी तरह से परिभाषित मानदंड के अनुसार चुना जा सकता है (उदाहरण के लिए जैसे)। आप कई या सभी आउटपुट के लिए भी चुन सकते हैं। यदि आप कई आउटपुट करना चाहते हैं, तो यह आमतौर पर एक अनूठी संरचना में पैक करने के लिए उपयुक्त है जो कि उनके पास सामान्य रूप से साझा होगा। यह अंतरिक्ष और कंप्यूटिंग समय पर बचत करता है, और जटिलता एक वास्तविक मुद्दा हो सकता है।
जब आप उन सभी को आउटपुट करने के लिए चुनते हैं, तो आपके पास साझा करने के अलावा कोई विकल्प नहीं होता है, क्योंकि संभावित पार्स की एक अनंत संख्या हो सकती है। और असीम रूप से एक ग्राफ में किसी भी तरह से एक चक्र होने से ही बारी-बारी से पुनर्निर्मित किया जा सकता है। तो आपको सामान्य रूप से एक ग्राफ संरचना तैयार करनी होगी। लेकिन इस ग्राफ संरचना के गुण आपके द्वारा चुने गए औपचारिक सिंटैक्स से संबंधित हैं।
अब प्रश्न सार सिंटैक्स ट्री के बारे में भी था। मैंने "अमूर्त" भाग को छोड़ दिया क्योंकि यह भ्रम, इम्हो लाएगा। दरअसल यह सवाल पहले से ही अपने विभिन्न प्रतिबंधों में उलझा हुआ है।
ऐतिहासिक परिप्रेक्ष्य में एएसटी के बारे में, वे 1960-1970 के वर्षों में लिस्प और भाषा जोड़तोड़ प्रणाली के साथ उत्पन्न होते हैं। यह विचार था कि कार्यक्रमों को बड़ी अभिव्यक्तियों के रूप में माना जाए, गणितीय सूत्र के रूप में, हेरफेर उद्देश्य के लिए और गुणों का विश्लेषण करने के लिए या औपचारिक रूप से शब्दार्थ को परिभाषित करने के लिए, जो गणितज्ञों को पता है कि सूत्र कैसे करना है। सूत्र के रूप में, वे स्वाभाविक रूप से पेड़ संरचित थे, लेकिन इन पेड़ों को रेखांकन में बदल देने वाली विभिन्न जानकारी से सजाया जा सकता था। यह औपचारिक और व्यावहारिक रूप से सुविधाजनक था और इसका उपयोग कंपाइलर और प्रोग्रामिंग सिस्टम द्वारा आगे किया गया था।
इसलिए मौलिक रूप से, एक एएसटी एक पेड़ है, जैसा कि नाम से निहित है, लेकिन आगे की जानकारी ले सकता है। बाकी कार्यान्वयनकर्ता की पसंद में और देखने वाले की आँखों में है। यह एक ग्राफ या एक सजाया पेड़ है? हालाँकि, मूल AS वृक्ष मायने रखता है, क्योंकि यह वह मचान है जिसे आप सिद्धांत और प्रोग्रामिंग दोनों में बनाते हैं।
ध्यान दें कि एएसटी पार्स ट्री (सिंटैक्स संदर्भ-मुक्त आधारित था) से अलग था जैसा कि औपचारिक भाषा सिद्धांत में अध्ययन के अनुसार एल्गोरिथ्म द्वारा उत्पादित किया गया था। कारण यह था कि समय की पार्सिंग तकनीक द्वारा सिंटैक्स के डिजाइन को विवश किया गया था, स्वयं उपलब्ध कम कंप्यूटिंग शक्ति द्वारा विवश। इसका नतीजा यह हुआ कि सिंटैक्स के पेड़ों को केवल यातना देने वाले वेरिएंट थे जो स्वाभाविक रूप से कार्यक्रम की संरचना पर विचार करेंगे, और आगे की प्रक्रिया, मूल औपचारिक पार्सिंग प्रक्रिया का वास्तविक हिस्सा नहीं, एएसटी के लिए क्लीनर और सरल संस्करण प्राप्त करने के लिए प्रदर्शन किया जाना था।
हालाँकि, कंप्यूटर पर पेड़ों का प्रतिनिधित्व, चाहे सार हो या न हो, जब आप अस्पष्ट वाक्य की सभी संरचनाओं का प्रतिनिधित्व करना चाहते हैं तो कुछ हद तक विवश हैं। विशेष रूप से, यह जटिलता के मुद्दों को छुपाता है। एक ग्राफ संरचना में अस्पष्टताओं का संरक्षण, पार्स पेड़ों से एएस पेड़ों में अनुवाद करना भी एक मुद्दा हो सकता है। हालांकि, यदि आप इससे चिंतित हैं, तो अक्सर अपने कंक्रीट सिंटैक्स को इस तरह से परिभाषित करना संभव है कि पार्स ट्री एएसटी के रूप में काम कर सकता है। यह बहुत सामान्य एल्गोरिदम द्वारा अनुमति दी जाती है जो अस्पष्टता को संभालती है, और वर्तमान कंप्यूटरों की शक्ति से।
यदि आप GLR पार्सिंग (सामान्यीकृत LR) का उपयोग कर पार्स करते हैं, और यदि इनपुट का पार्स अस्पष्ट है (इनपुट पार्स करने के कई संभावित तरीके हैं), तो पार्स के परिणाम को पार्स एनएजी के बजाय माना जा सकता है, बजाय पेड़। पार्स डीएजी ने कई संभावित पार्स: कई संभावित पार्स पेड़ों को संकुचित किया।
हालांकि, लब्बोलुआब यह है कि यदि आपके पास एक संदर्भ-मुक्त व्याकरण है, और यदि आपका इनपुट स्ट्रिंग स्पष्ट रूप से पार्स करने योग्य है (व्याकरण में केवल एक ही व्युत्पत्ति है जो इस इनपुट स्ट्रिंग का उत्पादन करता है), और यदि पार्सिंग का काम उत्पादन करना है उस व्युत्पत्ति ... तो इन स्थितियों के तहत, पार्सिंग का उत्पादन हमेशा जरूरी होगा कि एक पेड़ हो, क्योंकि संदर्भ-मुक्त व्याकरण के किसी भी उत्पादन में स्वाभाविक रूप से एक पेड़ की संरचना होती है।
मैंने एक बार सी के लिए एक दुभाषिया लिखा था जिसमें + = ऑपरेटर (उदाहरण के लिए) के लिए "एएसटी" एक पेड़ नहीं था। विचार करें a[i++] += d
कि कहां a[i++]
है int
और क्या d
है double
। निहित रूपांतरण और लाने के संचालन को पेड़ में स्पष्ट किया गया था, इसलिए समस्या यह है कि लाने के लिए a[i++]
और रूपांतरण को डबल करने के लिए कहां है । हमारा समाधान पेड़ों को छोड़ना था। परिणामस्वरूप "एएसजी" इस तरह दिखता था
+=
/ | \
/ | \
/ | \
/ convert \
| | \
| fetch fetch
| / |
index d
/ \
a postinc
|
i
मैं खुद इस बात से हैरान था, जब तक कि मैंने महसूस किया है कि यह वह पेड़ नहीं है जो अमूर्त है, न ही यह कुछ सार "सिंटैक्स ट्री" के बारे में है, लेकिन सिंटैक्स सार है।
इसलिए, आपके प्रश्न का उत्तर देने के लिए, मैं यह निष्कर्ष निकालता हूं कि एक सार वाक्यविन्यास वृक्ष, साथ ही एक ठोस वाक्यविन्यास वृक्ष या निर्णय वृक्ष, या कोई अन्य वृक्ष, बेहतर वृक्ष होना चाहिए।
दूसरी ओर, कुछ भी किसी को एक सार वाक्यविन्यास ग्राफ, या एक सार वाक्यविन्यास आरेख, या एक सार वाक्यविन्यास घन, या एक सार वाक्यविन्यास विनिर्देशन का उपयोग करने से किसी को नहीं रोकना चाहिए।
मुझे लगता है कि "अमूर्त वाक्यविन्यास पेड़" का एक सार वाक्यविन्यास पेड़ ने मुझे भ्रम से बचने में मदद की होगी।