就像 AxelOmega 说的 - 你可以使用boost::spirit
. 语法很简单:
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_bool.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
template <class Iterator>
struct bool_grammar : qi::grammar<Iterator, bool(), qi::space_type> {
qi::rule<Iterator, bool(), qi::space_type> rGroup, rBool, rName, rOr, rAnd;
bool_grammar() : bool_grammar::base_type(rOr) {
rGroup = '(' >> rOr >> ')';
rBool = qi::bool_ | rGroup;
rAnd = rBool[qi::_val = qi::_1] >>
*('&' >> rBool[qi::_val = qi::_val && qi::_1]);
rOr = rAnd[qi::_val = qi::_1] >>
*('|' >> rAnd[qi::_val = qi::_val || qi::_1]);
}
};
您还需要一个函数来调用解析器并检查结果
bool parse(const std::string& value) {
bool_grammar<std::string::const_iterator> g;
std::string::const_iterator it = value.begin();
std::string::const_iterator end = value.end();
bool s;
if (qi::phrase_parse(it, end, g, qi::space, s) == false || it != end) {
// error
}
return s;
}
现在只需将其合并vector
为一个string
并使用 parse 函数:
parse("(true | false) & true | false") ;
如果您对bool
结果不感兴趣并且想要创建可操作的树,您还可以将综合属性更改为某个自定义类。