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);
68 std::vector<Idx> remainingSequence =
GeneratorGotoSeq(gotoGen, nextState, remainingWord);
71 rStateSequence.insert(rStateSequence.end(), remainingSequence.begin(), remainingSequence.end());
74 return rStateSequence;
83 std::set<Lr1ParserAction> rActions;
89 StateSet::Iterator stateit;
93 std::set<Terminal>::const_iterator tit;
107 std::set<Idx> succStateSet =
GeneratorGoto(gotoGen, *stateit, aPtr);
111 if(succStateSet.size() != 1){
116 Idx succState = *succStateSet.begin();
118 std::set<Lr1Configuration>::const_iterator configit;
120 for(configit = gotoGen.
ConfigSet(*stateit).begin(); configit != gotoGen.
ConfigSet(*stateit).end(); configit++){
128 beforeDot = configit->BeforeDot();
129 if(**beforeDot.begin() == *lambda){
132 afterDot = configit->AfterDot();
133 if(**afterDot.begin() == *lambda){
139 rhs.insert(rhs.end(), afterDot.begin(), afterDot.end());
141 rhs.push_back(lambdaPtr);
157 if(!configit->Lookahead().IsLambda()){
160 w2z.push_back(lookaheadPtr);
164 std::set<Terminal> firstTerminals =
FirstLeq1(augGr, k - 1, w2z);
166 std::set<Terminal>::const_iterator firsttit;
168 for(firsttit = firstTerminals.begin(); firsttit != firstTerminals.end(); firsttit++){
171 if(!firsttit->IsLambda()){
172 std::stringstream errstr;
173 errstr <<
"While executing LrpRules(): Constructing shift actions and the terminal " << firsttit->Str() <<
", which was expected to be lambda" << std::endl;
174 throw Exception(
"LrpRules", errstr.str(), 1001);
179 std::vector<Idx> stateStack;
180 stateStack.push_back(*stateit);
184 stateStack.push_back(succState);
190 rActions.insert(action);
204 std::set<Lr1ParserAction> rActions;
209 StateSet::Iterator stateit;
213 std::set<Lr1Configuration>::const_iterator configit;
215 for(configit = gotoGen.
ConfigSet(*stateit).begin(); configit != gotoGen.
ConfigSet(*stateit).end(); configit++){
219 if(**configit->BeforeDot().begin() != *lambda){
232 std::set<Idx> succStateSet =
GeneratorGoto(gotoGen, *stateit, aPtr);
235 if(succStateSet.size() != 1){
238 Idx succState = *succStateSet.begin();
241 std::vector<Idx> succStateSequence =
GeneratorGotoSeq(gotoGen, *stateit, configit->AfterDot());
244 std::vector<Idx> qQs;
245 qQs.push_back(*stateit);
246 qQs.insert(qQs.end(), succStateSequence.begin(), succStateSequence.end());
249 Idx lastState = qQs.back();
251 std::set<Lr1Configuration>::const_iterator lsconfigit;
253 for(lsconfigit = gotoGen.
ConfigSet(lastState).begin(); lsconfigit != gotoGen.
ConfigSet(lastState).end(); lsconfigit++){
256 if(lsconfigit->Lhs() != configit->Lhs()){
259 if(!
EqualsGsVector(lsconfigit->BeforeDot(), configit->AfterDot())){
262 if(**lsconfigit->AfterDot().begin() != *lambda){
267 Terminal lookahead(lsconfigit->Lookahead());
274 std::vector<Idx> stateStack;
275 stateStack.push_back(*stateit);
276 stateStack.push_back(succState);
282 rActions.insert(action);
295 std::set<Lr1ParserAction> rActions;
301 std::set<Lr1ParserAction> reduceActions =
LrpReduceRules(gr, augGr, gotoGen, k);
302 rActions.insert(reduceActions.begin(), reduceActions.end());
328 word.push_back(augSymbolPtr);
329 word.push_back(q0Ptr);
333 word.push_back(augSymbolPtr);
337 if(!succStateSetAug.empty() && !succStateSeqAugQ0.empty() && !succStateSeqAugQ0Aug.empty()){
340 Idx succStateAug = *succStateSetAug.begin();
343 Idx lastStateAugQ0 = succStateSeqAugQ0.back();
346 Idx lastStateAugQ0Aug = succStateSeqAugQ0Aug.back();
348 StateSet::Iterator stateit;
352 if(*stateit != gotoGen.
InitState() && *stateit != lastStateAugQ0Aug){
357 std::set<Terminal>::const_iterator tit;
370 std::set<Lr1ParserAction> actions =
LrpRules(gr, augGr, gotoGen, k);
372 std::set<Lr1ParserAction>::const_iterator actit;
374 for(actit = actions.begin(); actit != actions.end(); actit++){
390 std::set<Lr1ParserAction> tmp;
391 std::set<Lr1ParserAction>::iterator it;
396 for (it = parser.
Actions().begin(); it != parser.
Actions().end(); ++it) {
397 if (it->Rhs().NextTerminal() != parser.
AugSymbol()) {
429 std::vector<Idx> res;
434 std::map<std::pair<Idx,Terminal>,
Idx >::iterator mapit;
435 std::vector<Idx>::const_iterator it;
439 for(it = rVec.begin(); it != rVec.end(); ++it ){
440 std::pair<Idx,Terminal> p = std::make_pair(*it,lambda);
443 if(std::distance(it,rVec.end()) == 1)
444 p = std::make_pair(*it,term);
446 mapit = indexMap.find(p);
449 if(mapit != indexMap.end()){
450 res.push_back(mapit->second);
453 Idx i = indexMap.size()+1;
454 indexMap.insert(std::make_pair(p,i));
470 std::map<std::pair<Idx,Terminal>,
Idx > indexMap;
471 std::map<std::pair<Idx,Terminal>,
Idx >::iterator mapit;
472 std::set<Idx> nonterms;
473 std::set<Lr1ParserAction>::iterator actionsit;
480 std::pair<Idx,Terminal> start = std::make_pair(parser.
StartState(),lambda);
485 for (actionsit = parser.
Actions().begin(); actionsit != parser.
Actions().end();
543 std::set<Idx>::iterator fit;
545 mapit = indexMap.find(std::make_pair(*fit,lambda));
546 if(mapit != indexMap.end())
551 for(mapit = indexMap.begin(); mapit != indexMap.end(); ++mapit){
552 nonterms.insert(mapit->second);
571 std::string statepre =
"q";
572 std::string stacksympre =
"x";
577 std::set<Idx>::iterator it;
578 std::set<Terminal>::iterator termit;
579 std::set<Lr1ParserAction>::iterator actionit;
591 DEBUG_PRINTF(debug,
"LrParser2EPDA: Set states and stack symbols",
"");
592 FD_DF(
"LrParser2EPDA: Set states and stack symbols");
601 DEBUG_PRINTF(debug,
"LrParser2EPDA: Set final states",
"");
602 FD_DF(
"LrParser2EPDA: Set final states");
605 for (termit = parser.
Terminals().begin(); termit != parser.
Terminals().end(); ++termit){
610 FD_DF(
"LrParser2EPDA: Set events");
617 DEBUG_PRINTF(debug,
"LrParser2EPDA: Set stack bottom: "+bottom,
"");
618 FD_DF(
"LrParser2EPDA: Set stack bottom: "+bottom);
624 for (actionit = parser.
Actions().begin(); actionit != parser.
Actions().end(); ++actionit) {
636 std::vector<std::string> popTrans(pop.size());
637 std::vector<std::string> pushTrans(push.size());
642 std::transform(pop.rbegin(), pop.rend(), popTrans.begin(),
ToStringInteger);
643 std::transform(push.rbegin(), push.rend(), pushTrans.begin(),
ToStringInteger);
645 if (popTrans.empty())
647 if (pushTrans.empty())
653 DEBUG_PRINTF(debug,
"LrParser2EPDA: Set transitions",
"");
654 FD_DF(
"LrParser2EPDA: Set transitions");