我正在尝试sehe在这里提供的代码:Boolean expression (grammar) parser in c++

我想创建一个字符串变量max,它将存储每次解析时遇到的最大变量(例如,按字典顺序)。

我尝试过类似的事情:

  • var_ = qi::lexeme[ +alpha ] [_val = _1, if_(phx::ref(m) < _1) [phx::ref(m) = _1]];,但是(非常长)编译错误
  • var_ = qi::lexeme[ +alpha [_val = _1, if_(phx::ref(m) < _1) [phx::ref(m) = _1]]];,但是有了这个,我只得到了变量的第一个字符,这是重新构造的。

  • 我还尝试使用整数而不是字符串来简化变量,但是var_ = int_ [...]也不起作用,因为int_已经是解析器(我认为)。

    你有什么想法 ?

    提前致谢

    最佳答案

    我想说的是

    start = *word [ if_(_1>_val) [_val=_1] ];
    

    应该没事。但是,由于存在错误(?),单语句语义操作中的Phoenix语句无法编译。您可以使用no-op语句轻松解决该问题,例如_pass=true在这种情况下:
    start = *word [ if_(_1>_val) [_val=_1], _pass = true ];
    

    现在,为此,我假设
    rule<It, std::string()> word = +alpha;
    

    如果您坚持认为,可以将所有内容都塞进一条规则中:
    start = *as_string[lexeme[+alpha]] [ if_(_1>_val) [_val=_1], _pass = true ];
    

    我不建议那样。

    演示版

    Live On Colir
    #define BOOST_SPIRIT_USE_PHOENIX_V3
    #include <boost/spirit/include/qi.hpp>
    #include <boost/spirit/include/phoenix.hpp>
    
    namespace qi  = boost::spirit::qi;
    namespace phx = boost::phoenix;
    
    template <typename It, typename Skipper>
    struct max_parser : qi::grammar<It, std::string(), Skipper> {
        max_parser() : max_parser::base_type(start) {
            using namespace qi;
            using phx::if_;
    
    #if 1
            word  = lexeme [ +alpha ];
            start = *word [ if_(_1>_val) [_val=_1], _pass = true ];
    #else
            start = *as_string[lexeme[+alpha]] [ if_(_1>_val) [_val=_1], _pass = true ];
    #endif
        }
    
      private:
        qi::rule<It, std::string(), Skipper> start, word;
    };
    
    
    int main() {
    
        std::string const input("beauty shall be in ze eye of the beholder");
        using It = std::string::const_iterator;
        max_parser<It, qi::space_type> parser;
    
        std::string data;
        It it = input.begin(), end = input.end();
        bool ok = qi::phrase_parse(it, end, parser, qi::space, data);
    
        if (ok) {
            std::cout << "Parse success: " << data << "\n";
        } else {
            std::cout << "Parse failed\n";
        }
    
        if (it != end)
            std::cout << "Remaining unparsed: '" << std::string(it,end) << "'\n";
    }
    

    打印品:
    Parse success: ze
    

    08-16 12:06