2010-07-20 11 views
5

यह कुछ सालों से हुआ है क्योंकि मुझे CSV या XML से अधिक कठिन फ़ाइलों को पार्स करना पड़ा है, इसलिए मैं अभ्यास से बाहर हूं। मुझे डेल्फी एप्लिकेशन में NeXus नामक एक फ़ाइल प्रारूप को पार्स करने का कार्य दिया गया है।मैं डेल्फी में एक जटिल फ़ाइल प्रारूप को कैसे पार्स कर सकता हूं? (सीएसवी, एक्सएमएल, आदि नहीं)

समस्या यह है कि मुझे नहीं पता कि कहां से शुरू करना है, क्या मैं टोकननाइज़र, रेगेक्स इत्यादि का उपयोग करता हूं? हो सकता है कि इस बिंदु पर मुझे एक ट्यूटोरियल भी हो।

उत्तर

7

GOLD Parser पर एक नज़र डालें। यह एक मेटा-पार्सिंग सिस्टम है जो आपको एक भाषा/फ़ाइल प्रारूप के लिए एक औपचारिक व्याकरण परिभाषित करने की अनुमति देता है। यह एक पार्सिंग नियम फ़ाइल बनाता है जिसे आप अपनी इनपुट फ़ाइल के साथ एक टोकननाइज़र में खिलाते हैं, और यह स्मृति में वाक्यविन्यास पेड़ बनाता है।

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

+0

मैं अब गोल्ड पार्सर की जांच कर रहा हूं। – Daisetsu

+0

बस एक एफवाईआई यह केवल बीएनएफ का समर्थन करता है जो ईबीएनएफ नहीं है जो इसे काम करने के लिए कुछ हद तक दर्दनाक बनाता है। – Daisetsu

+2

