2012-07-01 5 views
5

में ऑपरेटर के लिए गतिशील प्राथमिकता और प्राथमिकता निर्दिष्ट करना मैं एक ऐसी भाषा का विश्लेषण करने की कोशिश कर रहा हूं जहां ऑपरेटरों के पास मेनिर पार्सर (ओकैमलीक के समान) का उपयोग करके गतिशील गुण (प्राथमिकता और प्राथमिकता) हो। लेक्सिंग चरण के दौरान, सभी ऑपरेटर OP:string टोकन भरते हैं (इसलिए "+" (OP "+") आदि में बदल जाता है)।मेनिर/ओकैमैकैक

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

धन्यवाद, चार्लीपी।

उत्तर

10

मुझे "आप इसे गलत कर रहे हैं" टिप्पणी के साथ जवाब देने के लिए खेद है। मैं तीन आपत्तियों मुझे आशा है कि, रचनात्मक हैं प्रासंगिकता के घटते क्रम में है:

  1. Menhir गतिशील व्याकरण अपडेट के लिए नहीं है; यदि आप पार्स-टाइम पर अपना व्याकरण बदलने पर जोर देते हैं, तो आपको एक ऐसा टूल उपयोग करना चाहिए जो इस सुविधा को प्रदान करता हो, जैसे कि जीएलआर पार्सर Dypgen। डायपेजन मैनुअल ऑपरेटर प्राथमिकताओं को गतिशील रूप से अद्यतन करने की संभावना का उल्लेख करता है, एक बाध्य तरीके से (ऐसा लगता है कि आप नए ऑपरेटरों और संबंधित प्राथमिकताओं को जोड़ सकते हैं, लेकिन मौजूदा लोगों की प्राथमिकता को नहीं बदल सकते हैं) जो आपकी आवश्यकताओं से मेल खा सकते हैं या नहीं भी हो सकते हैं। Dypgen manual (PDF) की धारा 6.6 देखें, पृष्ठ ... 42.

  2. गतिशील रूप से एक CFG व्याकरण अद्यतन करना, मुझे लगता है कि उपयोगकर्ता द्वारा परिभाषित ऑपरेटर प्राथमिकताओं को संभालने का सबसे अच्छा तरीका नहीं है। एग्डा में बहुत सामान्य उपयोगकर्ता परिभाषित मिक्सफिक्स ऑपरेटर हैं, और उनका समाधान लगभग निम्न है: व्याकरणिक संरचना को पार्स करने के लिए अपने सीएफजी पार्सर का उपयोग करें, लेकिन अभिव्यक्ति के लिए जो संभावित रूप से फैंसी वरीयताओं और सहयोगियों का उपयोग करते हैं, बस उन्हें एक सूची में पार्स करें टोकन। उदाहरण के लिए, let x = if foo then x + y * z else bar को Let(x, If(foo, Expr(x, +, y, *, z), bar) जैसे कुछ में पार्स किया जाएगा। बाद में विशेष पास Expr नोड्स को उनके विशेष ढांचे में पोस्ट-पार्स करने के लिए आवश्यक जानकारी एकत्र कर सकता है। पार्सर जनरेटर का उपयोग करें जो वे (स्थिर रूप से ज्ञात समृद्ध सीएफजी) के लिए अच्छे हैं, और जटिल, बीमार परिभाषित, गतिशील सामग्री के लिए एक पोस्ट प्रोसेसिंग पास का उपयोग करें। AGDA दोस्तों, उदाहरण Parsing Mixfix Operators, Danielsson और Norell के लिए, विषय पर कुछ साहित्य है 2009

    देखने के एक डिजाइन बिंदु से, मैं दृढ़ता से आप, उनमें से प्रत्येक अच्छी तरह से कई अलग अलग गुजरता में अपने lexing और पार्स करने के लिए आग्रह करता हूं अलग परिभाषित और अपनी संरचना को गतिशील रूप से बदलने की कोशिश करने के बजाय, पिछली संरचना पर एकत्र की गई जानकारी का उपयोग करना। आपके पास कुछ आसान और अधिक मजबूत होगा।

  3. गतिशील या उपयोगकर्ता द्वारा परिभाषित प्राथमिकता और प्राथमिकताओं, मेरी राय में, थोड़ा बुराई है। ओकैमल की एक अलग प्रणाली है जहां ऑपरेटर प्राथमिकता प्राथमिकताएं उनके पहले कुछ वर्णों (उदाहरण के लिए @, @@ और @+ सभी सही-सहयोगी हैं) द्वारा निर्धारित की जाती हैं। यह इंफिक्स ऑपरेटर चुनने वाले लोगों के लिए थोड़ा सा प्रतिबंधक है, लेकिन कोड पाठक बनाता है और अधिक आरामदायक रहता है, क्योंकि उनके पास सीखने के लिए व्याकरण नियमों का केवल एक सेट होता है, बजाय कोड की किसी भी नए हिस्से को गतिशील रूप से अनुकूलित करने के बजाय । यदि आप जंगली, पूरी तरह से अलग वाक्यविन्यास के साथ कोड के विदेशी टुकड़ों को सम्मिलित करने की अनुमति देना चाहते हैं, उद्धरण तंत्र (उदाहरण के लिए camlp4 <:foo<...>>) ऑपरेटर-स्तर सहयोगीताओं और प्राथमिकताओं के साथ झुकाव से कहीं अधिक मजबूत हैं, और पार्स के लिए भी बहुत आसान है।

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