21 std::set<Idx> successorStates;
28 if(*gotoGen.
Symbol(*transit) == *symbol){
29 successorStates.insert(transit->X2);
32 return successorStates;
42 std::vector<Idx> rStateSequence;
51 if(*word.front() != *lambda){
58 std::set<Idx> nextStateSet =
GeneratorGoto(gotoGen, startState, frontSymbol);
60 if(!nextStateSet.empty()){
61 nextState = *nextStateSet.begin();
64 rStateSequence.push_back(nextState);
69 std::vector<Idx> remainingSequence =
GeneratorGotoSeq(gotoGen, nextState, remainingWord);
72 rStateSequence.insert(rStateSequence.end(), remainingSequence.begin(), remainingSequence.end());
77 return rStateSequence;
88 std::set<Lr1ParserAction> rActions;
94 StateSet::Iterator stateit;
98 std::set<Terminal>::const_iterator tit;
112 std::set<Idx> succStateSet =
GeneratorGoto(gotoGen, *stateit, aPtr);
116 if(succStateSet.size() != 1){
121 Idx succState = *succStateSet.begin();
123 std::set<Lr1Configuration>::const_iterator configit;
125 for(configit = gotoGen.
ConfigSet(*stateit).begin(); configit != gotoGen.
ConfigSet(*stateit).end(); configit++){
133 beforeDot = configit->BeforeDot();
134 if(**beforeDot.begin() == *lambda){
137 afterDot = configit->AfterDot();
138 if(**afterDot.begin() == *lambda){
144 rhs.insert(rhs.end(), afterDot.begin(), afterDot.end());
146 rhs.push_back(lambdaPtr);
162 if(!configit->Lookahead().IsLambda()){
165 w2z.push_back(lookaheadPtr);
169 std::set<Terminal> firstTerminals =
FirstLeq1(augGr, k - 1, w2z);
171 std::set<Terminal>::const_iterator firsttit;
173 for(firsttit = firstTerminals.begin(); firsttit != firstTerminals.end(); firsttit++){
176 if(!firsttit->IsLambda()){
177 std::stringstream errstr;
178 errstr <<
"While executing LrpRules(): Constructing shift actions and the terminal " << firsttit->Str() <<
", which was expected to be lambda" << std::endl;
179 throw Exception(
"LrpRules", errstr.str(), 1001);
184 std::vector<Idx> stateStack;
185 stateStack.push_back(*stateit);
189 stateStack.push_back(succState);
195 rActions.insert(action);
209 std::set<Lr1ParserAction> rActions;
214 StateSet::Iterator stateit;
218 std::set<Lr1Configuration>::const_iterator configit;
220 for(configit = gotoGen.
ConfigSet(*stateit).begin(); configit != gotoGen.
ConfigSet(*stateit).end(); configit++){
224 if(**configit->BeforeDot().begin() != *lambda){
237 std::set<Idx> succStateSet =
GeneratorGoto(gotoGen, *stateit, aPtr);
240 if(succStateSet.size() != 1){
243 Idx succState = *succStateSet.begin();
246 std::vector<Idx> succStateSequence =
GeneratorGotoSeq(gotoGen, *stateit, configit->AfterDot());
249 std::vector<Idx> qQs;
250 qQs.push_back(*stateit);
251 qQs.insert(qQs.end(), succStateSequence.begin(), succStateSequence.end());
254 Idx lastState = qQs.back();
256 std::set<Lr1Configuration>::const_iterator lsconfigit;
258 for(lsconfigit = gotoGen.
ConfigSet(lastState).begin(); lsconfigit != gotoGen.
ConfigSet(lastState).end(); lsconfigit++){
261 if(lsconfigit->Lhs() != configit->Lhs()){
264 if(!
EqualsGsVector(lsconfigit->BeforeDot(), configit->AfterDot())){
267 if(**lsconfigit->AfterDot().begin() != *lambda){
272 Terminal lookahead(lsconfigit->Lookahead());
279 std::vector<Idx> stateStack;
280 stateStack.push_back(*stateit);
281 stateStack.push_back(succState);
287 rActions.insert(action);
300 std::set<Lr1ParserAction> rActions;
306 std::set<Lr1ParserAction> reduceActions =
LrpReduceRules(gr, augGr, gotoGen, k);
307 rActions.insert(reduceActions.begin(), reduceActions.end());
333 word.push_back(augSymbolPtr);
334 word.push_back(q0Ptr);
338 word.push_back(augSymbolPtr);
342 if(!succStateSetAug.empty() && !succStateSeqAugQ0.empty() && !succStateSeqAugQ0Aug.empty()){
345 Idx succStateAug = *succStateSetAug.begin();
348 Idx lastStateAugQ0 = succStateSeqAugQ0.back();
351 Idx lastStateAugQ0Aug = succStateSeqAugQ0Aug.back();
353 StateSet::Iterator stateit;
357 if(*stateit != gotoGen.
InitState() && *stateit != lastStateAugQ0Aug){
362 std::set<Terminal>::const_iterator tit;
375 std::set<Lr1ParserAction> actions =
LrpRules(gr, augGr, gotoGen, k);
377 std::set<Lr1ParserAction>::const_iterator actit;
379 for(actit = actions.begin(); actit != actions.end(); actit++){
395 std::set<Lr1ParserAction> tmp;
396 std::set<Lr1ParserAction>::iterator it;
401 for (it = parser.
Actions().begin(); it != parser.
Actions().end(); ++it) {
402 if (it->Rhs().NextTerminal() != parser.
AugSymbol()) {
434 std::vector<Idx> res;
439 std::map<std::pair<Idx,Terminal>,
Idx >::iterator mapit;
440 std::vector<Idx>::const_iterator it;
444 for(it = rVec.begin(); it != rVec.end(); ++it ){
445 std::pair<Idx,Terminal> p = std::make_pair(*it,lambda);
448 if(std::distance(it,rVec.end()) == 1)
449 p = std::make_pair(*it,term);
451 mapit = indexMap.find(p);
454 if(mapit != indexMap.end()){
455 res.push_back(mapit->second);
458 Idx i = indexMap.size()+1;
459 indexMap.insert(std::make_pair(p,i));
475 std::map<std::pair<Idx,Terminal>,
Idx > indexMap;
476 std::map<std::pair<Idx,Terminal>,
Idx >::iterator mapit;
477 std::set<Idx> nonterms;
478 std::set<Lr1ParserAction>::iterator actionsit;
485 std::pair<Idx,Terminal> start = std::make_pair(parser.
StartState(),lambda);
490 for (actionsit = parser.
Actions().begin(); actionsit != parser.
Actions().end();
548 std::set<Idx>::iterator fit;
550 mapit = indexMap.find(std::make_pair(*fit,lambda));
551 if(mapit != indexMap.end())
556 for(mapit = indexMap.begin(); mapit != indexMap.end(); ++mapit){
557 nonterms.insert(mapit->second);
576 std::string statepre =
"q";
577 std::string stacksympre =
"x";
582 std::set<Idx>::iterator it;
583 std::set<Terminal>::iterator termit;
584 std::set<Lr1ParserAction>::iterator actionit;
596 DEBUG_PRINTF(debug,
"LrParser2EPDA: Set states and stack symbols",
"");
597 FD_DF(
"LrParser2EPDA: Set states and stack symbols");
606 DEBUG_PRINTF(debug,
"LrParser2EPDA: Set final states",
"");
607 FD_DF(
"LrParser2EPDA: Set final states");
610 for (termit = parser.
Terminals().begin(); termit != parser.
Terminals().end(); ++termit){
615 FD_DF(
"LrParser2EPDA: Set events");
622 DEBUG_PRINTF(debug,
"LrParser2EPDA: Set stack bottom: "+bottom,
"");
623 FD_DF(
"LrParser2EPDA: Set stack bottom: "+bottom);
629 for (actionit = parser.
Actions().begin(); actionit != parser.
Actions().end(); ++actionit) {
641 std::vector<std::string> popTrans(pop.size());
642 std::vector<std::string> pushTrans(push.size());
647 std::transform(pop.rbegin(), pop.rend(), popTrans.begin(),
ToStringInteger);
648 std::transform(push.rbegin(), push.rend(), pushTrans.begin(),
ToStringInteger);
650 if (popTrans.empty())
652 if (pushTrans.empty())
658 DEBUG_PRINTF(debug,
"LrParser2EPDA: Set transitions",
"");
659 FD_DF(
"LrParser2EPDA: Set transitions");