title: How do I grok boost spirit compiler errors
body: <p>I am trying to use the <code>no_skip</code> directive to parse input of the form:</p>
  
  <pre><code>state PASS
  &lt;tab&gt; state FAIL
  </code></pre>
  
  <p>I am using <code>ascii::blank</code> as my skipper. I get an compile error when I wrap <code>no_skip[ trans_assign_expr ]</code> to parse for the tab. </p>
  
  <p>How do I fix this error, and in general, how do I understand these errors so that I can fix future ones? The boost spirit documentation never covers this aspect of using spirit :(</p>
  
  <p>This is the error</p>
  
  <pre>
  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 >&’
  </pre>
  
  <p>This is my code </p>
  
  <pre><code>#define BOOST_SPIRIT_DEBUG
  
  #include &lt;iostream&gt;
  #include &lt;vector&gt;
  #include &lt;iterator&gt;
  #include &lt;fstream&gt;
  
  // forwards to &lt;boost/spirit/home/qi/nonterminal/grammar.hpp&gt;
  #include &lt;boost/spirit/include/qi_grammar.hpp&gt;
  // forwards to &lt;boost/spirit/home/qi/nonterminal/rule.hpp&gt;
  #include &lt;boost/spirit/include/qi_rule.hpp&gt;
  
  #include &lt;boost/spirit/include/qi.hpp&gt;
  
  #include &lt;boost/spirit/include/qi_char_class.hpp&gt;
  #include &lt;boost/spirit/include/qi_no_skip.hpp&gt;
  
  #include &lt;boost/spirit/include/phoenix.hpp&gt;
  
  #include "TestParser.hpp"
  
  ///////////////////////////////////////////////////////////////////////////////
  
  namespace qi = boost::spirit::qi;
  namespace ascii = boost::spirit::ascii;
  
  template &lt;typename Iterator, typename Skipper=qi::space_type&gt;
  struct fsm_grammar : qi::grammar&lt;Iterator, Skipper&gt;
  {
     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] &gt;&gt; *char_("a-zA-Z_0-9")[_val += _1];
        id = lexeme[ alpha[_val += _1] &gt;&gt; *alnum[_val += _1] &gt;&gt; !alnum ];
        state_id = "state" &gt;&gt; id;
        start_expr = "start" &gt;&gt; id;
        trans_assign_expr = lit("\t") &gt;&gt; state_id &gt;&gt; +(char_('a','z'));
        trans_expr = state_id &gt;&gt; eol &gt;&gt; no_skip[ trans_assign_expr ];
        assign_expr = char_("a-zA-Z");
        states_list = "states" &gt;&gt; +(id);
        expr = (trans_expr | start_expr | states_list) &gt;&gt; +eol;
        script = *expr &gt;&gt; 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&lt;Iterator, Skipper&gt; script;
     qi::rule&lt;Iterator, Skipper&gt; states_list;
     qi::rule&lt;Iterator, Skipper&gt; expr;
     qi::rule&lt;Iterator, Skipper&gt; trans_expr;
     qi::rule&lt;Iterator, Skipper&gt; trans_assign_expr;
     qi::rule&lt;Iterator, Skipper&gt; assign_expr;
     qi::rule&lt;Iterator, Skipper&gt; start_expr;
     qi::rule&lt;Iterator, Skipper&gt; state_id;
     qi::rule&lt;Iterator, std::string()&gt; id;
  };
  </code></pre>