2012-10-21 48 views
4

我试图使用no_skip指令解析表单的输入:我如何神交提振精神编译器错误

state PASS 
<tab> state FAIL 

我使用ascii::blank作为我的队长。当我换no_skip[ trans_assign_expr ]解析的标签,我得到一个编译错误。

如何解决这个错误,而在一般情况下,我怎么知道这些错误,这样我可以解决未来的呢?升压精神文档从来没有讨论如何使用精神:(

这是错误

 
In file included from /usr/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:0, 
       from /usr/include/boost/spirit/include/qi_grammar.hpp:16, 
       from ../src/RJstate.cpp:9: 
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp: In member function ‘bool boost::spirit::qi::rule::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Context = boost::spirit::context, boost::fusion::vector0 >, Skipper = boost::spirit::qi::detail::unused_skipper > >, Attribute = const boost::spirit::unused_type, Iterator = __gnu_cxx::__normal_iterator >, T1 = boost::proto::exprns_::expr >, 0l>, T2 = boost::spirit::unused_type, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type]’: 
/usr/include/boost/spirit/home/qi/reference.hpp:43:71: instantiated from ‘bool boost::spirit::qi::reference::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator >, Context = boost::spirit::context, boost::fusion::vector0 >, Skipper = boost::spirit::qi::detail::unused_skipper > >, Attribute = const boost::spirit::unused_type, Subject = const boost::spirit::qi::rule >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>]’ 
/usr/include/boost/spirit/home/qi/directive/no_skip.hpp:64:63: instantiated from ‘bool boost::spirit::qi::no_skip_directive::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator >, Context = boost::spirit::context, boost::fusion::vector0 >, Skipper = boost::spirit::qi::char_class >, Attribute = const boost::spirit::unused_type, Subject = boost::spirit::qi::reference >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> >]’ 
/usr/include/boost/spirit/home/qi/detail/fail_function.hpp:45:74: instantiated from ‘bool boost::spirit::qi::detail::fail_function::operator()(const Component&) const [with Component = boost::spirit::qi::no_skip_directive >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, Iterator = __gnu_cxx::__normal_iterator >, Context = boost::spirit::context, boost::fusion::vector0 >, Skipper = boost::spirit::qi::char_class >]’ 
/usr/include/boost/fusion/algorithm/query/detail/any.hpp:42:83: [ skipping 8 instantiation contexts ] 
/usr/include/boost/function/function_template.hpp:132:42: instantiated from ‘static R boost::detail::function::function_obj_invoker4::invoke(boost::detail::function::function_buffer&, T0, T1, T2, T3) [with FunctionObj = boost::spirit::qi::detail::parser_binder >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::fusion::cons >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, boost::fusion::nil> > > >, mpl_::bool_ >, R = bool, T0 = __gnu_cxx::__normal_iterator >&, T1 = const __gnu_cxx::__normal_iterator >&, T2 = boost::spirit::context, boost::fusion::vector0 >&, T3 = const boost::spirit::qi::char_class >&]’ 
/usr/include/boost/function/function_template.hpp:913:60: instantiated from ‘void boost::function4::assign_to(Functor) [with Functor = boost::spirit::qi::detail::parser_binder >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::fusion::cons >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, boost::fusion::nil> > > >, mpl_::bool_ >, R = bool, T0 = __gnu_cxx::__normal_iterator >&, T1 = const __gnu_cxx::__normal_iterator >&, T2 = boost::spirit::context, boost::fusion::vector0 >&, T3 = const boost::spirit::qi::char_class >&]’ 
/usr/include/boost/function/function_template.hpp:722:7: instantiated from ‘boost::function4::function4(Functor, typename boost::enable_if_c::value>::value, int>::type) [with Functor = boost::spirit::qi::detail::parser_binder >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::fusion::cons >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, boost::fusion::nil> > > >, mpl_::bool_ >, R = bool, T0 = __gnu_cxx::__normal_iterator >&, T1 = const __gnu_cxx::__normal_iterator >&, T2 = boost::spirit::context, boost::fusion::vector0 >&, T3 = const boost::spirit::qi::char_class >&, typename boost::enable_if_c::value>::value, int>::type = int]’ 
/usr/include/boost/function/function_template.hpp:1064:16: instantiated from ‘boost::function::function(Functor, typename boost::enable_if_c::value>::value, int>::type) [with Functor = boost::spirit::qi::detail::parser_binder >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::fusion::cons >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, boost::fusion::nil> > > >, mpl_::bool_ >, R = bool, T0 = __gnu_cxx::__normal_iterator >&, T1 = const __gnu_cxx::__normal_iterator >&, T2 = boost::spirit::context, boost::fusion::vector0 >&, T3 = const boost::spirit::qi::char_class >&, typename boost::enable_if_c::value>::value, int>::type = int]’ 
/usr/include/boost/function/function_template.hpp:1105:5: instantiated from ‘typename boost::enable_if_c::value>::value, boost::function&>::type boost::function::operator=(Functor) [with Functor = boost::spirit::qi::detail::parser_binder >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> >, boost::fusion::cons >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type> > >, boost::fusion::nil> > > >, mpl_::bool_ >, R = bool, T0 = __gnu_cxx::__normal_iterator >&, T1 = const __gnu_cxx::__normal_iterator >&, T2 = boost::spirit::context, boost::fusion::vector0 >&, T3 = const boost::spirit::qi::char_class >&, typename boost::enable_if_c::value>::value, boost::function&>::type = boost::function >&, const __gnu_cxx::__normal_iterator >&, boost::spirit::context, boost::fusion::vector0 >&, const boost::spirit::qi::char_class >&)>&]’ 
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:198:13: instantiated from ‘boost::spirit::qi::rule& boost::spirit::qi::rule::operator=(const Expr&) [with Expr = boost::proto::exprns_::expr >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>&, const boost::proto::exprns_::expr, 0l>&>, 2l>&, const boost::proto::exprns_::expr, 0l>&, boost::spirit::qi::rule >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>&>, 2l>&>, 2l>, Iterator = __gnu_cxx::__normal_iterator >, T1 = boost::proto::exprns_::expr >, 0l>, T2 = boost::spirit::unused_type, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type, boost::spirit::qi::rule = boost::spirit::qi::rule >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>]’ 
../src/RJstate.cpp:49:7: instantiated from ‘fsm_grammar::fsm_grammar() [with Iterator = __gnu_cxx::__normal_iterator >, Skipper = boost::proto::exprns_::expr >, 0l>]’ 
../src/RJstate.cpp:112:50: instantiated from here 
/usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:277:17: error: no match for call to ‘(const function_type {aka const boost::function >&, const __gnu_cxx::__normal_iterator >&, boost::spirit::context, boost::fusion::vector0 >&, const boost::spirit::qi::char_class >&)>}) (__gnu_cxx::__normal_iterator >&, const __gnu_cxx::__normal_iterator >&, boost::spirit::qi::rule >, boost::proto::exprns_::expr >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::context_type&, const boost::spirit::qi::detail::unused_skipper > >&)’ 
/usr/include/boost/function/function_template.hpp:1043:7: note: candidate is: 
/usr/include/boost/function/function_template.hpp:1006:1: note: boost::function4::result_type boost::function4::operator()(T0, T1, T2, T3) const [with R = bool, T0 = __gnu_cxx::__normal_iterator >&, T1 = const __gnu_cxx::__normal_iterator >&, T2 = boost::spirit::context, boost::fusion::vector0 >&, T3 = const boost::spirit::qi::char_class >&, boost::function4::result_type = bool] 
/usr/include/boost/function/function_template.hpp:1006:1: note: no known conversion for argument 4 from ‘const boost::spirit::qi::detail::unused_skipper > >’ to ‘const boost::spirit::qi::char_class >&’ 

