Skip to content
Snippets Groups Projects
Commit e947c3a1 authored by Matthias Schoepfer's avatar Matthias Schoepfer
Browse files

before i am going to trysomething crazy

parent 32c50498
No related branches found
No related tags found
No related merge requests found
...@@ -17,6 +17,7 @@ struct dynamicParser ...@@ -17,6 +17,7 @@ struct dynamicParser
: dynamicParser::base_type(startRule) : dynamicParser::base_type(startRule)
{ {
startRule = rules[0]; startRule = rules[0];
qi::debug (startRule);
} }
RuleType startRule; RuleType startRule;
...@@ -29,8 +30,11 @@ main (int argc, char** argv) { ...@@ -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::eps));//This rule is going to get replaced
myRuleVector.push_back (RuleType(qi::string("Hello"))); myRuleVector.push_back (RuleType(qi::string("Hello")));
myRuleVector.push_back (RuleType(qi::string("Hi"))); myRuleVector.back().name("Hello");
myRuleVector.push_back (RuleType(qi::string("Whats up"))); 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* //Now magically compose a rule *with arbitrary vectorsize*
//I have no clue how to do this //I have no clue how to do this
...@@ -39,11 +43,11 @@ main (int argc, char** argv) { ...@@ -39,11 +43,11 @@ main (int argc, char** argv) {
myRuleVector[0] = myRuleVector[1] | myRuleVector[2] | myRuleVector[3]; myRuleVector[0] = myRuleVector[1] | myRuleVector[2] | myRuleVector[3];
myRuleVector.at(0) = myRuleVector.at(1); myRuleVector.at(0) = myRuleVector.at(1);
for (int i=2; i < 3; i++) 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); dynamicParser<std::string::const_iterator> myDynamicParser(myRuleVector);
std::string const s ("Hi"); std::string const s ("Hello Hi");
std::string attr; std::string attr;
if (qi::phrase_parse (s.begin(), s.end(),myDynamicParser,ascii::space,attr)) if (qi::phrase_parse (s.begin(), s.end(),myDynamicParser,ascii::space,attr))
......
...@@ -53,8 +53,6 @@ ...@@ -53,8 +53,6 @@
</df> </df>
<df name="CMakeTmp"> <df name="CMakeTmp">
</df> </df>
<df name="Progress">
</df>
</df> </df>
<df name="src"> <df name="src">
<df name="CMakeFiles"> <df name="CMakeFiles">
......
...@@ -97,7 +97,7 @@ main(int argc, char** argv) { ...@@ -97,7 +97,7 @@ main(int argc, char** argv) {
std::cout << "JSGF rule generation FAILED" << std::endl; std::cout << "JSGF rule generation FAILED" << std::endl;
return 1; return 1;
} }
std::vector<jsgfParserTypes::ruleTPtr> myRules = myJsgfParser.getRules(); std::vector<jsgfParserTypes::ruleT> myRules = myJsgfParser.getRules();
dynamicParser<std::string::iterator> myDynamicParser (myRules); dynamicParser<std::string::iterator> myDynamicParser (myRules);
std::string st ("this is a task"); std::string st ("this is a task");
while (0 != st.compare("")) while (0 != st.compare(""))
......
...@@ -67,9 +67,8 @@ namespace jsgfParserTypes { ...@@ -67,9 +67,8 @@ namespace jsgfParserTypes {
std::vector<RuleT> rules; std::vector<RuleT> rules;
}; };
typedef qi::rule<std::string::iterator,std::string(), ascii::space_type> ruleT; 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, 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( BOOST_FUSION_ADAPT_STRUCT(
...@@ -103,14 +102,6 @@ BOOST_FUSION_ADAPT_STRUCT( ...@@ -103,14 +102,6 @@ BOOST_FUSION_ADAPT_STRUCT(
namespace jsgfParserTypes { 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() { void fun() {
std::cout << "fun called" << std::endl; std::cout << "fun called" << std::endl;
...@@ -268,16 +259,16 @@ namespace jsgfParserTypes { ...@@ -268,16 +259,16 @@ namespace jsgfParserTypes {
class TermTRuleGenerator { class TermTRuleGenerator {
public: 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; void operator()(TermT & t) const;
std::vector<ruleTPtr> &myRules; std::vector<ruleT> &myRules;
nameToRuleT &myNamesToRules; nameToRuleT &myNamesToRules;
std::string myNonterminal; std::string myNonterminal;
}; };
class TermWrapperRuleGenerator : public boost::static_visitor<> { class TermWrapperRuleGenerator : public boost::static_visitor<> {
public: 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 void operator ()(TermT & t) const
{ {
TermTRuleGenerator myGenerator (myRules,myNamesToRules, myNonterminal); TermTRuleGenerator myGenerator (myRules,myNamesToRules, myNonterminal);
...@@ -288,23 +279,24 @@ namespace jsgfParserTypes { ...@@ -288,23 +279,24 @@ namespace jsgfParserTypes {
{ {
if (0 == tl.symbols.size()) if (0 == tl.symbols.size())
return; //Save a lot of time and some if cases below 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++) for (std::vector<jsgfParserTypes::SymbolT>::size_type i=0; i < tl.symbols.size(); i++)
{ {
if (0 == tl.symbols.at(i).type) 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(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))); 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; std::cout << "Added qi::lexeme[" << trim(tl.symbols.at(i).name) << "][" << myNonterminal << "] with name "<< myRules.back().name() << std::endl;
} }
else else
{ {
nameToRuleT::iterator pos = myNamesToRules.find(trim(tl.symbols.at(i).name)); nameToRuleT::iterator pos = myNamesToRules.find(trim(tl.symbols.at(i).name));
if (pos != myNamesToRules.end()) if (pos != myNamesToRules.end())
{ {
//std::cout << "Adding nonterminal '" << trim(tl.symbols.at(i).name) <<"' link to rule " << pos->second << std::endl; 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(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))); myRules.back().name(std::string("N:").append(trim(tl.symbols.at(i).name)));
//std::cout << "done" << std::endl; std::cout << "done" << std::endl;
} }
else else
{ {
...@@ -313,114 +305,106 @@ namespace jsgfParserTypes { ...@@ -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()); 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))]*/);
for (std::vector<SymbolT>::size_type i=1; i < tl.symbols.size();i++) 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 = 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() + " > " + myRules.at(i).name());
} }
r->name(r->name() + ")");
myRules.push_back(r); 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; nameToRuleT &myNamesToRules;
std::string myNonterminal; std::string myNonterminal;
}; };
void TermTRuleGenerator::operator()(TermT & t) const 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) 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); boost::apply_visitor(TermWrapperRuleGenerator(myRules,myNamesToRules,myNonterminal),node);
if (rulesSize != myRules.size()) if (rulesSize != myRules.size())
{ {
indices.push_back(myRules.size()-1); indices.push_back(myRules.size()-1);
} }
} }
ruleTPtr r=NULL;
if (indices.size() > 0) if (indices.size() > 0)
{ {
ruleT r;
if (t.optional) if (t.optional)
{ {
r = new ruleT (-(*myRules.at(indices.at(0)))); r = (-(myRules.at(indices.at(0)))[qi::_val = qi::_1]);
r->name("[" + (*myRules.at(indices.at(0))).name()); r.name("[" + myRules.at(indices.at(0)).name());
} }
else { else {
r = new ruleT ((*myRules.at(indices.at(0)))); r = (myRules.at(indices.at(0)));
r->name("(" + (*myRules.at(indices.at(0))).name()); 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) if (t.optional)
{ {
(*r) = (*r).copy() > (-(*myRules.at(indices.at(i)))); r = r.copy() > (-(myRules.at(indices.at(i))));
r->name(r->name() + " > " + (*myRules.at(indices.at(i))).name()); r.name(r.name() + " > " + myRules.at(indices.at(i)).name());
} }
else else
{ {
(*r) = (*r).copy() > (*myRules.at(indices.at(i))); r = r.copy() > myRules.at(indices.at(i));
r->name(r->name() + " > " + (*myRules.at(indices.at(i))).name()); r.name(r.name() + " > " + myRules.at(indices.at(i)).name());
} }
} }
if (t.optional) if (t.optional)
r->name(r->name() + "]"); r.name(r.name() + "]");
else else
r->name(r->name() + ")"); r.name(r.name() + ")");
} myRules.push_back(r);
if (NULL != r) std::cout << "Composed rule " << r.name() << std::endl;
{
myRules.push_back(r);
std::cout << "Composed rule " << r->name() << " with t.option: " << t.optional << std::endl;
} }
indices.clear(); indices.clear();
BOOST_FOREACH(TermWrapperT &node, t.orTerms) 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); boost::apply_visitor(TermWrapperRuleGenerator(myRules,myNamesToRules,myNonterminal),node);
if (rulesSize != myRules.size()) { if (rulesSize != myRules.size()) {
indices.push_back(myRules.size() - 1); indices.push_back(myRules.size() - 1);
} }
} }
r=NULL;
if (indices.size() > 0) if (indices.size() > 0)
{ {
r = new ruleT ((*myRules.at(indices.at(0)))); ruleT r;
if (t.optional) if (t.optional)
{ {
r = new ruleT (-(*myRules.at(indices.at(0)))); r = (-(myRules.at(indices.at(0))));
r->name("[" + (*myRules.at(indices.at(0))).name()); r.name("[" + myRules.at(indices.at(0)).name());
} }
else { else {
r = new ruleT ((*myRules.at(indices.at(0)))); r = myRules.at(indices.at(0));
r->name("(" + (*myRules.at(indices.at(0))).name()); 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) if (t.optional)
{ {
(*r) = (*r).copy() | (-(*myRules.at(indices.at(i)))); r = r.copy() | (-(myRules.at(indices.at(i))));
r->name(r->name() + " | " + (*myRules.at(indices.at(i))).name()); r.name(r.name() + " | " + (myRules.at(indices.at(i))).name());
} else { } else {
(*r) = (*r).copy() | (*myRules.at(indices.at(i))); r = r.copy() | (myRules.at(indices.at(i)));
r->name(r->name() + " | " + (*myRules.at(indices.at(i))).name()); r.name(r.name() + " | " + myRules.at(indices.at(i)).name());
} }
} }
if (t.optional) if (t.optional)
r->name(r->name() + "]"); r.name(r.name() + "]");
else else
r->name(r->name() + ")"); r.name(r.name() + ")");
} myRules.push_back(r);
if (NULL != r) std::cout << "Composed rule " << r.name() << std::endl;
{
myRules.push_back(r);
std::cout << "Composed rule " << r->name() << " with t.option: " << t.optional << std::endl;
} }
} }
} }
...@@ -440,7 +424,8 @@ public: ...@@ -440,7 +424,8 @@ public:
symbolParser = (terminal | nonterminal); 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)]; 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]; 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(')'); 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(']'); 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)])); 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: ...@@ -451,7 +436,7 @@ public:
optionalTerm %= (qi::lit('[') > *termParser % qi::lit('|') > qi::lit(']')); 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 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)];*/ 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)]; 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: ...@@ -464,14 +449,17 @@ public:
symbolListOptional.name("List of Optional Symbols"); symbolListOptional.name("List of Optional Symbols");
termParser.name("TermParser"); termParser.name("TermParser");
termList.name("TermList"); termList.name("TermList");
optionalTerm.name("OptionalTerm");
orTerm.name ("orTerm");
parenteseTerm.name("ParenteseTerm");
ruleParser.name("RuleParser"); ruleParser.name("RuleParser");
qi::debug(ruleParser); qi::debug(ruleParser);
qi::debug(termList);
qi::debug(symbolList); qi::debug(symbolList);
qi::debug(symbolListWrapper); qi::debug(termParser);
qi::debug(symbolParser); qi::debug(termList);
qi::debug(terminal); qi::debug(parenteseTerm);
qi::debug(identifier); qi::debug(orTerm);
qi::debug(optionalTerm);
qi::on_error<qi::fail> qi::on_error<qi::fail>
( (
jsgfParser jsgfParser
...@@ -496,13 +484,13 @@ public: ...@@ -496,13 +484,13 @@ public:
qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> optionalTerm; qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> optionalTerm;
qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> orTerm; qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> orTerm;
qi::rule<Iterator, jsgfParserTypes::TermLeafT(), ascii::space_type> symbolListOptional; 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> termList;
qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> termListList; qi::rule<Iterator, jsgfParserTypes::TermT(), ascii::space_type> termListList;
qi::rule<Iterator, jsgfParserTypes::RuleT(), ascii::space_type> ruleParser; qi::rule<Iterator, jsgfParserTypes::RuleT(), ascii::space_type> ruleParser;
qi::rule<Iterator, jsgfParserTypes::GrammarT(),ascii::space_type> jsgfParser; qi::rule<Iterator, jsgfParserTypes::GrammarT(),ascii::space_type> jsgfParser;
jsgfParserTypes::ruleNameToTermT rulesMap; jsgfParserTypes::ruleNameToTermT rulesMap;
std::vector<jsgfParserTypes::ruleTPtr > myRuleVector; std::vector<jsgfParserTypes::ruleT> myRuleVector;
bool sanitizeCheckGrammar(jsgfParserTypes::GrammarT &grammar, bool verbose = false) { bool sanitizeCheckGrammar(jsgfParserTypes::GrammarT &grammar, bool verbose = false) {
jsgfParserTypes::TermTPrinter myTermPrinter; jsgfParserTypes::TermTPrinter myTermPrinter;
...@@ -546,32 +534,30 @@ public: ...@@ -546,32 +534,30 @@ public:
jsgfParserTypes::nameToRuleT myNameToRule; jsgfParserTypes::nameToRuleT myNameToRule;
myRuleVector.clear(); myRuleVector.clear();
std::vector<jsgfParserTypes::ruleTPtr>::size_type increment=0; std::vector<jsgfParserTypes::ruleT>::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 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 (boost::make_shared<jsgfParserTypes::ruleT>()); myRuleVector.push_back ((qi::int_));
myRuleVector.push_back (new jsgfParserTypes::ruleT (qi::eps)); myRuleVector.back().name(grammar.rules.at(i).name);
(*myRuleVector.back()).name(grammar.rules.at(i).name);
myNameToRule.insert(std::make_pair(grammar.rules.at(i).name,increment)); myNameToRule.insert(std::make_pair(grammar.rules.at(i).name,increment));
increment++; increment++;
} }
increment=grammar.rules.size()-1; 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); 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); myRuleGenerator(grammar.rules.at(i-1).RHS);
std::string ruleResult; myRuleVector.at(increment) = (myRuleVector.back());
(*myRuleVector.at(increment)) = (*myRuleVector.back()) > qi::eps; myRuleVector.at(increment).name(grammar.rules.at(i-1).name);
ruleResult = (*myRuleVector.back()).name(); std::cout << "*** Rule " << myRuleVector.at(increment).name() << " = " << myRuleVector.back().name() << std::endl;
std::cout << "*** Rule " << myRuleVector.at(increment)->name() << " = " << ruleResult << std::endl;
//std::vector<jsgfParserTypes::ruleTPtr>::size_type sizeDiff = myRuleVector.size() - tempRuleVector.size(); //std::vector<jsgfParserTypes::ruleTPtr>::size_type sizeDiff = myRuleVector.size() - tempRuleVector.size();
increment--; increment--;
} }
return true; return true;
} }
std::vector<jsgfParserTypes::ruleTPtr> getRules() { std::vector<jsgfParserTypes::ruleT> getRules() {
return myRuleVector; return myRuleVector;
} }
//virtual ~parserToyExample(); //virtual ~parserToyExample();
......
#JSGF V1.0; #JSGF V1.0;
grammar ToBI_GPR; grammar ToBI_GPR;
public <task> = random (shit) [option]; public <task> = my [option];
\ No newline at end of file
...@@ -23,17 +23,17 @@ namespace ascii = boost::spirit::ascii; ...@@ -23,17 +23,17 @@ namespace ascii = boost::spirit::ascii;
template <typename Iterator> template <typename Iterator>
struct dynamicParser : qi::grammar<Iterator,std::string(), boost::spirit::ascii::space_type> { 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; rulestack = rules;
startRule = *(rulestack.at(0)); startRule = rulestack.at(0);
std::cout << "Startrule name: " << startRule.name() << std::endl; std::cout << "Startrule name: " << startRule.name() << std::endl;
for (unsigned long int i; i < rulestack.size();i++) for (unsigned long int i=0; i < rulestack.size();i++)
qi::debug(*rulestack.at(i)); qi::debug(rulestack.at(i));
qi::debug(startRule); qi::debug(startRule);
qi::on_error<qi::fail> qi::on_error<qi::fail>
( (
startRule startRule
, std::cout , std::cout
<< px::val("Error! Expecting ") << px::val("Error! Expecting ")
<< qi::_4 // what failed? << qi::_4 // what failed?
...@@ -43,9 +43,8 @@ struct dynamicParser : qi::grammar<Iterator,std::string(), boost::spirit::ascii: ...@@ -43,9 +43,8 @@ struct dynamicParser : qi::grammar<Iterator,std::string(), boost::spirit::ascii:
<< std::endl << std::endl
); );
} }
std::vector<qi::rule<Iterator,std::string(),qi::ascii::space_type>* > rulestack; std::vector<qi::rule<Iterator,std::string(),qi::ascii::space_type> > rulestack;
qi::rule<Iterator,std::string(), qi::ascii::space_type> startRule; qi::rule<Iterator,std::string(),qi::ascii::space_type> startRule;
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment