I am trying to use the no_skip directive to input the form syntax:
state PASS <tab> state FAIL
I use ascii::blank as my skipper. I get a compilation error when I complete no_skip[ trans_assign_expr ] to no_skip[ trans_assign_expr ] tab.
How to fix this error and in general, how can I understand these errors so that I can fix future ones? The promotion documentation never touches on this aspect of using the spirit :(
This is mistake
In file included from /usr/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:07,
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:1105DUC: 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> & '
This is my code.
#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; };