这是我的代码

#define BOOST_SPIRIT_DEBUG 

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <fstream> 

// forwards to <boost/spirit/home/qi/nonterminal/grammar.hpp> 
#include <boost/spirit/include/qi_grammar.hpp> 
// forwards to <boost/spirit/home/qi/nonterminal/rule.hpp> 
#include <boost/spirit/include/qi_rule.hpp> 

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

#include <boost/spirit/include/qi_char_class.hpp> 
#include <boost/spirit/include/qi_no_skip.hpp> 

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

#include "TestParser.hpp" 

/////////////////////////////////////////////////////////////////////////////// 

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

template <typename Iterator, typename Skipper=qi::space_type> 
struct fsm_grammar : qi::grammar<Iterator, Skipper> 
{ 
    fsm_grammar() : fsm_grammar::base_type(script) 
    { 
     using boost::spirit::double_; 
     using boost::spirit::ascii::char_; 
     using boost::spirit::ascii::alnum; 
     using boost::spirit::ascii::alpha; 
     using boost::spirit::lit; 
     using boost::spirit::qi::eol; 
     using boost::spirit::qi::eoi; 
     using boost::spirit::lexeme; 
     using boost::spirit::qi::no_skip; 
     using boost::spirit::qi::_1; 
     using boost::spirit::qi::_val; 

     //id = char_("a-zA-Z")[_val += _1] >> *char_("a-zA-Z_0-9")[_val += _1]; 
     id = lexeme[ alpha[_val += _1] >> *alnum[_val += _1] >> !alnum ]; 
     state_id = "state" >> id; 
     start_expr = "start" >> id; 
     trans_assign_expr = lit("\t") >> state_id >> +(char_('a','z')); 
     trans_expr = state_id >> eol >> no_skip[ trans_assign_expr ]; 
     assign_expr = char_("a-zA-Z"); 
     states_list = "states" >> +(id); 
     expr = (trans_expr | start_expr | states_list) >> +eol; 
     script = *expr >> eoi; 

     BOOST_SPIRIT_DEBUG_NODE(script); 
     BOOST_SPIRIT_DEBUG_NODE(states_list); 
     BOOST_SPIRIT_DEBUG_NODE(expr); 
     BOOST_SPIRIT_DEBUG_NODE(start_expr); 
     BOOST_SPIRIT_DEBUG_NODE(assign_expr); 
     BOOST_SPIRIT_DEBUG_NODE(trans_expr); 
     BOOST_SPIRIT_DEBUG_NODE(trans_assign_expr); 
     BOOST_SPIRIT_DEBUG_NODE(state_id); 
     BOOST_SPIRIT_DEBUG_NODE(id); 

     std::string val = "PASS"; 
     //test_parser(" ",+char_("a-zA-Z")); 
    } 