हाँ, मैं मानता हूं, ईबीएनएफ समर्थन इसे आसान बना देगा। :( –

2

मेसन के बहुत अच्छे जवाब के अतिरिक्त। डेल्फी में एक बहुत छोटी कक्षा है जिसे अक्सर अनुचित किया जाता है, और एक जिसे आप वास्तव में अच्छी तकनीक सीख सकते हैं और पेज प्रोड्यूसर क्लास है।

इस बात पर नज़र डालें कि यह एचटीएमएल को पार करता है और टैग, विशेषताओं आदि जैसे चीजों पर घटनाओं को सतह पर रखता है। मैं पेज प्रोड्यूसर का उपयोग नहीं कर रहा हूं (क्योंकि आप नेक्सस के लिए सक्षम नहीं होंगे) लेकिन यह एक बहुत है सरल, सुरुचिपूर्ण और शक्तिशाली तकनीक।

3

इस बाहर की जाँच करें, यह वाणिज्यिक है, लेकिन यह एक मजेदार खिलौना की तरह दिखता है:

http://dpg.zenithlab.com/

लेकिन, वास्तव में: गठजोड़ के लिए आप एक जटिल पार्सर जरूरत नहीं है।

स्थिति की जांच कोड का थोड़ा सा, और कुछ स्ट्रिंग-स्प्लिटिंग और कंस्ट्रैसिस गिनती, और आपने इसे लिखा है। एक TStringList में

  1. लोड फाइल:

    मैं इस तरह एक साधारण टोकन-पर-एक-समय पार्सर का उपयोग कर इसे पार्स होगा। प्रत्येक लाइन के लिए

  2. , लाइन प्रकार निर्धारित करने के लिए, एक समय में एक टोकन पकड़ें।
    इस लाइन प्रकार के लिए एक गणना प्रकार है।
  3. पहली वैध गैर-रिक्त रेखा को वैध #nexus टैग होने के लिए हटाया जाना चाहिए।
  4. अगले हेडर क्षेत्र (ज्यादातर इसे छोड़कर छोड़ दिया गया)
  5. लाइन पर पहला और कीवर्ड शुरू होता है।
  6. प्रारंभ ब्लॉक के अंदर पंक्तियों के बाद लगभग एक डॉस कमांड और इसके कमांड लाइन पैरामीटर की तरह दिखाई देता है और रिक्त स्थान से अलग होता है, और सेमीकॉलन के साथ समाप्त होता है। पास्कल की तरह बहुत ज्यादा, लेकिन कोष्ठक।

ऊपर के लिए मैं खुद के लिए सहायकों का एक छोटा सेट कोड होता है, और अंततः चीजें मैं लिखने के लिए आवश्यकता हो सकती है में से एक इस तरह एक छोटे से टोकन बंटवारे समारोह है:

समारोह GetToken (वर inputString: स्ट्रिंग; आउटपुट टोकन: स्ट्रिंग; कॉन्स सेपरेटर्स: टीएसट्रिंग्स; कीवर्ड: टीएसट्रिंग्स; पेरेंटफ्लैग: बूलियन): बूलियन;

गेटोकन इनपुट लौटने से टोकन स्ट्रिंग को खोजने और वापस करने में सक्षम होने पर सत्य वापस आ जाएगा, यह किसी भी अग्रणी व्हाइटस्पेस को छोड़ देगा, और जब इसे विभाजक मिल जाए तो समाप्त हो जाएगा। विभाजक अंतरिक्ष या अल्पविराम जैसी चीजें हैं।
पेरेंटफ्लैग: ट्रू का मतलब यह होगा कि मुझे प्राप्त होने वाला अगला टोकन आइटमों की एक संपूर्ण संश्लेषित सूची होना चाहिए। एक बार जब मैं पूरी संश्लेषित सूची प्राप्त करता हूं (((ए, बी), (सी, डी), (ई, एफ))) तो मैं एक और फ़ंक्शन कॉल करूंगा जो सूचियों के लिए कुछ डेटा संरचना में उस सूची की सामग्री को अनपैक करेगा/सरणियों।

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

क्या आप इस पर प्रश्न/परिवर्तन करने की उम्मीद कर रहे हैं? क्या आपको लगता है कि इसके साथ काम करने के लिए आपको इसे जेसन या एक्सएमएल में परिवर्तित करने की आवश्यकता है?

+2

ठीक स्पष्टीकरण, हालांकि tstringlist के साथ लोड होने से दूर रहेगा। यह अनावश्यक रूप से फाइलसाइज पर एक सीमा डालता है (+/- आपकी मेमोरी का आधा आपके ऐप पर उपलब्ध) –

+1

डीपीजी लगता है एक पुरानी परियोजना, आखिरी रिलीज 2002 में थी। यह एक समस्या नहीं होगी, लेकिन डेल्फी के विशेष मामले में, मैं ऐसी तकनीक में पैसा (बहुत कम समय) निवेश नहीं करूंगा जो डेल्फी यूनिकोड के साथ काम करने के लिए सिद्ध नहीं है। –

+1

अगर यह स्रोत के साथ आया तो मैं इसे कुछ घंटों में आगे बढ़ा सकता था। लेकिन हाँ, तथ्य यह है कि वह केवल डेल्फी 7 को सूचीबद्ध करता है और उसमें से संगत के रूप में आपको बताता है, यह मर चुका है। इच्छा है कि वह इसे खोल देगा और मैं ठीक कर दूंगा उसके लिए यह –

2

कोई परीक्षण प्रारूप नहीं मिला है अभी तक एक राज्य मशीन पार्स नहीं करेगी। पेड़ में घोंसले चलाने के लिए रिकर्सन में जोड़ें। वे आसानी से लिखे गए अपेक्षाकृत त्वरित पार्सिंग इंजन हैं जिन्हें लगभग किसी भी पैटर्न वाली टेक्स्ट फ़ाइल के लिए बनाया जा सकता है। बूट करने के लिए एक स्क्रिप्टिंग भाषा का उपयोग करने से अक्सर आसान है। मेरे पास एचटीएमएल, एक्सएमएल, एचएल 7 और विभिन्न प्रकार के मेडिकल ईडीआई प्रारूपों के लिए लिखे गए कस्टम हैं।

+1

था वास्तव में ऐसा करने का एक अच्छा तरीका है। आपके पास एक पार्सिंग स्टेट ऑब्जेक्ट हो सकता है जिसमें एक राज्य मशीन फ़ंक्शन और स्टेट मशीन वैरिएबल, और "रिवाइंड", और "नेक्स्टसिंबोल: स्ट्रिंग", और ईओफ़: बूलियन जैसे विधियां हों। –