【发布时间】:2012-01-17 21:29:10
【问题描述】:
我的 boost::spirit 解析器还有另一个问题。
template<typename Iterator>
struct expression: qi::grammar<Iterator, ast::expression(), ascii::space_type> {
expression() :
expression::base_type(expr) {
number %= lexeme[double_];
varname %= lexeme[alpha >> *(alnum | '_')];
binop = (expr >> '+' >> expr)[_val = construct<ast::binary_op<ast::add>>(_1,_2)]
| (expr >> '-' >> expr)[_val = construct<ast::binary_op<ast::sub>>(_1,_2)]
| (expr >> '*' >> expr)[_val = construct<ast::binary_op<ast::mul>>(_1,_2)]
| (expr >> '/' >> expr)[_val = construct<ast::binary_op<ast::div>>(_1,_2)] ;
expr %= number | varname | binop;
}
qi::rule<Iterator, ast::expression(), ascii::space_type> expr;
qi::rule<Iterator, ast::expression(), ascii::space_type> binop;
qi::rule<Iterator, std::string(), ascii::space_type> varname;
qi::rule<Iterator, double(), ascii::space_type> number;
};
这是我的解析器。它解析了"3.1415" 和"var" 就好了,但是当我尝试解析"1+2" 它告诉我parse failed。然后我尝试将binop 规则更改为
binop = expr >>
(('+' >> expr)[_val = construct<ast::binary_op<ast::add>>(_1, _2)]
| ('-' >> expr)[_val = construct<ast::binary_op<ast::sub>>(_1, _2)]
| ('*' >> expr)[_val = construct<ast::binary_op<ast::mul>>(_1, _2)]
| ('/' >> expr)[_val = construct<ast::binary_op<ast::div>>(_1, _2)]);
但是现在它当然不能构建 AST,因为 _1 和 _2 的设置不同。我只看到提到过_r1 之类的东西,但作为一个新手,我不太能理解boost::phoenix 和boost::spirit 是如何交互的。
如何解决?
【问题讨论】:
-
也很有趣:gamedev.net/topic/…
标签: c++ boost-spirit boost-phoenix