    qi::rule<Iterator, Skipper> script; 
    qi::rule<Iterator, Skipper> states_list; 
    qi::rule<Iterator, Skipper> expr; 
    qi::rule<Iterator, Skipper> trans_expr; 
    qi::rule<Iterator, Skipper> trans_assign_expr; 
    qi::rule<Iterator, Skipper> assign_expr; 
    qi::rule<Iterator, Skipper> start_expr; 
    qi::rule<Iterator, Skipper> state_id; 
    qi::rule<Iterator, std::string()> id; 
}; 
+0

我能够通过使用来解决解析: trans_expr = STATE_ID >> +(EOL >> no_skip [点亮( '\ T') ] >> trans_assign_expr); 但是,我的主要问题仍然存在。 – ehuang

+0

@llonesmiz谢谢,这非常有帮助。 – ehuang

回答

4

由于llonesmiz非常恰当地指出了这方面:

  • 看静态断言(****** like this in the error 'novel' ******
  • 看征求意见直接(我的意思是,直接)之上的“失败”行。这包括触发模板实例的点。

    如果您在此处看到编译错误,指出第四个参数无法转换为所需的目标类型,那么您可能试图使用规则或语法与不兼容的船长类型。

    在这种情况下,由于要使用trans_assign_expr没有队长,你必须声明它没有一个:

    // no skippers 
    qi::rule<Iterator, std::string()> id; 
    qi::rule<Iterator> state_id; 
    qi::rule<Iterator> trans_assign_expr; 
    

这使得编译。然而,输出表明它没有/工作/,但。

我不相信这是你想要做什么。由于lexeme似乎是一个更好的选择,无论如何。我想简化id规则:

id = lexeme [ alpha >> *alnum ]; 

lexeme已经在本地使用禁用船长财产。

这里是语法http://liveworkspace.org/code/70f3319342c567854b9f785ac13508d6

trans_assign_expr = state_id >> +(char_('a','z')); 
trans_expr  = state_id >> no_skip [ eol >> '\t' ] >> trans_assign_expr; 

的轻微变化正如你所看到的,我包括在一个no_skip eol(避免船长吃的标签)。通过这种方式,船长是仍然效力于trans_assign_expr - 这使得它接受额外的空间。给定了输入

const char input[]="state PASS\n\t state FAIL more"; 

的输出现在是

<script> 
    <try>state PASS\n\t state F</try> 
    <expr> 
    <try>state PASS\n\t state F</try> 
    <trans_expr> 
     <try>state PASS\n\t state F</try> 
     <state_id> 
     <try>state PASS\n\t state F</try> 
     <id> 
      <try> PASS\n\t state FAIL m</try> 
      <success>\n\t state FAIL more\n</success> 
      <attributes>[[P, A, S, S]]</attributes> 
     </id> 
     <success>\n\t state FAIL more\n</success> 
     <attributes>[]</attributes> 
     </state_id> 
     <trans_assign_expr> 
     <try> state FAIL more\n</try> 
     <state_id> 
      <try> state FAIL more\n</try> 
      <id> 
      <try> FAIL more\n</try> 
      <success> more\n</success> 
      <attributes>[[F, A, I, L]]</attributes> 
      </id> 
      <success> more\n</success> 
      <attributes>[]</attributes> 
     </state_id> 
     <success>\n</success> 
     <attributes>[]</attributes> 
     </trans_assign_expr> 
     <success>\n</success> 
     <attributes>[]</attributes> 
    </trans_expr> 
    <success></success> 
    <attributes>[]</attributes> 
    </expr> 
    <expr> 
    <try></try> 
    <trans_expr> 
     <try></try> 
     <state_id> 
     <try></try> 
     <fail/> 
     </state_id> 
     <fail/> 
    </trans_expr> 
    <start_expr> 
     <try></try> 
     <fail/> 
    </start_expr> 
    <states_list> 
     <try></try> 
     <fail/> 
    </states_list> 
    <fail/> 
    </expr> 
    <success></success> 
    <attributes>[]</attributes> 
</script> 
true