मैं वीसीडी (वैल्यू चेंज डंप) फ़ाइलों को पार्स करने के लिए पाइपर्सिंग का उपयोग कर रहा हूं। अनिवार्य रूप से, मैं फ़ाइलों में पढ़ना चाहता हूं, इसे एक आंतरिक शब्दकोश में पार्स करना चाहता हूं, और मानों में हेरफेर करना चाहता हूं।पाइपर्सिंग, फॉरवर्ड, और रिकर्सन
संरचना पर विवरण में जाने के बिना, मेरी समस्या नेस्टेड श्रेणियों की पहचान करने के साथ होता है।
वीसीडी फ़ाइलों में, आप 'स्कोप' जो तारों और संभवतः कुछ गहरी (नेस्टेड) शामिल है scopes। उनके स्तर के बारे में सोचो।
मेरी फाइल मेंतो, मेरे पास है:
$scope module toplevel $end
$scope module midlevel $end
$var wire a $end
$var wire b $end
$upscope $end
$var wire c $end
$var wire d $end
$var wire e $end
$scope module extralevel $end
$var wire f $end
$var wire g $end
$upscope $end
$var wire h $end
$var wire i $end
$upscope $end
तो 'उच्चस्तरीय' सब कुछ शामिल हैं (एक - मैं), 'midlevel' है (a - b), 'extralevel' है (च - छ)
scope_header = Group(Literal('$scope') + Word(alphas) + Word(alphas) + \
Literal('$end'))
wire_map = Group(Literal('$var') + Literal('wire') + Word(alphas) + \
Literal('$end'))
scope_footer = Group(Literal('$upscope') + Literal('$end'))
scope = Forward()
scope << (scope_header + ZeroOrMore(wire_map) + ZeroOrMore(scope) + \
ZeroOrMore(wire_map) + scope_footer)
अब, मैं क्या सोचा होता है कि के रूप में यह प्रत्येक गुंजाइश मारता है, यह प्रत्येक स्तर का ट्रैक रखने होता है:, आदि
यहाँ इस खंड पार्स करने के लिए मेरे कोड (स्निपेट) है ' और मैं नेस्टेड स्कॉप्स वाली संरचना के साथ समाप्त हो जाऊंगा। हालांकि, यह
$scope module extralevel $end
पर बाहर त्रुटियों और कहा कि यह उम्मीद '$ upscope'।
तो मैं जानता हूँ कि मैं सही ढंग से प्रत्यावर्तन का उपयोग नहीं कर रहा हूँ। क्या कोई मेरी मदद कर सकता है? अगर मुझे और जानकारी प्रदान करने की ज़रूरत है तो मुझे बताएं।
धन्यवाद !!!!
अच्छा अंतर्ज्ञान! पाइपर्सिंग वास्तव में "या" का समर्थन करता है, और सटीक वाक्यविन्यास के साथ आपने अनुमान लगाया है। – PaulMcG
वाह, इतना आसान !!! यह एक सम्मोहन की तरह काम करता है!!!!! बहुत बहुत धन्यवाद! – RaytheonLiszt
यह हमेशा अच्छा होता है जब आप इसे देखने के बिना वाक्यविन्यास का अनुमान लगा सकते हैं। अधिभार आपको $$ में काट सकता है, बूस्ट स्पिरिट (सी ++ के लिए पाइपरसे के बराबर) का उपयोग करके प्रोग्राम को डीबग करने का प्रयास करें। यह सी ++ डीबग करने का मजाक है, लेकिन हर विधि कॉल बीस ओवरलोडेड ऑपरेटर गहरे हैं। –