Ich konnte keine Grammatik zum arbeiten bekommen, also habe ich es vereinfacht, bis es nur eine Ganzzahl analysiert. Kann es immer noch nicht zur Arbeit bringen. Es ist die folgende Grammatik:Mit einfachen Boost :: Spirit Grammatiken?
template<typename Iterator>
struct rangeGrammar : qi::grammar<Iterator, int()>
{
rangeGrammar() :
rangeGrammar::base_type(number)
{
using qi::int_;
using qi::_1;
using qi::_val;
number = int_[_val = _1];
}
qi::rule<Iterator, int()> number;
};
Es soll nur eine ganze Zahl parsen (ich weiß, dass ich nur die Parsing-Funktion sagen könnte, wie die Grammatik verwenden int_, aber ich wan't zu wissen, was in dieser falsch ist Beispiel).
Meine Parse-Funktion ist:
/* n is a std::string provided by the user */
rangeGrammar<std::string::const_iterator> grammar;
int num = 0;
qi::phrase_parse(n.start(), n.end(), grammar, num);
std::cout << "Number: " << num << std::endl;
ich den folgenden Compiler-Fehler:
/boost/spirit/home/qi/reference.hpp: In member function ‘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::spirit::locals<> >, Skipper = boost::spirit::unused_type, Attribute = int, Subject = const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator >, int(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>]’: /boost/spirit/home/qi/parse.hpp:89:82: instantiated from ‘bool boost::spirit::qi::parse(Iterator&, Iterator, const Expr&, Attr&) [with Iterator = __gnu_cxx::__normal_iterator >, Expr = rangeGrammar<__gnu_cxx::__normal_iterator > >, Attr = int]’ ../parameter_parser.h:95:46: instantiated from here boost/spirit/home/qi/reference.hpp:43:71: error: no matching function for call to ‘boost::spirit::qi::rule<__gnu_cxx::__normal_iterator >, int(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::parse(__gnu_cxx::__normal_iterator >&, const __gnu_cxx::__normal_iterator >&, boost::spirit::context, boost::spirit::locals<> >&, const boost::spirit::unused_type&, int&) const’ cc1plus: warnings being treated as errors /boost/spirit/home/qi/reference.hpp:44:9: error: control reaches end of non-void function * exit status 1 *
Kann nicht herausfinden, was das Problem ist. Jede Hilfe würde sehr geschätzt werden.
lol @ "simple boost :: spirit Grammatiken" –
Wie Sie entdeckt haben, gibt es keine einfachen Boost-Geist-Grammatiken. Verwenden Sie stattdessen ANTLR. –
Ich sprach neulich mit einem netten Kerl vom Boost "Team" im IRC und fragte, warum Spirit eine so geringe Dokumentationsabdeckung hat. Er rief aus, dass es tatsächlich sehr gut dokumentiert ... +1 für den Einsatz ANTLR. – Kivin