我是第一次使用精神。我正在尝试编写一个布尔表达式(只有 &、| 和 ! 运算符)解析器。我已经定义了我的语法,如下所示:
template <typename Iterator>
struct boolean_expression_parser : qi::grammar<Iterator, std::string(), ascii::space_type>
{
boolean_expression_parser() : boolean_expression_parser::base_type(expr)
{
using namespace qi;
using ascii::char_;
using boost::spirit::ascii::alnum;
using namespace qi::labels;
using phoenix::construct;
using phoenix::val;
operand %= lexeme[+(alnum)];
simple_expr %= ('(' > expr > ')') | operand;
unary_expr %= ('!' > simple_expr ) ;
and_expr %= ( expr > '*' > expr);
or_expr %= (expr > '|' > expr);
expr %= simple_expr | unary_expr | *and_expr | *or_expr;
// on_error<fail>
// (
// unary_expr,
// std::cout
// << val("Error! Expecting ")
// << _4 // what failed?
// << val(" here: \"")
// << construct<std::string>(_3, _2) // iterators to error-pos, end
// << val("\"")
// << std::endl
// );
}
qi::rule<Iterator, std::string(), ascii::space_type> operand;
qi::rule<Iterator, std::string(), ascii::space_type> simple_expr;
qi::rule<Iterator, std::string(), ascii::space_type> unary_expr;
qi::rule<Iterator, std::string(), ascii::space_type> and_expr;
qi::rule<Iterator, std::string(), ascii::space_type> or_expr;
qi::rule<Iterator, std::string(), ascii::space_type> expr;
};
我在这里面临一些障碍:
- 它不适用于任何二进制表达式(如'A + B')。它适用于一元表达式(如“!(A)”或“(!A)”。
有人可以指出我做错了什么吗?
我想以树的形式存储它(因为我想用它构建一个 BDD)。有人可以指出我该怎么做吗?
另外,为什么 on_error<> 即使我启用它也不起作用?
我正在使用 boost 1.49 和 gcc-4.2.2。
问候,〜搜门