我正在尝试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