c++ जनक क्या किसी अन्य व्याकरण परिभाषा में boost:: spirit:: qi व्याकरण का पुन: उपयोग करना संभव है?



हिन्दी व्याकरण की परिभाषा (1)

निःसंदेह तुमसे हो सकता है। अपने मामले में, बस address_grammar<iter> address_; डालें address_grammar<iter> address_; आपके कोड में

मुझे आपको एक और उदाहरण दिखाएं। आप यहां एक संकलित कोड पा सकते हैं: http://ideone.com/GW4jO (नीचे भी देखें)

AFAIK, qi :: व्याकरण के विपरीत, qi :: नियम का पुन: उपयोग करना मुश्किल है।

पूर्ण नमूना

#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

struct Date {
    int year, month, day;
};
struct Time {
    int hour, minute, second;
};

BOOST_FUSION_ADAPT_STRUCT(
    Date,
    (int, year)
    (int, month)
    (int, day)
)

BOOST_FUSION_ADAPT_STRUCT(
    Time,
    (int, hour)
    (int, minute)
    (int, second)
)

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
typedef std::string::const_iterator Iterator;

class DateParser:
    public qi::grammar < Iterator, Date() > {
        qi::rule < Iterator, Date() > main;
    public:
        DateParser(): base_type(main) {
            main %= qi::int_ >> '-' >> // Year
                    qi::int_ >> '-' >> // Month
                    qi::int_;          // Day
        }
};

class TimeParser:
    public qi::grammar < Iterator, Time() > {
        qi::rule < Iterator, Time() > main;
    public:
        TimeParser(): base_type(main) {
            main %= qi::int_ >> ':' >> // Hour
                    qi::int_ >> ':' >> // Minute
                    qi::int_;          // Second
        }
};

class DateTimeParser:
    public qi::grammar < Iterator, boost::variant<Date, Time>() > {
        qi::rule < Iterator, boost::variant<Date, Time>()> main;
    public:
        DateTimeParser(): base_type(main) {
            main %= date_parser | time_parser;
        }
        DateParser date_parser;
        TimeParser time_parser;
};

#include<iostream>
#include<cstdio>

struct Printer : public boost::static_visitor<> {
    void operator()(Date a) const {
        printf("Year: %d, Month: %d, Day: %d\n", a.year, a.month, a.day);
    }
    void operator()(Time a) const {
        printf("Hour: %d, Minute: %d, Second: %d\n", a.hour, a.minute, a.second);
    }
};

int main() {
    std::string s;
    std::getline(std::cin, s);
    Iterator beg = s.begin(), end = s.end();
    boost::variant<Date, Time> ret;
    phrase_parse(beg, end, DateTimeParser(), ascii::space, ret);
    if (beg != end)
        puts("Parse failed.");
    else
        boost::apply_visitor(Printer(), ret);
}

क्या boost::spirit:qi का पुन: उपयोग करना संभव है boost::spirit:qi व्याकरण किसी अन्य व्याकरण में (उदाहरण के लिए नियम के रूप में)?

उदाहरण के लिए यदि मैं सड़क के पते वाले ढांचे में पाठ की रेखा को पार्स करने के लिए व्याकरण परिभाषित करता हूं।

   template< typename iter >
        struct address_grammar : qi::grammar< iter, address() >
   {
     ...

       qi::rule< iter, std::string() > street_name;
       qi::rule< iter, std::string() > street_number;
       qi::rule< iter, address() > address_;
   }

मैं उस व्याकरण को दो अन्य व्याकरणों में पुन: उपयोग करना चाहूंगा, उदाहरण के लिए कोई फ़ाइल में संग्रहीत पते के वेक्टर के पार्सिंग के लिए हो सकता है। एक और पुन: उपयोग अधिक जटिल संरचना में हो सकता है जहां खेतों में से एक यह सड़क पता संरचना है।

  template< typename iter >
      struct company_grammar : qi::grammar< iter, company() >
  {
     ...
     qi::rule< iter, std::string() > comp_name;
     // can I reuse the address grammar somehow here ???
     qi::rule< iter, company() > company;
  }

पूरे व्याकरण को एक स्थान पर परिभाषित करने के बजाय मैं इसे छोटे पुन: प्रयोज्य ब्लॉक में विभाजित करने के बारे में सोच रहा हूं, यह ठीक है अगर वे एक हेडर फ़ाइल के अंदर हैं। मेरी डेटा संरचनाएं थोड़ा अधिक जटिल हैं (अन्य संरचनाओं की सूची के साथ संरचना के अंदर फ़ील्ड और इतने पर) इसलिए मैं इसे एक व्याकरण में नहीं रखना चाहता हूं।

क्या इस तरह से boost::spirit::qi व्याकरण का पुन: उपयोग करना संभव है?

संपादित करें: इसके बारे में सोचते हुए, क्या मैं सिर्फ नामस्थान में qi::rule s को परिभाषित करता हूं और फिर नियमों से व्याकरण को एक साथ रखता हूं?





boost-spirit-qi