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