more spirit madness - parser-types (rules vs int_parser<>) and meta-programming techniques

馋奶兔 提交于 2019-12-02 21:32:14

I'm not so sure I get the full extent of the question, but here are a few hints

  • The line commented with // THIS is what I need to do. compiles fine with me (problem solved? I'm guessing you actually meant assigning a parser, not a rule?)

  • Initialization of function-local static has been defined to be thread safe in the latest standard (C++11). Check your compiler support for C++0x threading. (If the initializer throws, a pass of the initialization statement will try to initialize again, by the way).

  • rules alias()

    As described in http://boost-spirit.com/home/articles/doc-addendum/faq/#aliases

    You can create 'logical copies' of rules without having to actually value-copy the proto expression. As the FAQ says, this is mainly to allow lazy-binding

  • The Nabialek Trick might be precisely what you need, basically it lazily selects a parser for subsequent parsing

    one = id;
    two = id >> ',' >> id;
    
    keyword.add
        ("one", &one)
        ("two", &two)
        ;
    
    start = *(keyword[_a = _1] >> lazy(*_a));
    

    In your context, I could see keyword defined as

    qi::symbols<char, qi::rule<Iterator>*> keyword;
    

    doing all the work with attributes from semantic actions. Alternatively,

    qi::symbols<char, qi::rule<Iterator, std::variant<std::string,int>() >*> keyword;
    
  • Bring the rules under the same type (like shown in the previous line, basically)

    This is the part where I'm getting confused: You say you want to unify your type system. There might not be a need for strongtyped parsers (distinct attribute signatures).

    typedef boost::variant<std::string,int> unified_type;
    typedef qi::rule<std::string::iterator, unified_type() > unified_rule;
    
    unified_rule rstring = +(qi::char_ - '.');
    unified_rule rint    = qi::int_;
    
    unified_rule combine = rstring | rint;
    
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!