मैं Boost.Spirit में एक शैल भाषा पार्सर लिखने की कोशिश कर रहा हूं। हालांकि, मैं rule
एस के अर्थशास्त्र के संबंध में कुछ बुनियादी मुद्दों के बारे में अस्पष्ट हूं।बूस्ट :: भावना के नियम <> की प्रतिलिपि या संदर्भ अर्थशास्त्र?
प्रलेखन को देखते हुए, r.alias()
और r.copy()
rule
के सदस्य हैं। IIUC, इन सदस्यों को नियम के संदर्भ और नियम की सामग्री की प्रतिलिपि क्रमशः वापस करनी चाहिए। हालांकि, यह स्पष्ट रूप से निर्दिष्ट नहीं किया गया है कि जब मैं किसी अन्य नियम की परिभाषा में नियम का उपयोग करता हूं तो क्या होता है। अपने प्रयोगों से, मैं परस्पर पाया पुनरावर्ती नियमों के द्वारा परिभाषित किया जा सकता है:
rule<Iter> r1, r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
जिससे पता चलता है नियम पार्सर भाव अंदर संदर्भ द्वारा लिया जाता है। समस्या यह है, क्या यह क्या करता है जब चर दायरे से बाहर चला जाता है, जैसे:
rule<Iter> r1;
{
rule<Iter> r2;
r1 = ... >> r2 >> ...;
r2 = ... >> r1 >> ...;
}
... // use r1
एक ही नोट पर, प्रकार नियम काम का एक rvalue (r.copy()
युक्त होगा एक पार्स अभिव्यक्ति से एक नियम को बताए हैं rule
प्रकार का एक रावल्यू भी है, है ना? जैसे।
rule<Iter> f() { return char_('a') << char_('b'); }
rule<Iter> r1 = ... << f();
किसी को भी मुझे rule
की प्रतियां और संदर्भ की विस्तृत अर्थ विज्ञान पर प्रबुद्ध कर सकते हैं, और संभवतः इस पोस्ट में किसी भी गलतफहमी को दूर?
इस उत्तर के लिए धन्यवाद। मेरे पास सिर्फ एक फॉलो अप प्रश्न है: क्या किसी भी प्रकार के पार्सर अभिव्यक्ति में पार्सर एक्सप्रेशन के रावलस (अस्थायी) का उपयोग करना संभव है जैसे कि 'r1 = r1 | एक फंक्शन में स्ट्रिंग ("एबीसी") 'या जनरेटिंग नियम? – jpalecek
अभिव्यक्ति 'आर 1 = आर 1 | स्ट्रिंग ("एबीसी") सैद्धांतिक रूप से संभव है कि यह एक बाएं रिकर्सन है, जिसके परिणामस्वरूप आत्मा एक अनंत पुनरावृत्ति होगी क्योंकि आत्मा रिकर्सिव वंश पार्सर्स उत्पन्न करती है। लेकिन अभिव्यक्ति 'आर 1 = स्ट्रिंग ("एबीसी") | आर 1 'उम्मीद के रूप में काम करेगा। यदि आप सुनिश्चित करते हैं कि यह किसी अन्य नियम का संदर्भ नहीं देता है, जो किसी दायरे से बाहर निकलता है तो आप किसी फ़ंक्शन में नियम उत्पन्न कर सकते हैं। इसके अलावा, Spirit.Classic में आपको फ़ंक्शन से r.copy() वापस करने की आवश्यकता है। – hkaiser
'आर 1 = स्ट्रिंग ("एबीसी") | आर 1 'बाएं-रिकर्सन भी है :) लेकिन मैं जो करना चाहता था, आर 1 मैच बना रहा है जो आर 1 पहले और "एबीसी" से मेल खाता था। बीटीडब्ल्यू मैं एक समारोह में एक नियम कैसे उत्पन्न कर सकता हूं? यह मेरे लिए काम नहीं करता है: http://pastebin.org/482764 – jpalecek