2011-01-24 8 views
6

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

वैसे भी, मैंने अपना प्रतीक टेबल और व्याकरण लिखा है, और यह खुशी से प्रारूपित डेटा को पार्स कर रहा है।

struct LatLongDegrees 
{ 
std::string dirLat_; 
double degLat_; 
std::string  dirLong_; 
double degLong_; 
} 

उदाहरण के लिए: { "उत्तर", 23.59, "पूर्व", -30.82}

यहाँ मेरी व्याकरण है:

basic =(latitude >> ' ' >> double_ >> ' ' >> longitude >> ' ' >> double_); 

कहाँ अक्षांश और देशांतर प्रतीक तालिकाओं से नक्शा हैं तार करने के लिए आशुलिपि कम्पास दिशाओं (उदाहरण के लिए "ई" के लिए "पूर्व")

तो, मेरे सवाल का पर:

मैं अपने व्याकरण, जहां अक्षांश और देशांतर प्रतीकों विपरीत स्थितियों में हैं करने के लिए निम्नलिखित नियम जोड़ना चाहते हैं:

reversed = (longitude >> ' ' >> double_ >> ' ' >> latitude >> double_) 

यह पार्स करता है, लेकिन degLat_ और degLong_ मान स्ट्रिंग मानों के साथ वापस नहीं लिया जाता है। स्ट्रिंग लेबल के संबंध में, उन्हें सीधे संरचना में सीधे पार्स किया जाता है।

कैसे मैं एक struct (संलयन वेक्टर या बढ़ावा देने ::) जब पार्स किया जा सकता डेटा अनुक्रमिक नहीं है बनाऊं?

उत्तर

6

आपके पास कई संभावनाएं हैं।

BOOST_FUSION_ADAPT_STRUCT(
    LatLongDegrees, 
    (std::string, dirLong_) 
    (double, degLong_) 
    (std::string, dirLat_) 
    (double, degLat_) 
); 

(हाँ, अनुकूलन के क्रम मूल struct में सदस्यों की क्रम मैच के लिए नहीं है, तुम भी बाहर छोड़ कर सकते हैं: सबसे आसान आवश्यक क्रम में एक फ्यूजन अनुक्रम में अपने struct अनुकूल करने के लिए है सदस्यों या उन्हें डुप्लिकेट)। यह ठीक काम करता है यदि आपके पास एक विशेष ऑर्डर है जिसमें आप अपने सदस्यों को पार्स करना चाहते हैं।

यदि आपको एक ही प्रोग्राम में अलग-अलग ऑर्डरिंग की आवश्यकता है, तो आप एक समान अनुकूलन तंत्र का उपयोग करना चाहेंगे, लेकिन इसके अतिरिक्त जो नाम देने की अनुमति देता है अनुकूलित struct:

BOOST_FUSION_ADAPT_STRUCT_NAME(
    LatLongDegrees, reversed_LatLongDegrees, 
    (std::string, dirLong_) 
    (double, degLong_) 
    (std::string, dirLat_) 
    (double, degLat_) 
); 

जहां reversed_LatLongDegrees अपने आत्मा व्याकरण में विशेषता के रूप में इस्तेमाल किया डेटा प्रकार है:

rule <Iterator, reversed_LatLongDegrees()> reversed; 
reversed = longitude >> ' ' >> double_ >> ' ' >> latitude >> double_; 

LatLongDegrees data; 
parse(begin, end, reversed, data); 

यह एक ही समय में एक ही struct के लिए कई रूपांतरों बनाने के लिए अनुमति देता है।