2016-07-05 8 views
8

इस कोड नहीं compiles (जीसीसी 5.3.1 + को बढ़ावा देने के 1.60) करता है:आत्मा X3, अर्थ कार्रवाई संकलन में विफल रहता है के साथ बनाता है: गुण नहीं है उम्मीद आकार

#include <boost/spirit/home/x3.hpp> 

namespace x3 = boost::spirit::x3; 

template <typename T> 
void parse(T begin, T end) { 
    auto dest = x3::lit('[') >> x3::int_ >> ';' >> x3::int_ >> ']'; 

    auto on_portal = [&](auto& ctx) {}; 
    auto portal = (x3::char_('P') >> -dest)[on_portal]; 

    auto tiles = +portal; 
    x3::phrase_parse(begin, end, tiles, x3::eol); 
} 

int main() { 
    std::string x; 
    parse(x.begin(), x.end()); 
} 

यह एक स्थिर दावे से विफल रहता है:

error: static assertion failed: Attribute does not have the expected size. 

वंडबॉक्स के लिए धन्यवाद मैंने 1.61 और क्लैंग को भी बढ़ावा देने का प्रयास किया, दोनों एक ही परिणाम उत्पन्न करते हैं।

यदि मैं portal से जुड़ी अर्थपूर्ण कार्रवाई को हटा देता हूं, तो यह ठीक संकलित करता है;

auto dest = x3::lit('[') >> x3::int_ >> ']'; 

किसी भी मदद की सराहना की जाएगी: एक ही अगर मैं dest करने के लिए बदल होता है। TIA।

+1

यह प्रजनन उत्कृष्ट है। मुझे प्यार है जब लोग इस समस्या को संक्षेप में संकुचित करते हैं। +10 अगर मैं – sehe

उत्तर

4

यह भी मेरे लिए आश्चर्यजनक है, मैं इसे संभावित बग के रूप में मेलिंग सूची (या बग ट्रैकर) पर रिपोर्ट करता हूं।

इस बीच, आप इसे एक विशेषता प्रकार की आपूर्ति करके "ठीक" कर सकते हैं dest के लिए:

Live On Coliru

#include <boost/fusion/adapted/std_tuple.hpp> 
#include <boost/spirit/home/x3.hpp> 
#include <iostream> 

namespace x3 = boost::spirit::x3; 

template <typename T> 
void parse(T begin, T end) { 
    auto dest = x3::rule<struct dest_type, std::tuple<int, int> > {} = '[' >> x3::int_ >> ';' >> x3::int_ >> ']'; 

    auto on_portal = [&](auto& ctx) { 
     int a, b; 
     if (auto tup = x3::_attr(ctx)) { 
      std::tie(a, b) = *tup; 
      std::cout << "Parsed [" << a << ", " << b << "]\n"; 
     } 
    }; 
    auto portal = ('P' >> -dest)[on_portal]; 

    auto tiles = +portal; 
    x3::phrase_parse(begin, end, tiles, x3::eol); 
} 

int main() { 
    std::string x = "P[1;2]P[3;4]P[5;6]"; 
    parse(x.begin(), x.end()); 
} 

प्रिंटों:

Parsed [1, 2] 
Parsed [3, 4] 
Parsed [5, 6] 

नोट मैंने char_('P') को lit('P') में बदल दिया क्योंकि मैं विशेषता में चरित्र से निपटने वाले नमूना को जटिल नहीं करना चाहता था। शायद आप इसका मतलब किसी भी तरह से उजागर विशेषता में नहीं लेना चाहते थे।

+0

कामकाज के लिए धन्यवाद! – dvd

+0

क्या हर बार 'पार्स()' कहा जा रहा है, तो व्याकरण चर (जैसे 'टाइल्स') स्थापित करने का कोई उपर है? क्या बेहतर होगा (शायद 'स्थिर') सदस्यों के साथ 'वर्ग पार्स' होना बेहतर है जिसे एक बार इनटाइलाइज्ड किया जा सकता है और फिर उन्हें एकाधिक कॉल पर पुन: उपयोग किया जा सकता है? यह आपके स्वयं के पार्सर्स को हेडर-केवल कोड में प्रदान करना आसान बनाता है। – TemplateRex

+0

मुझे लगता है कि अधिकांश कोड में यह महत्वपूर्ण नहीं है, क्योंकि सब कुछ रेखांकित किया जा सकता है। 'टाइल्स 'शायद कभी भी मौजूद नहीं होगा। यदि आप क्लाइंट-सप्लाई किए गए पार्सर्स का उपयोग करना चाहते हैं, तो आप - परिभाषा के अनुसार - इच्छा प्रकार मिटाएं। यह 'x3 :: any_parser' क्षेत्र IYAM है। यदि आप केवल तर्कसंगत रूप से समूह नियम बनाना चाहते हैं (प्रारंभिक बिंदु के अलावा सबकुछ छुपाएं) तो मैं इसे केवल एक फ़ंक्शन से वापस कर दूंगा। X3 के साथ कोई समस्या नहीं है, क्यूई – sehe

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