2008-09-18 18 views
11

मैंने हाल ही में पाइथन का उपयोग करके पाइथन में एक पार्सर लिखा है (यह yacc का एक अजगर पुनर्मूल्यांकन है)। जब मैं लगभग पार्सर के साथ किया गया तो मुझे पता चला कि मुझे जिस व्याकरण की आवश्यकता है उसे मुझे लेक्सर को सूचित करने के लिए पार्सिंग के दौरान कुछ देखने की आवश्यकता है। लेक्सर को सूचित करने के लिए एक नज़र डाले बिना मैं भाषा में तारों को सही ढंग से पार्स नहीं कर सकता।पार्सन के पायथन कार्यान्वयन?

ग्रामार नियमों से लेक्सर की स्थिति को नियंत्रित करने के अलावा मुझे लगता है कि मैं पार्सर मॉड्यूल में एक लुकअप टेबल का उपयोग करके अपने उपयोग मामले को हल कर दूंगा, लेकिन इसे बनाए रखना/परीक्षण करना बहुत मुश्किल हो सकता है। तो मैं कुछ अन्य विकल्पों के बारे में जानना चाहता हूं।

हास्केल में मैं पारसीक, पार्सिंग फ़ंक्शंस की लाइब्रेरी (जिसे संयोजक के रूप में जाना जाता है) का उपयोग करता हूं। क्या Parsec का एक पायथन कार्यान्वयन है? या शायद कुछ अन्य उत्पादन गुणवत्ता लाइब्रेरी पार्सिंग कार्यक्षमता से भरा है ताकि मैं पाइथन में एक संदर्भ संवेदनशील पार्सर बना सकूं?

संपादित करें: संदर्भ में मेरे सभी प्रयास मुफ्त पार्सिंग विफल हो गए हैं। इस कारण से, मैं उम्मीद नहीं करता कि एएनटीएलआर यहां उपयोगी हो।

उत्तर

3

यदि कोई एलएल पार्सर आपके लिए ठीक है, तो एक विकल्प जिसे आप विचार कर सकते हैं, ANTLR देने का प्रयास है, यह पाइथन भी उत्पन्न कर सकता है (वास्तव में यह एलएल (*) है क्योंकि वे इसे नाम देते हैं, * मात्रा के लिए खड़ा है देखो यह सामना कर सकते हैं)।

+1

मेरे मामले में मुझे पारंपरिक पार्सिंग से अधिक की आवश्यकता है ऐसा लगता है। पारंपरिक संदर्भ मुक्त पार्सर लिखने के मेरे सभी प्रयास सैद्धांतिक कारणों से उनके चेहरे पर गिर गए हैं। मुझे इस बिंदु पर काफी भरोसा है कि मुझे कम से कम सशर्त ऋण की आवश्यकता है। क्या एएनटीएलआर अभी भी लागू होगा? –

+0

आपके पास * एएनटीएलआर के साथ लुक है और यदि आपको आवश्यकता है तो आप सिंटैक्टिक्स जोड़ सकते हैं और अपने व्याकरण में भविष्यवाणी कर सकते हैं (अर्थशास्त्र भविष्यवाणी भी मौजूद है)। एंटरलवर्क का उपयोग करें, यह व्याकरण (http://www.antlr.org/works/index.html) को डिज़ाइन/डिबग करने के लिए वास्तव में सहायक है। एएनटीएलआर साइट पर भी तैयार व्याकरण तैयार हैं। –

1

एएनटीएलआर है, जो एलएल (*) है, वहां पाइपरसिंग है, जो अधिक ऑब्जेक्ट अनुकूल है और एक डीएसएल की तरह है, और फिर Parsing है जो ओकैमल के मेनिर की तरह है।

+0

मैं अब पाइपरसिंग की जांच कर रहा हूं, यह मैंने देखा है कि पारसी के सबसे नज़दीक दिखता है। मैं अभी आपका जवाब स्वीकार कर रहा हूं। आइए आशा करते हैं कि पाइपर्सिंग काम करता है :) धन्यवाद! –

+0

मैं इसे पीपर्सिंग दस्तावेज़ में पढ़ने के बारे में चिंतित हूं: जटिल व्याकरण और/या बड़े इनपुट स्ट्रिंग के लिए पाइपर्सिंग का प्रदर्शन धीमा हो सकता है। –

0

ANTLR बहुत अच्छा है और इसमें कई भाषाओं में काम करने का अतिरिक्त लाभ है।

4

PySec, एक और monadic पार्सर है मैं इसके बारे में ज्यादा पता नहीं है, लेकिन यह here

7

को देखकर मुझे विश्वास है कि pyparsing पारसेक रूप में एक ही सिद्धांतों पर आधारित है लायक है।

1

कुछ भी आपको अपने पार्सर को पीएलवाई का उपयोग करके "संदर्भ मुक्त" पथ से हटाने के लिए रोकता है। आप पार्सिंग के दौरान लेक्सर को जानकारी पास कर सकते हैं, और इस तरह पूर्ण लचीलापन प्राप्त कर सकते हैं। मुझे पूरा यकीन है कि आप इस तरह पीएलवाई के साथ अपनी इच्छानुसार कुछ भी पार्स कर सकते हैं।

हाथों पर उदाहरण के लिए, consider - यह पीएलवाई के साथ पायथन में लिखित एएनएसआई सी के लिए एक पार्सर है। यह क्लासिक सी टाइपिफ - पहचानकर्ता समस्या को हल करता है (जो सी के व्याकरण को गैर-संदर्भ-संवेदनशील बनाता है) पार्सर में प्रतीक तालिका को पॉप्युलेट करके प्रयोग किया जाता है जिसे लेक्सर में इस्तेमाल किया जा रहा है ताकि प्रतीक नामों को किसी भी प्रकार के रूप में हल किया जा सके या नहीं।

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