2012-06-20 5 views
1

Boost.Spirit으로 IRC 메시지 파서를 수행하고 있는데 구문 분석을 시도 할 때 매우 긴 오류가 발생합니다. 입력. "Roman Numerals"예를 따랐습니다. 또한 g++4.7-std=c++11을 사용하고 있습니다. 이 오류는 의 인스턴스를 만들 때가 아니라 test.cppphrase_parse()을 호출 할 때만 발생합니다.qi :: grammar에 boost :: spirit :: qi :: phrase_parse()를 사용할 때 오류가 발생했습니다.

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

그리고 오류 메시지 :

[email protected]: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 

답변

7

당신은 구조체로 message_grammar를 선언하는 대신한다 수업. 또한, 당신은 qi::grammar에서 공개적으로 클래스를 유도 할 수있다 : 당신이 article이 유용하게 사용할 수

class message_grammar : public qi::grammar<std::string::const_iterator, std::string()> 
{ 
} 

.

+0

감사합니다. 문제는 실제로 qi :: grammar에서 상속 된 기본 표시 여부 때문입니다. –

+0

이제 컴파일되지만 구문 분석시 "nick a #chann user"문자열로 간단한 테스트가 실패합니다. 이 문구처럼 보이는 문법을 볼 수 있습니다. 문제가 무엇인지 아십니까? –

관련 문제