2011-01-18 20 views
9

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

कुछ सवाल:

  1. मुझे लगता है कि सही ढंग से समझ गए थे?

  2. यदि ऐसा है, तो रैगेल ऐसा उपकरण है?

  3. यदि यह है, तो डी डी पार्सर को डी स्रोत कोड में आउटपुट कर सकते हैं?

धन्यवाद!

+2

"worl के लिए नए कंपाइलर्स के डी "आपका स्वागत है। – umlcat

उत्तर

18
  1. यह मूल रूप से यह है। पार्सर जेनरेटर एक व्याकरण को एक स्रोत फ़ाइल में बदलते हैं जिसका उपयोग व्याकरण द्वारा परिभाषित language के सदस्यों के तारों को पहचानने के लिए किया जा सकता है। प्रायः, लेकिन हमेशा नहीं, एक पार्सर जेनरेटर को एक कार्यक्षेत्र विश्लेषक की आवश्यकता होती है ताकि वह अपने काम से पहले टोकन में टेक्स्ट को तोड़ सके। Lex and Yacc एक युग्मित शब्दावली विश्लेषक और पार्सर जनरेटर के क्लासिक उदाहरण हैं।

    आधुनिक पार्सर जेनरेटर अतिरिक्त सुविधाएं प्रदान करते हैं। उदाहरण के लिए, ANTLR व्याख्यात्मक विश्लेषण, व्याकरण संबंधी विश्लेषण के लिए कोड उत्पन्न कर सकता है, और यहां तक ​​कि उत्पन्न अमूर्त वाक्यविन्यास पेड़ भी चला सकता है। Elkhound एक पार्सर उत्पन्न करता है जो GLR पार्सिंग एल्गोरिदम का उपयोग करता है। यह गैर-सामान्यीकृत पार्सिंग एल्गोरिदम की तुलना में भाषाओं की विस्तृत श्रृंखला को पहचानने की अनुमति देता है। PEG Parsers को एक अलग शब्दावली विश्लेषक की आवश्यकता नहीं है।

  2. रैगेल वास्तव में एक परिमित राज्य मशीन के रूप में एक व्याख्यात्मक विश्लेषक उत्पन्न करता है। यह regular language को पहचान सकता है लेकिन context-free भाषा नहीं है। इसका अर्थ है कि यह डी प्रोग्रामिंग भाषाओं को पहचान नहीं सकता है, जिसमें डी

  3. रैगेल डी कोड उत्पन्न करता है यदि आपको तेज़ शब्दावली विश्लेषक की आवश्यकता है।

पूरी तरह से समझने के लिए कि आपके लिए एक पार्सर जनरेटर क्या करता है, आपको कुछ औपचारिक भाषा और पार्सिंग सिद्धांत की आवश्यकता होगी। The Dragon Book से शुरू होने के लिए बदतर स्थान हैं। यह भी देखें: Learning to write a compiler

यदि आप बहादुर महसूस कर रहे हैं, तो डीएमडी कंपाइलर -/dmd2/src/dmd/- lexer.c और parse.c के साथ वितरित लेक्सिंग और पार्सिंग कोड को देखना सुनिश्चित करें।

11

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

रागेल अद्वितीय बनाता है एक और चीज यह है कि यह ऑनलाइन है। दूसरे शब्दों में, एक अतुल्यकालिक स्रोत, जैसे गैर-अवरुद्ध सॉकेट से डेटा स्कैन करने के लिए उपयोग करना आसान है। यह कोई गतिशील संसाधन भी नहीं उपयोग करता है, सिवाय इसके कि कॉल/रिटर्न के लिए आप स्टैक के लिए स्थिर, स्वचालित या गतिशील मेमोरी का उपयोग कर सकते हैं; तुम जैसा चाहो।कोई वैश्विक स्थिति नहीं है, या तो।

Ragel काफी अद्वितीय है। अधिकांश (सभी?) पारंपरिक जेनरेटर के विपरीत, यह नेटवर्क प्रोग्रामिंग के लिए बनाया गया था।

1

हो सकता है:

MySourceCode -> (स्कैनर) -> MyScannerDataFile MyScannerDataFile -> (पार्सर) -> MyParserDataFile MyParserDataFile -> (CodeGenerator) -> MyExecutableFile

या:

MySourceCode -> (ScannerAndParser) -> MyScannerAndParserDataFile MyScannerAndParserDataFile -> (CodeGenerator) -> MyExecutableFile

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