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;
}