How can I improve the quality of the compiler

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; }; 
+4
source share
1 answer

As llonesmiz very accurately pointed out:

  • look for static statements ( ****** like this in the error 'novel' ****** )
  • look for comments directly (I mean directly ) above the string 'failing'. This includes the points at which the template instances were initiated.

    If you see a compilation error stating that the fourth parameter cannot be converted to the desired target type, you are probably trying to use a rule or grammar with an incompatible skipper type.

    In this case, since you want to use trans_assign_expr without a skipper, you must declare it without it:

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

This makes compilation. The result shows that it / does not work /.

I am not sure if this is what you want to do . Since lexeme seems to be the best option here, anyway. I would simplify the id rule:

 id = lexeme [ alpha >> *alnum ]; 

lexeme already has the ability to locally disable the skipper used.

Here is a small grammar change http://liveworkspace.org/code/70f3319342c567854b9f785ac13508d6

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

As you can see, I include eol in no_skip (to avoid the skipper walking on the tab). Thus, the skipper is still acting in trans_assign_expr , which allows for additional space. Given input

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

Now exit

 <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 
+4
source

Source: https://habr.com/ru/post/1441132/


All Articles