2013-05-27 5 views
10

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

+0

@chollida: मैं कुछ समस्या हैक करने की बजाय इस समस्या पर सलाह लेने की कोशिश कर रहा हूं। –

+0

आपको कुछ हैकी नहीं मिलेगा क्योंकि आपने जो कुछ हासिल करने की कोशिश की थी, उसमें आप थोड़ा सा पोस्ट किया था। – octopusgrabbus

+0

@ ऑक्टोपसग्रैबस: मुझे यकीन नहीं है कि आपका क्या मतलब है। मेरे विकल्प जैसे कि मैं उन्हें देखता हूं, हाथ से (हैकी), या एक पार्सर जनरेटर का उपयोग करने के लिए, जिसमें Instaparse सबसे अच्छी तरह विकसित होता है।लेकिन यह बिल्कुल स्पष्ट नहीं था कि ए/ईबीएनएफ में इंडेंटेशन-आधारित व्याकरण को व्यक्त करने के बारे में कैसे जाना है, या क्या Instaparse एक उपयुक्त उपकरण होगा। इसलिए सवाल है। –

उत्तर

10

जाहिर है, आप इस मुद्दे को Instaparse के साथ रखने वाले पहले व्यक्ति नहीं हैं।

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

यह कमी विशेष रूप से issue 9 में उठाई गई थी, जिसे issue 10 से हटा दिया गया था; बाद में, Instaparse लेखक एक वर्कअराउंड का सुझाव देता है:

इस बीच, एक कामकाज है जिसे आप संभावित रूप से नियोजित कर सकते हैं। आप इंडेंट और डेडेंट जैसे टोकन को अप्रयुक्त वर्णों पर मैप कर सकते हैं और फिर इसे एक स्ट्रिंग के रूप में पुनर्निर्माण कर सकते हैं, फिर उस पर इंस्टैपर्स चलाएं। मेरा मानना ​​है कि एएससीआईआईआई अक्षर 0-8 और 11-31 अप्रयुक्त हैं और टोकन के रूप में काम कर सकते हैं।

यह निश्चित रूप से एक संभावना है, हालांकि यह एक सौंदर्य निर्णय है कि यह "कुछ हैकी कर रहा है।" फिर भी, आप उम्मीदों में इस तरह के एक हैक लिख सकते हैं कि एक बार समस्या 10 हल हो जाने पर इसे हटाया जा सकता है। आप उस मुद्दे की चर्चा में शामिल होना चाह सकते हैं।

+0

हैकी द्वारा, मैं ज्यादातर हाथ से एक पार्सर रोलिंग मतलब था। यह आशाजनक लग रहा है, मैं इसे आगे बढ़ाऊंगा। बहुत बहुत धन्यवाद। –

8

आम तौर पर खरोज आधारित पार्स करने के लिए आप तीन चीजों की जरूरत है:

  • प्रत्येक के लिए,

  • प्रक्रिया टोकन की धारा प्रत्येक पंक्ति पर प्रमुख रिक्त स्थान से एक टोकन बनाने के लिए tokenizer का विस्तार वर्तमान संदर्भ के मुकाबले अग्रणी रिक्त स्थान की तुलना करें और यह इंगित करता है कि कोई वृद्धि या कमी है (इसलिए आप को टोकन रखने के लिए प्रत्येक पंक्ति की शुरुआत में टोकन रखते हैं जब इंडेंटेशन स्तर परिवर्तन)

  • एक "सामान्य" पार्सर लिखना जो कि टोकन से अवगत है जो इंडेंट स्तर में परिवर्तन दर्शाता है।

उस भाषा के आधार पर जो आपको तीसरे भाग से दूसरे भाग में कुछ जानकारी फीडबैक करने की आवश्यकता हो सकती है।

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

+0

धन्यवाद, यह बहुत उपयोगी है। –

+1

+1 'वास्तव में मुझे बंद कर दें' के लिए +1। :) –

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

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