From ebabf71182bb2cb11fc380dc68381f2da8d10e0c Mon Sep 17 00:00:00 2001 From: Matthias Schoepfer <mschoepf@techfak.uni-bielefeld.de> Date: Sat, 15 Jun 2013 10:38:11 +0200 Subject: [PATCH] Ok, all seems pretty smooth, except for the rule results --- .../parserMinimalExample3.cpp | 84 +++++++++++++++++++ pocketsphinxAdapter/src/JsgfParser.h | 15 +--- 2 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 parserMinimalExample/parserMinimalExample3.cpp diff --git a/parserMinimalExample/parserMinimalExample3.cpp b/parserMinimalExample/parserMinimalExample3.cpp new file mode 100644 index 00000000..01268504 --- /dev/null +++ b/parserMinimalExample/parserMinimalExample3.cpp @@ -0,0 +1,84 @@ +#include <boost/spirit/include/qi.hpp> +#include <boost/spirit/include/qi_lit.hpp> +#include <boost/spirit/include/qi_operator.hpp> +#include <boost/spirit/include/phoenix_core.hpp> +#include <boost/spirit/include/phoenix_operator.hpp> +#include <boost/spirit/include/phoenix_object.hpp> +#include <boost/spirit/include/phoenix_fusion.hpp> +#include <boost/spirit/include/phoenix_stl.hpp> +#include <boost/fusion/include/adapt_struct.hpp> +#include <boost/fusion/include/io.hpp> +#include <boost/shared_ptr.hpp> +#include <boost/make_shared.hpp> +#include <iostream> +#include <string> + +namespace qi = boost::spirit::qi; +namespace px = boost::phoenix; +namespace ascii = boost::spirit::ascii; + + +typedef qi::rule<std::string::const_iterator,std::vector<std::string>(),qi::ascii::space_type> RuleType; +typedef RuleType* RuleTypePtr; + +template <typename Iterator> +struct dynamicParser : qi::grammar<Iterator,std::vector<std::string>(), boost::spirit::ascii::space_type> { + dynamicParser (std::vector<qi::rule<Iterator,std::vector<std::string>(), qi::ascii::space_type>* > rules) : dynamicParser::base_type(startRule) { + rulestack = rules; + startRule = *(rulestack.at(0)); + for (unsigned long int i=0; i < rulestack.size();i++) + qi::debug(*rulestack.at(i)); + qi::debug(startRule); + qi::on_error<qi::fail> + ( + startRule + , std::cout + << px::val("Error! Expecting ") + << qi::_4 // what failed? + << px::val(" here: \"") + << px::construct<std::string>(qi::_3, qi::_2) // iterators to error-pos, end + << px::val("\"") + << std::endl + ); + } + std::vector<qi::rule<Iterator,std::vector<std::string>(),qi::ascii::space_type>* > rulestack; + qi::rule<Iterator,std::vector<std::string>(), qi::ascii::space_type> startRule; +}; + +int +main (int argc, char** argv) { + std::vector<RuleTypePtr> myRuleVector; + myRuleVector.push_back (new RuleType(qi::eps));//This rule is going to get replaced + myRuleVector.push_back (new RuleType(qi::string("Hello")[px::push_back(qi::_val,px::val("Hello"))])); + myRuleVector.back()->name("Hello"); + myRuleVector.push_back (new RuleType(qi::string("Hi")[px::push_back(qi::_val,px::val("Hi"))])); + myRuleVector.back()->name("Hi"); + myRuleVector.push_back (new RuleType(qi::string("Whats up")[px::push_back(qi::_val,px::val("WU"))])); + myRuleVector.back()->name("WU"); + + //Now magically compose a rule *with arbitrary vectorsize* + //I have no clue how to do this + //But it should result in: + + myRuleVector.at(0) = new RuleType (*myRuleVector.at(1)); + + for (int i=2; i < 4; i++) + (*myRuleVector.at(0)) = myRuleVector.at(0)->copy() > (*myRuleVector.at(i)); + myRuleVector.at(0)->name("startrule"); + dynamicParser<std::string::const_iterator> myDynamicParser(myRuleVector); + + std::string s ("Hello Hi Whats up"); + std::vector<std::string> attr; + + if (qi::phrase_parse ((std::string::const_iterator)s.begin(),(std::string::const_iterator)s.end(),myDynamicParser,ascii::space,attr)) + std::cout << "Parse success" << std::endl; + else + std::cout << "Parse failed" << std::endl; + std::cout << "Result: "; + for (std::vector<std::string>::const_iterator it=attr.begin(); it != attr.end(); it++) + std::cout << "[" << (*it) << "] "; + std::cout << std::endl; + return 0; +} + + diff --git a/pocketsphinxAdapter/src/JsgfParser.h b/pocketsphinxAdapter/src/JsgfParser.h index 70b02d82..7806c0bd 100644 --- a/pocketsphinxAdapter/src/JsgfParser.h +++ b/pocketsphinxAdapter/src/JsgfParser.h @@ -102,16 +102,7 @@ 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; } @@ -293,7 +284,7 @@ namespace jsgfParserTypes { { 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.push_back (new ruleT (qi::string(trim(tl.symbols.at(i).name))[qi::_val = px::val('<') + px::val(myNonterminal) + px::val('>') + px::val(trim(tl.symbols.at(i).name)) + px::val("</") + px::val(myNonterminal) + px::val('>')])); (*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; } @@ -303,7 +294,7 @@ namespace jsgfParserTypes { 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.push_back (new ruleT ((*myRules.at(pos->second))[qi::_val = px::val('<') + px::val(myNonterminal) + px::val('>') + qi::_1 + px::val("</") + px::val(myNonterminal) + px::val('>')])); (*myRules.back()).name(std::string("N:").append(trim(tl.symbols.at(i).name))); //std::cout << "done" << std::endl; } -- GitLab