From e947c3a1b6bc0eb1cc763a5e39b7dfb8165a55c1 Mon Sep 17 00:00:00 2001 From: Matthias Schoepfer <mschoepf@techfak.uni-bielefeld.de> Date: Fri, 14 Jun 2013 20:02:58 +0200 Subject: [PATCH] before i am going to trysomething crazy --- .../parserMinimalExample2.cpp | 12 +- .../nbproject/private/configurations.xml | 2 - pocketsphinxAdapter/src/JsgfParser.cpp | 2 +- pocketsphinxAdapter/src/JsgfParser.h | 174 ++++++++---------- pocketsphinxAdapter/src/basic.jsgf | 2 +- pocketsphinxAdapter/src/dynamicParser.h | 15 +- 6 files changed, 97 insertions(+), 110 deletions(-) diff --git a/parserMinimalExample/parserMinimalExample2.cpp b/parserMinimalExample/parserMinimalExample2.cpp index 7f6de235..8d774b60 100644 --- a/parserMinimalExample/parserMinimalExample2.cpp +++ b/parserMinimalExample/parserMinimalExample2.cpp @@ -17,6 +17,7 @@ struct dynamicParser : dynamicParser::base_type(startRule) { startRule = rules[0]; + qi::debug (startRule); } RuleType startRule; @@ -29,8 +30,11 @@ main (int argc, char** argv) { myRuleVector.push_back (RuleType(qi::eps));//This rule is going to get replaced myRuleVector.push_back (RuleType(qi::string("Hello"))); - myRuleVector.push_back (RuleType(qi::string("Hi"))); - myRuleVector.push_back (RuleType(qi::string("Whats up"))); + myRuleVector.back().name("Hello"); + myRuleVector.push_back (RuleType(-(qi::string("Hi")))); + myRuleVector.back().name("Hi"); + myRuleVector.push_back (RuleType(-qi::string("Whats up"))); + myRuleVector.back().name("Whats up"); //Now magically compose a rule *with arbitrary vectorsize* //I have no clue how to do this @@ -39,11 +43,11 @@ main (int argc, char** argv) { myRuleVector[0] = myRuleVector[1] | myRuleVector[2] | myRuleVector[3]; myRuleVector.at(0) = myRuleVector.at(1); for (int i=2; i < 3; i++) - myRuleVector.at(0) = myRuleVector.at(0).copy() | myRuleVector.at(i); + myRuleVector.at(0) = myRuleVector.at(0).copy() > myRuleVector.at(i); dynamicParser<std::string::const_iterator> myDynamicParser(myRuleVector); - std::string const s ("Hi"); + std::string const s ("Hello Hi"); std::string attr; if (qi::phrase_parse (s.begin(), s.end(),myDynamicParser,ascii::space,attr)) diff --git a/pocketsphinxAdapter/nbproject/private/configurations.xml b/pocketsphinxAdapter/nbproject/private/configurations.xml index 1f10486a..7f1400cd 100644 --- a/pocketsphinxAdapter/nbproject/private/configurations.xml +++ b/pocketsphinxAdapter/nbproject/private/configurations.xml @@ -53,8 +53,6 @@ </df> <df name="CMakeTmp"> </df> - <df name="Progress"> - </df> </df> <df name="src"> <df name="CMakeFiles"> diff --git a/pocketsphinxAdapter/src/JsgfParser.cpp b/pocketsphinxAdapter/src/JsgfParser.cpp index bc6f0854..28f657c4 100644 --- a/pocketsphinxAdapter/src/JsgfParser.cpp +++ b/pocketsphinxAdapter/src/JsgfParser.cpp @@ -97,7 +97,7 @@ main(int argc, char** argv) { std::cout << "JSGF rule generation FAILED" << std::endl; return 1; } - std::vector<jsgfParserTypes::ruleTPtr> myRules = myJsgfParser.getRules(); + std::vector<jsgfParserTypes::ruleT> myRules = myJsgfParser.getRules(); dynamicParser<std::string::iterator> myDynamicParser (myRules); std::string st ("this is a task"); while (0 != st.compare("")) diff --git a/pocketsphinxAdapter/src/JsgfParser.h b/pocketsphinxAdapter/src/JsgfParser.h index ea5f8ef9..c2e872f2 100644 --- a/pocketsphinxAdapter/src/JsgfParser.h +++ b/pocketsphinxAdapter/src/JsgfParser.h @@ -67,9 +67,8 @@ namespace jsgfParserTypes { std::vector<RuleT> rules; }; typedef qi::rule<std::string::iterator,std::string(), ascii::space_type> ruleT; - typedef ruleT* ruleTPtr; typedef std::map<std::string, jsgfParserTypes::TermT > ruleNameToTermT; - typedef std::map<std::string,std::vector<ruleTPtr>::size_type> nameToRuleT; + typedef std::map<std::string,std::vector<ruleT>::size_type> nameToRuleT; } BOOST_FUSION_ADAPT_STRUCT( @@ -103,14 +102,6 @@ BOOST_FUSION_ADAPT_STRUCT( namespace jsgfParserTypes { - /*void addLastNRules (std::vector<ruleTPtr> &rules, std::vector<ruleTPtr>::size_type diff) - { - std::vector<ruleTPtr>::size_type size = rules.size(); - switch (diff) - { - case 1: if (rules.at(size-1).) - } - }*/ void fun() { std::cout << "fun called" << std::endl; @@ -268,16 +259,16 @@ namespace jsgfParserTypes { class TermTRuleGenerator { public: - TermTRuleGenerator (std::vector<ruleTPtr > &rules, nameToRuleT &namesToRules, std::string nonterminal) : myRules(rules), myNamesToRules(namesToRules), myNonterminal(nonterminal){} + TermTRuleGenerator (std::vector<ruleT> &rules, nameToRuleT &namesToRules, std::string nonterminal) : myRules(rules), myNamesToRules(namesToRules), myNonterminal(nonterminal){} void operator()(TermT & t) const; - std::vector<ruleTPtr> &myRules; + std::vector<ruleT> &myRules; nameToRuleT &myNamesToRules; std::string myNonterminal; }; class TermWrapperRuleGenerator : public boost::static_visitor<> { public: - TermWrapperRuleGenerator (std::vector<ruleTPtr> &rules, nameToRuleT & namesToRules, std::string nonterminal) : myRules (rules), myNamesToRules(namesToRules), myNonterminal(nonterminal){} + TermWrapperRuleGenerator (std::vector<ruleT> &rules, nameToRuleT & namesToRules, std::string nonterminal) : myRules (rules), myNamesToRules(namesToRules), myNonterminal(nonterminal){} void operator ()(TermT & t) const { TermTRuleGenerator myGenerator (myRules,myNamesToRules, myNonterminal); @@ -288,23 +279,24 @@ namespace jsgfParserTypes { { if (0 == tl.symbols.size()) return; //Save a lot of time and some if cases below + std::vector<SymbolT>::size_type myRulesLocalStart = myRules.size(); for (std::vector<jsgfParserTypes::SymbolT>::size_type i=0; i < tl.symbols.size(); i++) { if (0 == tl.symbols.at(i).type) { - myRules.push_back (new ruleT (qi::string(trim(tl.symbols.at(i).name))[qi::_val = px::val(myNonterminal)])); - (*myRules.back()).name(std::string("T:").append(trim(tl.symbols.at(i).name))); - //std::cout << "Added qi::lexeme[" << trim(tl.symbols.at(i).name) << "][" << myNonterminal << "]"<< std::endl; + myRules.push_back(qi::string(trim(tl.symbols.at(i).name))[qi::_val = px::val(myNonterminal)]); + myRules.back().name(std::string("T:").append(trim(tl.symbols.at(i).name))); + std::cout << "Added qi::lexeme[" << trim(tl.symbols.at(i).name) << "][" << myNonterminal << "] with name "<< myRules.back().name() << std::endl; } else { nameToRuleT::iterator pos = myNamesToRules.find(trim(tl.symbols.at(i).name)); if (pos != myNamesToRules.end()) { - //std::cout << "Adding nonterminal '" << trim(tl.symbols.at(i).name) <<"' link to rule " << pos->second << std::endl; - myRules.push_back (new ruleT ((*myRules.at(pos->second))[qi::_val = px::val(myNonterminal) + px::val('+') + qi::_1])); - (*myRules.back()).name(std::string("N:").append(trim(tl.symbols.at(i).name))); - //std::cout << "done" << std::endl; + std::cout << "Adding nonterminal '" << trim(tl.symbols.at(i).name) <<"' link to rule " << pos->second << std::endl; + myRules.push_back(myRules.at(pos->second)[qi::_val = px::val(myNonterminal) + px::val('+') + qi::_1]); + myRules.back().name(std::string("N:").append(trim(tl.symbols.at(i).name))); + std::cout << "done" << std::endl; } else { @@ -313,114 +305,106 @@ namespace jsgfParserTypes { } } } - ruleTPtr r = new ruleT ((*myRules.front())[px::insert(qi::_val,px::end(qi::_val), px::begin(qi::_1), px::end(qi::_1))]); - r->name("(" + myRules.front()->name()); - for (std::vector<SymbolT>::size_type i=1; i < tl.symbols.size();i++) + + ruleT r = (myRules.at(myRulesLocalStart)[qi::_val = qi::_1]/*[px::insert(qi::_val,px::end(qi::_val), px::begin(qi::_1), px::end(qi::_1))]*/); + r.name(myRules.at(myRulesLocalStart).name()); + for (std::vector<SymbolT>::size_type i=(myRulesLocalStart+1); i < myRules.size();i++) { - (*r) = r->copy() > ((*myRules.at(i))[px::insert(qi::_val,px::end(qi::_val), px::begin(qi::_1), px::end(qi::_1))]); - r->name(r->name() + " > " + myRules.at(i)->name()); - } - r->name(r->name() + ")"); + r = r.copy() > (myRules.at(i)/*[px::insert(qi::_val,px::end(qi::_val), px::begin(qi::_1), px::end(qi::_1))]*/); + r.name(r.name() + " > " + myRules.at(i).name()); + } myRules.push_back(r); - std::cout << "TermLeaf created rule " << myRules.back()->name() << std::endl; + std::cout << "TermLeaf created rule " << myRules.back().name() << std::endl; } - std::vector<ruleTPtr> &myRules; + std::vector<ruleT> &myRules; nameToRuleT &myNamesToRules; std::string myNonterminal; }; void TermTRuleGenerator::operator()(TermT & t) const { - std::vector<std::vector<ruleTPtr>::size_type> indices; + std::vector<std::vector<ruleT>::size_type> indices; BOOST_FOREACH(TermWrapperT & node, t.children) { - std::vector<ruleTPtr>::size_type rulesSize = myRules.size(); + std::vector<ruleT>::size_type rulesSize = myRules.size(); boost::apply_visitor(TermWrapperRuleGenerator(myRules,myNamesToRules,myNonterminal),node); if (rulesSize != myRules.size()) { indices.push_back(myRules.size()-1); } - } - ruleTPtr r=NULL; + } if (indices.size() > 0) { - + ruleT r; if (t.optional) { - r = new ruleT (-(*myRules.at(indices.at(0)))); - r->name("[" + (*myRules.at(indices.at(0))).name()); + r = (-(myRules.at(indices.at(0)))[qi::_val = qi::_1]); + r.name("[" + myRules.at(indices.at(0)).name()); } else { - r = new ruleT ((*myRules.at(indices.at(0)))); - r->name("(" + (*myRules.at(indices.at(0))).name()); + r = (myRules.at(indices.at(0))); + r.name("(" + myRules.at(indices.at(0)).name()); } - for (std::vector<ruleTPtr>::size_type i=1; i < indices.size(); i++) + for (std::vector<ruleT>::size_type i=1; i < indices.size(); i++) { if (t.optional) { - (*r) = (*r).copy() > (-(*myRules.at(indices.at(i)))); - r->name(r->name() + " > " + (*myRules.at(indices.at(i))).name()); + r = r.copy() > (-(myRules.at(indices.at(i)))); + r.name(r.name() + " > " + myRules.at(indices.at(i)).name()); } else { - (*r) = (*r).copy() > (*myRules.at(indices.at(i))); - r->name(r->name() + " > " + (*myRules.at(indices.at(i))).name()); + r = r.copy() > myRules.at(indices.at(i)); + r.name(r.name() + " > " + myRules.at(indices.at(i)).name()); } } if (t.optional) - r->name(r->name() + "]"); + r.name(r.name() + "]"); else - r->name(r->name() + ")"); - } - if (NULL != r) - { - myRules.push_back(r); - std::cout << "Composed rule " << r->name() << " with t.option: " << t.optional << std::endl; + r.name(r.name() + ")"); + myRules.push_back(r); + std::cout << "Composed rule " << r.name() << std::endl; } indices.clear(); BOOST_FOREACH(TermWrapperT &node, t.orTerms) { - std::vector<ruleTPtr>::size_type rulesSize = myRules.size(); + std::vector<ruleT>::size_type rulesSize = myRules.size(); boost::apply_visitor(TermWrapperRuleGenerator(myRules,myNamesToRules,myNonterminal),node); if (rulesSize != myRules.size()) { indices.push_back(myRules.size() - 1); } } - r=NULL; if (indices.size() > 0) - { - r = new ruleT ((*myRules.at(indices.at(0)))); + { + ruleT r; if (t.optional) { - r = new ruleT (-(*myRules.at(indices.at(0)))); - r->name("[" + (*myRules.at(indices.at(0))).name()); + r = (-(myRules.at(indices.at(0)))); + r.name("[" + myRules.at(indices.at(0)).name()); } else { - r = new ruleT ((*myRules.at(indices.at(0)))); - r->name("(" + (*myRules.at(indices.at(0))).name()); + r = myRules.at(indices.at(0)); + r.name("(" + myRules.at(indices.at(0)).name()); } - for (std::vector<ruleTPtr>::size_type i=1; i < indices.size(); i++) + for (std::vector<ruleT>::size_type i=1; i < indices.size(); i++) { if (t.optional) { - (*r) = (*r).copy() | (-(*myRules.at(indices.at(i)))); - r->name(r->name() + " | " + (*myRules.at(indices.at(i))).name()); + r = r.copy() | (-(myRules.at(indices.at(i)))); + r.name(r.name() + " | " + (myRules.at(indices.at(i))).name()); } else { - (*r) = (*r).copy() | (*myRules.at(indices.at(i))); - r->name(r->name() + " | " + (*myRules.at(indices.at(i))).name()); + r = r.copy() | (myRules.at(indices.at(i))); + r.name(r.name() + " | " + myRules.at(indices.at(i)).name()); } } if (t.optional) - r->name(r->name() + "]"); + r.name(r.name() + "]"); else - r->name(r->name() + ")"); - } - if (NULL != r) - { - myRules.push_back(r); - std::cout << "Composed rule " << r->name() << " with t.option: " << t.optional << std::endl; + r.name(r.name() + ")"); + myRules.push_back(r); + std::cout << "Composed rule " << r.name() << std::endl; } } } @@ -440,7 +424,8 @@ public: symbolParser = (terminal | nonterminal); symbolList = +(symbolParser)[px::push_back(px::at_c<0>(qi::_val),qi::_1)];// > qi::eps[px::at_c<0>(qi::_val) = px::val(false)]; symbolListWrapper = symbolList [qi::_val = qi::_1]; - termList = (symbolList[px::push_back(px::at_c<1>(qi::_val),qi::_1)] | parenteseTerm[px::push_back(px::at_c<1>(qi::_val),qi::_1)] | optionalTerm[px::push_back(px::at_c<1>(qi::_val), qi::_1)] | orTerm[px::push_back(px::at_c<2>(qi::_val),qi::_1)]) >> (termList[px::insert(px::at_c<1>(qi::_val),px::end(px::at_c<1>(qi::_val)), px::begin(px::at_c<1>(qi::_1)), px::end(px::at_c<1>(qi::_1)))]/*[px::push_back(px::at_c<1>(qi::_val),(qi::_1)),px::at_c<2>(qi::_val) = px::at_c<2>(qi::_1)]*/ || qi::eps); + termParser = (symbolList[px::push_back(px::at_c<1>(qi::_val),qi::_1)] | parenteseTerm[px::push_back(px::at_c<1>(qi::_val),qi::_1)] | optionalTerm[px::push_back(px::at_c<1>(qi::_val), qi::_1)] | orTerm[px::push_back(px::at_c<2>(qi::_val),qi::_1)]); + termList = (termParser[px::insert(px::at_c<1>(qi::_val),px::end(px::at_c<1>(qi::_val)), px::begin(px::at_c<1>(qi::_1)), px::end(px::at_c<1>(qi::_1))),px::insert(px::at_c<2>(qi::_val),px::end(px::at_c<2>(qi::_val)), px::begin(px::at_c<2>(qi::_1)), px::end(px::at_c<2>(qi::_1)))] >> -(termList[px::insert(px::at_c<1>(qi::_val),px::end(px::at_c<1>(qi::_val)), px::begin(px::at_c<1>(qi::_1)), px::end(px::at_c<1>(qi::_1))),px::insert(px::at_c<2>(qi::_val),px::end(px::at_c<2>(qi::_val)), px::begin(px::at_c<2>(qi::_1)), px::end(px::at_c<2>(qi::_1)))]/*[px::push_back(px::at_c<1>(qi::_val),(qi::_1)),px::at_c<2>(qi::_val) = px::at_c<2>(qi::_1)]*/)); parenteseTerm = qi::lit('(') > (termList)[qi::_val = qi::_1] > qi::eps[px::at_c<0>(qi::_val) = px::val(false)] > qi::lit(')'); optionalTerm = qi::lit('[') > (termList[qi::_val = qi::_1]) > qi::eps[px::at_c<0>(qi::_val) = px::val(true)] > qi::lit(']'); orTerm = qi::lit('|') > termList[qi::_val = qi::_1];// > *(termList[px::push_back(px::at_c<1>(qi::_val),qi::_1)])); @@ -451,7 +436,7 @@ public: optionalTerm %= (qi::lit('[') > *termParser % qi::lit('|') > qi::lit(']')); termList = symbolListWrapper [px::push_back(px::at_c<0>(qi::_val),qi::_1)] | parenteseTerm[qi::_val = qi::_1] | optionalTerm[qi::_val = qi::_1]; //jsgf termListList = *termList[px::push_back(px::at_c<0>(qi::_val),qi::_1)];*/ - ruleParser %= (qi::eps || "public") >> qi::lit('<') > identifier/*[px::at_c<0>(qi::_val) = qi::_1]*/ > qi::lit('>') > qi::lit('=') > termList /*[px::at_c<1>(qi::_val),qi::_1]*/ > qi::lit(';'); + ruleParser %= (qi::eps || "public") >> qi::lit('<') > identifier/*[px::at_c<0>(qi::_val) = qi::_1]*/ > qi::lit('>') > qi::lit('=') > termList/*[px::at_c<1>(qi::_val) = qi::_1]*/ > qi::lit(';'); jsgfParser = jsgfIdentifier >> grammarIdentifier[px::at_c<0>(qi::_val),qi::_1] >> *ruleParser[px::push_back(px::at_c<1>(qi::_val),qi::_1)]; @@ -464,14 +449,17 @@ public: symbolListOptional.name("List of Optional Symbols"); termParser.name("TermParser"); termList.name("TermList"); + optionalTerm.name("OptionalTerm"); + orTerm.name ("orTerm"); + parenteseTerm.name("ParenteseTerm"); ruleParser.name("RuleParser"); - qi::debug(ruleParser); - qi::debug(termList); + qi::debug(ruleParser); qi::debug(symbolList); - qi::debug(symbolListWrapper); - qi::debug(symbolParser); - qi::debug(terminal); - qi::debug(identifier); + qi::debug(termParser); + qi::debug(termList); + qi::debug(parenteseTerm); + qi::debug(orTerm); + qi::debug(optionalTerm); qi::on_error<qi::fail> ( jsgfParser @@ -496,13 +484,13 @@ public: qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> optionalTerm; qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> orTerm; qi::rule<Iterator, jsgfParserTypes::TermLeafT(), ascii::space_type> symbolListOptional; - qi::rule<Iterator, jsgfParserTypes::TermWrapperT(), ascii::space_type> termParser; + qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> termParser; qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> termList; qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> termListList; qi::rule<Iterator, jsgfParserTypes::RuleT(), ascii::space_type> ruleParser; qi::rule<Iterator, jsgfParserTypes::GrammarT(),ascii::space_type> jsgfParser; jsgfParserTypes::ruleNameToTermT rulesMap; - std::vector<jsgfParserTypes::ruleTPtr > myRuleVector; + std::vector<jsgfParserTypes::ruleT> myRuleVector; bool sanitizeCheckGrammar(jsgfParserTypes::GrammarT &grammar, bool verbose = false) { jsgfParserTypes::TermTPrinter myTermPrinter; @@ -546,32 +534,30 @@ public: jsgfParserTypes::nameToRuleT myNameToRule; myRuleVector.clear(); - std::vector<jsgfParserTypes::ruleTPtr>::size_type increment=0; - for (std::vector<jsgfParserTypes::ruleTPtr>::size_type i=0; i < grammar.rules.size();i++) // Make an empty rule for every rule/nonterminal we read - { - //myRuleVector.push_back (boost::make_shared<jsgfParserTypes::ruleT>()); - myRuleVector.push_back (new jsgfParserTypes::ruleT (qi::eps)); - (*myRuleVector.back()).name(grammar.rules.at(i).name); + std::vector<jsgfParserTypes::ruleT>::size_type increment=0; + for (std::vector<jsgfParserTypes::ruleT>::size_type i=0; i < grammar.rules.size();i++) // Make an empty rule for every rule/nonterminal we read + { + myRuleVector.push_back ((qi::int_)); + myRuleVector.back().name(grammar.rules.at(i).name); myNameToRule.insert(std::make_pair(grammar.rules.at(i).name,increment)); increment++; } increment=grammar.rules.size()-1; - for (std::vector<jsgfParserTypes::ruleTPtr>::size_type i=grammar.rules.size(); i > 0;i--) + for (std::vector<jsgfParserTypes::ruleT>::size_type i=grammar.rules.size(); i > 0;i--) { - std::vector<jsgfParserTypes::ruleTPtr> tempRuleVector = myRuleVector; + std::vector<jsgfParserTypes::ruleT> tempRuleVector = myRuleVector; jsgfParserTypes::TermTRuleGenerator myRuleGenerator(myRuleVector, myNameToRule, grammar.rules.at(i-1).name); - std::cout << "***Making Rule " << myRuleVector.at(increment)->name() << std::endl; + std::cout << "***Making Rule " << myRuleVector.at(increment).name() << std::endl; myRuleGenerator(grammar.rules.at(i-1).RHS); - std::string ruleResult; - (*myRuleVector.at(increment)) = (*myRuleVector.back()) > qi::eps; - ruleResult = (*myRuleVector.back()).name(); - std::cout << "*** Rule " << myRuleVector.at(increment)->name() << " = " << ruleResult << std::endl; + myRuleVector.at(increment) = (myRuleVector.back()); + myRuleVector.at(increment).name(grammar.rules.at(i-1).name); + std::cout << "*** Rule " << myRuleVector.at(increment).name() << " = " << myRuleVector.back().name() << std::endl; //std::vector<jsgfParserTypes::ruleTPtr>::size_type sizeDiff = myRuleVector.size() - tempRuleVector.size(); increment--; } return true; } - std::vector<jsgfParserTypes::ruleTPtr> getRules() { + std::vector<jsgfParserTypes::ruleT> getRules() { return myRuleVector; } //virtual ~parserToyExample(); diff --git a/pocketsphinxAdapter/src/basic.jsgf b/pocketsphinxAdapter/src/basic.jsgf index 5c0e7e80..570f1757 100644 --- a/pocketsphinxAdapter/src/basic.jsgf +++ b/pocketsphinxAdapter/src/basic.jsgf @@ -1,3 +1,3 @@ #JSGF V1.0; grammar ToBI_GPR; -public <task> = random (shit) [option]; \ No newline at end of file +public <task> = my [option]; diff --git a/pocketsphinxAdapter/src/dynamicParser.h b/pocketsphinxAdapter/src/dynamicParser.h index 50b9f834..07ba12d3 100644 --- a/pocketsphinxAdapter/src/dynamicParser.h +++ b/pocketsphinxAdapter/src/dynamicParser.h @@ -23,17 +23,17 @@ namespace ascii = boost::spirit::ascii; template <typename Iterator> struct dynamicParser : qi::grammar<Iterator,std::string(), boost::spirit::ascii::space_type> { - dynamicParser (std::vector<qi::rule<Iterator,std::string(), qi::ascii::space_type>* > rules) : dynamicParser::base_type(startRule) { + dynamicParser (std::vector<qi::rule<Iterator,std::string(), qi::ascii::space_type> > rules) : dynamicParser::base_type(startRule) { rulestack = rules; - startRule = *(rulestack.at(0)); + startRule = rulestack.at(0); std::cout << "Startrule name: " << startRule.name() << std::endl; - for (unsigned long int i; i < rulestack.size();i++) - qi::debug(*rulestack.at(i)); + for (unsigned long int i=0; i < rulestack.size();i++) + qi::debug(rulestack.at(i)); qi::debug(startRule); qi::on_error<qi::fail> ( - startRule + startRule , std::cout << px::val("Error! Expecting ") << qi::_4 // what failed? @@ -43,9 +43,8 @@ struct dynamicParser : qi::grammar<Iterator,std::string(), boost::spirit::ascii: << std::endl ); } - std::vector<qi::rule<Iterator,std::string(),qi::ascii::space_type>* > rulestack; - qi::rule<Iterator,std::string(), qi::ascii::space_type> startRule; - + std::vector<qi::rule<Iterator,std::string(),qi::ascii::space_type> > rulestack; + qi::rule<Iterator,std::string(),qi::ascii::space_type> startRule; }; -- GitLab