C++ 使用简单的Boost::Spirit语法?

C++ 使用简单的Boost::Spirit语法?,c++,boost-spirit-qi,C++,Boost Spirit Qi,我无法使用语法,所以我简化了它,直到它只解析一个整数。还是无法让它工作。语法如下: template<typename Iterator> struct rangeGrammar : qi::grammar<Iterator, int()> { rangeGrammar() : rangeGrammar::base_type(number) { using qi::int_; using qi::_1;

我无法使用语法,所以我简化了它,直到它只解析一个整数。还是无法让它工作。语法如下:

template<typename Iterator>
struct rangeGrammar : qi::grammar<Iterator, int()>
{
    rangeGrammar() :
    rangeGrammar::base_type(number)
    {
        using qi::int_;
        using qi::_1;
        using qi::_val;

        number = int_[_val = _1];
    }
    qi::rule<Iterator, int()> number;
};
模板
结构范围语法:qi::grammar
{
范围语法():
rangeGrammar::基本类型(数字)
{
使用qi::int_;
使用气::_1;
使用qi:(u val);
数字=整数[_val=_1];
}
qi:规则编号;
};
它应该只解析一个整数(我知道我可以告诉parse函数使用int_u作为语法,但我不想知道这个示例中的错误是什么)

我的解析函数是:

/* n is a std::string provided by the user */
rangeGrammar<std::string::const_iterator> grammar;
int num = 0;
qi::phrase_parse(n.start(), n.end(), grammar, num);
std::cout << "Number: " << num << std::endl;
/*n是用户提供的std::字符串*/
范围语法;
int num=0;
短语解析(n.start(),n.end(),语法,num);
标准::cout]':
/boost/spirit/home/qi/parse.hpp:89:82:从“bool boost::spirit::qi::parse(迭代器&,迭代器,常量Expr&,Attr&)[带迭代器=\uu gnu\u cxx::\uu normal\u Iterator>,Expr=rangeGrammar>,Attr=int]
../parameter_parser.h:95:46:从此处实例化
boost/spirit/home/qi/reference.hpp:43:71:错误:调用“boost::spirit::qi::rule,int(),boost::spirit::unused_type,boost::spirit::unused_type,boost::spirit::unused_type>::parse(uuu gnu_cxx::uu normal_iterator>&,const_uugnu_cxx::u normal_iterator>&,boost::spirit::context,boost::spirit::locals>&,const boost::spirit::unused\u type&,int&)const'
cc1plus:警告被视为错误
/boost/spirit/home/qi/reference.hpp:44:9:错误:控制到达非无效功能的末尾
*退出状态1*


无法找出问题所在。如果您能提供任何帮助,我们将不胜感激。

A:语法没有什么问题,但您使用的是
qi::phrase\u parse
,这需要一个跳过程序。使用
qi::parse
,问题就会消失

注意1:使用
[\u val=\u 1]
在那里是完全多余的;没有语义属性的规则可以自动传播属性

注意2:您可能希望使用qi::match进行如下解析:

#include <boost/spirit/include/qi_match.hpp>

const std::string input = "1234";
std::istringstream iss(input);
iss >> qi::match(qi::int_ [ std::cout << qi::_1 ]);
#包括
const std::string input=“1234”;
std::istringstream iss(输入);

iss>>qi::match(qi::int_uuu[std::cout lol@“simple Boost::spirit语法”正如您所发现的,没有简单的Boost spirit语法。请改用ANTLR。我与Boost“团队”中的一位好心人交谈过前几天在IRC上,他问为什么Spirit的文档覆盖率如此之低。他惊呼说,它实际上有很好的文档记录…+1供ANTLR使用。@Kivin你对Spirit文档有什么不满?它有很好的文档记录。作为一个eDSL,它不简单,诊断也不简单。如果不是为你,就不是为你。但我高度怀疑t文档将成为决定性因素?感谢您的回复!您是对的,parse_phrase()必须包含一个skipper,我不知道。我将代码改为使用parse(),但相同的错误仍然存在。如果您阅读第一个错误,它会说:“错误:调用'boost::spirit::qi::rule'时没有匹配的函数,最终解决了这个问题。错误是我在字符串上使用了迭代器,而不是常量字符串……我觉得自己很笨。你的代码让我意识到了这一点,再次感谢你的回复!”!
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace qi    = boost::spirit::qi;
namespace phx   = boost::phoenix;

template<typename Iterator>
struct rangeGrammar : qi::grammar<Iterator, int()>
{
    rangeGrammar() : rangeGrammar::base_type(number)
    {
        number = qi::int_;
    }
    qi::rule<Iterator, int()> number;
};

bool doParse(const std::string& input)
{
    typedef std::string::const_iterator It;
    It f(begin(input)), l(end(input));

    try
    {
        rangeGrammar<It> p;
        int data;

        bool ok = qi::parse(f,l,p,data);
        if (ok)   
        {
            std::cout << "parse success\n";
            std::cout << "data: " << data << "\n";
        }
        else      std::cerr << "parse failed: '" << std::string(f,l) << "'\n";

        if (f!=l) std::cerr << "trailing unparsed: '" << std::string(f,l) << "'\n";
        return ok;
    } catch(const qi::expectation_failure<It>& e)
    {
        std::string frag(e.first, e.last);
        std::cerr << e.what() << "'" << frag << "'\n";
    }

    return false;
}

int main()
{
    bool ok = doParse("1234");
    return ok? 0 : 255;
}