जैसे, इनमें से कई अन्य प्रश्न, मैं Boost.Spirit.Qi का उपयोग करके structs के पेड़ में एक साधारण व्याकरण को पार्स करने की कोशिश कर रहा हूं।Boost.Spirit.Qi: नियम की विशेषता लें और इसे एक संलग्न नियम की संरचना विशेषता के क्षेत्र के रूप में सेट करें?
मैं सबसे आसान संभव मामले में जो करने की कोशिश कर रहा हूं उसे दूर करने की कोशिश करूंगा। मेरे पास है:
struct Integer {
int value;
};
BOOST_FUSION_ADAPT_STRUCT(Integer, (int, value))
बाद में, के अंदर एक व्याकरण struct की, मैं निम्नलिखित सदस्य चर है:
qi::rule<Iterator, Integer> integer;
जो मैं
integer = qi::int_;
साथ परिभाषित करने कर रहा हूँ मैं वास्तव में पार्स करने के लिए प्रयास करते हैं एक पूर्णांक, हालांकि,
qi::phrase_parse(iter, end, g, space, myInteger);
का उपयोग कर एक सफल पार्स के बाद
myInteger.value
हमेशा अनियमित किया जाता है।
integer = qi::int_[qi::_val = qi::_1]; //compiles, uninitialized value
integer = qi::int_[qi::_r1 = qi::_1]; //doesn't compile
integer = qi::int_[phoenix::bind(&Integer::value, qi::_val) = qi::_1]; //doesn't
integer = qi::int_[phoenix::at_c<0>(qi::_val) = qi::_1]; //doesn't
जाहिर है मैं आत्मा, फीनिक्स, या कुछ और के बारे में कुछ गलतफहमी हूँ: इसी तरह, मैं निम्नलिखित परिभाषा (जाहिर है जो कि संकलन नहीं है गलत कर रहे हैं) की कोशिश की है। मेरी समझ यह है कि qi::_1
qi::int_
की पहली विशेषता है, यहां, और पार्स किए गए पूर्णांक का प्रतिनिधित्व करना चाहिए, जब स्क्वायर ब्रैकेट में भाग फ़ंक्शन ऑब्जेक्ट के रूप में निष्पादित हो जाता है। मैं तब मान रहा हूं कि फ़ंक्शन ऑब्जेक्ट integer
विशेषता qi::_val
विशेषता लेगा और इसे पार्स किए गए पूर्णांक को आज़माएं और असाइन करें। मेरा अनुमान था कि मेरे BOOST_FUSION_ADAPT_STRUCT
कॉल के कारण, दोनों संगत होंगे, और यह निश्चित रूप से एक स्थिर विश्लेषण परिप्रेक्ष्य का मामला प्रतीत होता है, लेकिन डेटा संरक्षित नहीं किया जा रहा है।
क्या कोई संदर्भ है() पदनाम मुझे कहीं या कुछ याद आ रहा है?
qi::rule<Iterator, Integer()> integer;
(कोष्ठक ध्यान दें):
मैं सिर्फ एक और संयोजन है कि संकलित है, हालांकि यह initialized डेटा प्राप्त नहीं पाया , फिर मेरे 'पूर्णांक' पार्सर को' पूर्णांक = qi :: long_long [qi :: _ val = phx :: निर्माण (qi :: _ 1)]; ' –
jtolds
ओप्स के रूप में परिभाषित किया गया, मेरा मतलब है 'qi :: int_' – jtolds
अधिक डिबगिंग टिप्पणियाँ। मेरे पूर्ण कोड में, मेरे पास वास्तव में 'qi :: rule integer; 'है, जो ऐसा लगता है कि अगर मैं' इंटीजर 'को' इंटीजर() 'से बदलता हूं, और सभी उदाहरणों में यह टूट जाता है पीछे की ओर '() ', जिसे मैंने उपेक्षित किया था। तो शायद 'नियम' के लिए टेम्पलेट तर्क खराब हो रहे थे। खुदाई। –
jtolds