将 boost::spirit::qi::p hrase_parse() 与 qi::grammar 一起使用时出错
Error when using boost::spirit::qi::phrase_parse() with a qi::grammar
我正在使用Boost.Spirit
做一个IRC消息解析器,但是当我尝试解析输入时,我遇到了一个(很长的)错误。我遵循了"罗马数字"的例子。另外,我正在使用g++4.7
与-std=c++11
.该错误仅在我在test.cpp
上调用phrase_parse()
时发生,而不是在我创建message_grammar
实例时发生。
语法类是:
class message_grammar : qi::grammar<std::string::const_iterator, std::string()>
{
public:
message_grammar() : base_type(m_message)
{
using qi::_val;
using qi::_1;
using boost::spirit::ascii::char_;
using qi::lit;
qi::rule<std::string::const_iterator, std::string()> alpha, graph, number, special, user,
nick, chn, channel;
alpha = qi::as_string[qi::alpha];
graph = qi::as_string[qi::graph];
number = qi::as_string[char_('0', '9')];
chn = qi::as_string[(char_('#') | char_('$'))];
special = qi::as_string[
char_('-') | char_('[') | char_(']') | char_('')
| char_('`') | char_('^') | char_('{') | char_('}')
];
user = (
graph [_val = std::string("USER%% ") + _1]
>> *graph[_val += _1]
);
nick = (
alpha[_val = std::string("NICK%% ") + _1]
>>
*(
alpha
| number
| special
)[_val += _1]
);
channel = (
chn [_val = std::string("CHAN%% ") + _1]
>> +(alpha | number | special) [_val += _1]
);
m_message = (
nick [_val = _1]
>> alpha [_val += std::string(" ") + _1]
>> channel [_val += std::string(" ") + _1]
>> user [_val += std::string(" ") + _1]
);
}
qi::rule<std::string::const_iterator, std::string()> m_message;
};
测试功能为:
int main()
{
string str, parsed_str;
getline(cin, str);
irc::message_grammar grammar;
auto it = str.begin();
auto end = str.end();
bool ok = qi::phrase_parse(it, end,
grammar
, qi::space, parsed_str);
if (ok && it == end) {
cout << "OK" << endl;
cout << parsed_str << endl;
}
else {
cout << "NO " << ok << endl;
}
}
和错误消息:
murilo@mac:cleverbot$ g++-mp-4.7 -std=c++11 test.cpp -Wall
In file included from /opt/local/include/boost/proto/core.hpp:23:0,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/domain.hpp: In instantiation of 'struct boost::proto::domainns_::domain<>::as_expr<irc::message_grammar>':
/opt/local/include/boost/proto/traits.hpp:266:71: required from 'struct boost::proto::result_of::as_expr<irc::message_grammar, boost::proto::domainns_::default_domain>'
/opt/local/include/boost/spirit/home/support/meta_compiler.hpp:221:16: required from 'struct boost::spirit::traits::matches<boost::spirit::qi::domain, irc::message_grammar>'
/opt/local/include/boost/spirit/home/qi/parse.hpp:155:9: required from 'bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, boost::spirit::qi::skip_flag, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Expr = irc::message_grammar; Skipper = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l>; Attr = std::basic_string<char>]'
/opt/local/include/boost/spirit/home/qi/parse.hpp:197:86: required from 'bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Expr = irc::message_grammar; Skipper = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l>; Attr = std::basic_string<char>]'
test.cpp:20:25: required from here
/opt/local/include/boost/proto/extends.hpp:551:13: error: 'typedef void boost::proto::exprns_::extends<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, 0l>, boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()>, boost::proto::domainns_::default_domain, 0l>::proto_is_expr_' is inaccessible
In file included from /opt/local/include/boost/proto/traits.hpp:32:0,
from /opt/local/include/boost/proto/expr.hpp:27,
from /opt/local/include/boost/proto/core.hpp:17,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/domain.hpp:141:13: error: within this context
In file included from /opt/local/include/boost/proto/core.hpp:23:0,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/extends.hpp:551:13: error: 'typedef void boost::proto::exprns_::extends<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, 0l>, boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()>, boost::proto::domainns_::default_domain, 0l>::proto_is_expr_' is inaccessible
In file included from /opt/local/include/boost/proto/traits.hpp:32:0,
from /opt/local/include/boost/proto/expr.hpp:27,
from /opt/local/include/boost/proto/core.hpp:17,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/domain.hpp:141:13: error: within this context
In file included from /opt/local/include/boost/proto/core.hpp:23:0,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/extends.hpp:551:13: error: 'typedef void boost::proto::exprns_::extends<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, 0l>, boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()>, boost::proto::domainns_::default_domain, 0l>::proto_is_expr_' is inaccessible
In file included from /opt/local/include/boost/proto/traits.hpp:32:0,
from /opt/local/include/boost/proto/expr.hpp:27,
from /opt/local/include/boost/proto/core.hpp:17,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/domain.hpp:142:17: error: within this context
In file included from /opt/local/include/boost/proto/core.hpp:23:0,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/extends.hpp:551:13: error: 'typedef void boost::proto::exprns_::extends<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, 0l>, boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()>, boost::proto::domainns_::default_domain, 0l>::proto_is_expr_' is inaccessible
In file included from /opt/local/include/boost/proto/traits.hpp:32:0,
from /opt/local/include/boost/proto/expr.hpp:27,
from /opt/local/include/boost/proto/core.hpp:17,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/domain.hpp:143:56: error: within this context
In file included from /opt/local/include/boost/proto/core.hpp:23:0,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/extends.hpp:551:13: error: 'typedef void boost::proto::exprns_::extends<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, 0l>, boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()>, boost::proto::domainns_::default_domain, 0l>::proto_is_expr_' is inaccessible
In file included from /opt/local/include/boost/proto/traits.hpp:32:0,
from /opt/local/include/boost/proto/expr.hpp:27,
from /opt/local/include/boost/proto/core.hpp:17,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/domain.hpp:146:29: error: within this context
In file included from /opt/local/include/boost/proto/core.hpp:23:0,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/extends.hpp:551:13: error: 'typedef void boost::proto::exprns_::extends<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, 0l>, boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()>, boost::proto::domainns_::default_domain, 0l>::proto_is_expr_' is inaccessible
In file included from /opt/local/include/boost/proto/traits.hpp:32:0,
from /opt/local/include/boost/proto/expr.hpp:27,
from /opt/local/include/boost/proto/core.hpp:17,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/domain.hpp:146:29: error: within this context
In file included from /opt/local/include/boost/proto/core.hpp:23:0,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/extends.hpp:551:13: error: 'typedef void boost::proto::exprns_::extends<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, 0l>, boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()>, boost::proto::domainns_::default_domain, 0l>::proto_is_expr_' is inaccessible
In file included from /opt/local/include/boost/proto/traits.hpp:32:0,
from /opt/local/include/boost/proto/expr.hpp:27,
from /opt/local/include/boost/proto/core.hpp:17,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/domain.hpp:146:46: error: within this context
In file included from /opt/local/include/boost/proto/core.hpp:23:0,
from /opt/local/include/boost/proto/proto.hpp:12,
from /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19,
from /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi/action.hpp:14,
from /opt/local/include/boost/spirit/home/qi.hpp:14,
from /opt/local/include/boost/spirit/include/qi.hpp:16,
from ircparser.h:6,
from test.cpp:1:
/opt/local/include/boost/proto/matches.hpp: In instantiation of 'struct boost::proto::matches<irc::message_grammar, boost::spirit::meta_compiler<boost::spirit::qi::domain>::meta_grammar>':
/opt/local/include/boost/spirit/home/support/meta_compiler.hpp:221:16: required from 'struct boost::spirit::traits::matches<boost::spirit::qi::domain, irc::message_grammar>'
/opt/local/include/boost/spirit/home/qi/parse.hpp:155:9: required from 'bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, boost::spirit::qi::skip_flag, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Expr = irc::message_grammar; Skipper = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l>; Attr = std::basic_string<char>]'
/opt/local/include/boost/spirit/home/qi/parse.hpp:197:86: required from 'bool boost::spirit::qi::phrase_parse(Iterator&, Iterator, const Expr&, const Skipper&, Attr&) [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; Expr = irc::message_grammar; Skipper = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l>; Attr = std::basic_string<char>]'
test.cpp:20:25: required from here
/opt/local/include/boost/proto/extends.hpp:551:13: error: 'typedef struct boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()> boost::proto::exprns_::extends<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::qi::reference<const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, 0l>, boost::spirit::qi::grammar<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>()>, boost::proto::domainns_::default_domain, 0l>::proto_derived_expr' is inaccessible
您应该将message_grammar
声明为结构而不是类。此外,您可以从以下qi::grammar
公开派生您的类:
class message_grammar : public qi::grammar<std::string::const_iterator, std::string()>
{
}
您可能还会发现本文很有用。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- boost :: Spirit :: Qi-与语法结构中的实例成员一起工作
- 将 boost::spirit::qi::p hrase_parse() 与 qi::grammar 一起使用时出错
- 如何将多态属性与boost::spirit::qi解析器一起使用