C++ 如何停止我的简单加法语法在Boost Spirit中提前终止?

C++ 如何停止我的简单加法语法在Boost Spirit中提前终止?,c++,boost-spirit,boost-spirit-qi,peg,C++,Boost Spirit,Boost Spirit Qi,Peg,我很难制作一个玩具语法来解析Boost Spirit中所需的加法工作 这是我的语法和代码: Syntax.h: #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; void test(); template

我很难制作一个玩具语法来解析Boost Spirit中所需的加法工作

这是我的语法和代码:

Syntax.h:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;

void test();

template <typename Iterator>
struct ExpressionGrammar : qi::grammar<Iterator, double(), ascii::space_type>
{
    qi::rule<Iterator, double(), ascii::space_type> expression;
    qi::rule<Iterator, double(), ascii::space_type> addsub;

    ExpressionGrammar()
    : ExpressionGrammar::base_type(expression)
    {
        using qi::lit;
        using qi::_val;
        using qi::_1;
        using qi::_2;

        addsub = (expression >> '+' >> expression)[_val = _1 + _2];
        expression = (qi::double_ | addsub);
    }
};
似乎
double\uu
消耗了
3
,然后没有规则可以只解析
+5
。但是,如果我将表达式规则更改为

expression = (addsub | qi::double_);
然后我的程序进入无限递归


解决这个问题的办法是什么?我知道在示例中,更常见的是使用Kleene星来处理二进制组合的任意列表(沿着
expression*('+'>>expression)
)。这是使用解析表达式语法的必要条件吗?如果是,请解释原因。

Boost Spirit是一个递归下降解析器,不能解析包含左递归的语法。看看如何重写左递归产品。spirit中可能的解决方案包括使用Kleene星形表达式或列表运算符(
%

Success. result: 3. Still to parse: + 5
expression = (addsub | qi::double_);