25 StateSet::Iterator its;
39 std::string annotation = word +
"-";
45 StackSymbolSet::Iterator it;
59 std::vector<Idx> oldPush, oldPop, push, pop;
60 std::vector<Idx>::const_iterator pushit, popit;
62 PopPushSet::const_iterator ppit;
68 for(tit = transRel.
Begin(); tit != transRel.
End(); tit++){
72 for(ppit = popPush.begin(); ppit != popPush.end(); ppit++){
76 for(popit = oldPop.begin(); popit != oldPop.end(); popit++){
79 pop.push_back(*popit);
87 oldPush = ppit->second;
88 for(pushit = oldPush.begin(); pushit != oldPush.end(); pushit++){
91 push.push_back(*pushit);
115 FD_DF(
"Nda(" << &pd <<
")");
123 StateSet::Iterator stateit;
124 Idx newStateAct, newStatePas;
125 std::string active =
"active";
126 std::string passive =
"passive";
127 std::map<Idx,std::pair<Idx,Idx> > stateMap;
153 stateMap.insert(std::make_pair(*stateit,std::make_pair(newStateAct,newStatePas)));
157 PopPushSet::const_iterator ppit;
158 std::vector<Idx> pop, push;
159 Idx startState, endState, oldStartState, oldEndState, oldEvent;
167 oldStartState = transit->X1;
168 oldEndState = transit->X2;
169 oldEvent = transit->Ev;
175 startState = stateMap.find(oldStartState)->second.first;
176 endState = stateMap.find(oldEndState)->second.first;
180 startState = stateMap.find(oldStartState)->second.second;
189 startState = stateMap.find(oldStartState)->second.second;
190 endState = stateMap.find(oldEndState)->second.second;
195 startState = stateMap.find(oldStartState)->second.first;
201 startState = stateMap.find(oldStartState)->second.first;
202 endState = stateMap.find(oldEndState)->second.first;
209 std::stringstream errstr;
210 errstr <<
"While executing Nda(): Found transition which is neither read nor pop nor push, which is not allowed" << std::endl;
211 throw Exception(
"Nda", errstr.str(), 1001);
226 std::stack<Idx> todo;
227 StateSet::Iterator stateit;
229 std::map<Idx,StateSet>::iterator mapit;
237 rMap[*stateit] = rPd.
States();
240 reachableStates.
Clear();
243 while(!todo.empty()){
245 Idx curr = todo.top();
247 reachableStates.
Insert(curr);
252 if(reachableStates.
Exists(transit->X2))
255 mapit = rMap.find(transit->X2);
259 if(mapit != rMap.end())
260 reachableStates.
InsertSet(mapit->second);
262 todo.push(transit->X2);
266 rMap[*stateit] = reachableStates;
292 return pd.vGenerator::Trim();
300 std::vector<Idx>::const_iterator ssit;
302 PopPushSet::iterator ppIt;
303 std::vector<Idx> transPop, transPush, newStack, tmpStack, initStack, currStack;
310 std::stack<std::pair<Idx,std::vector<Idx> > > todo;
313 std::set<std::pair<Idx,std::vector<Idx> > > done;
314 std::set<std::pair<Idx,std::vector<Idx> > >::iterator doneit;
323 std::pair<Idx,std::vector<Idx> > start = std::make_pair(rPd.
InitState(), initStack);
327 while (!todo.empty()) {
329 std::pair<Idx,std::vector<Idx> > curr = todo.top();
333 Idx currState = curr.first;
335 currStack = curr.second;
343 transPop = ppIt->first;
344 transPush = ppIt->second;
349 uint k = std::min(currStack.size(),transPop.size());
350 bool popPossible = std::equal(transPop.begin(),transPop.begin() +std::min(k,n),currStack.begin());
362 for(ssit = transPop.begin(); ssit != transPop.end(); ssit++){
363 usedStackSymbols.
Insert(*ssit);
366 for(ssit = transPush.begin(); ssit != transPush.end(); ssit++){
367 usedStackSymbols.
Insert(*ssit);
374 if(currStack.size() > transPop.size())
375 tmpStack.insert(tmpStack.begin(),currStack.begin()+transPop.size(),currStack.end());
379 newStack.insert(newStack.begin(),transPush.begin(),std::min(transPush.begin()+n, transPush.end()));
381 if(newStack.size() < n){
382 uint j = n - newStack.size();
384 newStack.insert(newStack.end(),tmpStack.begin(),std::min(tmpStack.begin()+j,tmpStack.end()));
388 std::pair<Idx,std::vector<Idx> > newSituation = std::make_pair(transIt->X2, newStack);
391 if (done.find(newSituation) == done.end()) {
393 todo.push(newSituation);
395 accStates.
Insert(transIt->X2);
403 inaccStates = rPd.
States() - accStates;
407 StackSymbolSet::Iterator currentssit;
420 return pd.vGenerator::Trim();
429 FD_DF(
"SPDA(" << &pd <<
")");
432 std::vector<std::pair<Idx,MergeTransition> > changes;
438 StateSet::Iterator stateit;
450 std::multimap<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > >
451 readSet, multiPushSet, popPushSet, unchangedSet, onlyStateChangeSet;
452 std::multimap<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > >::iterator multimapit;
453 std::pair<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > > transition;
454 std::pair<std::vector<Idx>, std::vector<Idx> > popPushPair;
455 std::vector<Idx> pop, push, pushEnd;
457 PopPushSet::const_iterator ppit;
471 transition = std::make_pair(*transit, *ppit);
477 readSet.insert(transition);
484 if (push.size() == 2 && push.back() == pop.front()) {
485 unchangedSet.insert(transition);
492 else if (pop == push && pop.size() == 1) {
493 onlyStateChangeSet.insert(transition);
497 else if (push.size() > 1) {
500 if (push.back() == pop.front()) {
501 multiPushSet.insert(transition);
507 popPushSet.insert(transition);
513 popPushSet.insert(transition);
518 unchangedSet.insert(transition);
523 unchangedSet.insert(transition);
533 for (multimapit = readSet.begin(); multimapit != readSet.end();
538 pop = multimapit->second.first;
539 push = multimapit->second.first;
541 multimapit->first.X1, pop, push);
546 rPd.
SetTransition(multimapit->first.X1, multimapit->first.Ev, newState, pop, push);
548 rPd.
SetTransition(newState, lambdaIdx, multimapit->first.X2, pop, multimapit->second.second);
552 if (pTransformHistory != NULL){
554 changes.push_back(std::make_pair(newState,oldTrans));
559 for (multimapit = multiPushSet.begin(); multimapit != multiPushSet.end();
564 pop = multimapit->second.first;
565 push = std::vector<Idx>(
566 multimapit->second.second.end() - multimapit->second.first.size() - 1,
567 multimapit->second.second.end());
569 multimapit->first.X1, pop, push);
574 rPd.
SetTransition(multimapit->first.X1, multimapit->first.Ev, newState, pop, push);
577 pop.push_back(multimapit->second.second.at( multimapit->second.second.size()
578 - multimapit->second.first.size() - 1));
579 push = std::vector<Idx>(multimapit->second.second.begin(),
580 multimapit->second.second.end() - multimapit->second.first.size());
581 rPd.
SetTransition(newState, lambdaIdx, multimapit->first.X2, pop, push);
585 if (pTransformHistory != NULL){
587 changes.push_back(std::make_pair(newState,oldTrans));
592 for (multimapit = popPushSet.begin(); multimapit != popPushSet.end();
597 pop = multimapit->second.first;
601 multimapit->first.X1, pop, push);
606 rPd.
SetTransition(multimapit->first.X1, lambdaIdx, newState, pop, push);
610 push = multimapit->second.second;
611 rPd.
SetTransition(newState, lambdaIdx, multimapit->first.X2, pop, push);
615 if (pTransformHistory != NULL){
617 changes.push_back(std::make_pair(newState,oldTrans));
624 if (!onlyStateChangeSet.empty()) {
630 for (multimapit = onlyStateChangeSet.begin();
631 multimapit != onlyStateChangeSet.end(); multimapit++) {
635 pop = multimapit->second.first;
636 push = multimapit->second.second;
642 multimapit->first.X1, pop, push);
647 rPd.
SetTransition(multimapit->first.X1, lambdaIdx, newState, pop, push);
655 rPd.
SetTransition(newState, lambdaIdx, multimapit->first.X2, pop, push);
658 if (pTransformHistory != NULL){
660 changes.push_back(std::make_pair(newState,oldTrans));
669 for (multimapit = unchangedSet.begin(); multimapit != unchangedSet.end();
673 pop = multimapit->second.first;
674 push = multimapit->second.second;
688 rPd.
SetTransition(multimapit->first.X1, multimapit->first.Ev,
689 multimapit->first.X2, pop, push);
694 if (pTransformHistory != NULL)
695 pTransformHistory->push_back(changes);
699 if (popPushSet.size() != 0) {
703 if (popPushSet.size() + onlyStateChangeSet.size() + readSet.size()
704 + multiPushSet.size() != 0) {
706 rPd =
SPDA(rPd, pTransformHistory);
722 TransformationHistoryVec::const_reverse_iterator historyit;
723 std::vector<std::pair<Idx,MergeTransition> > merges;
724 std::vector<std::pair<Idx,MergeTransition> >::iterator mergeit;
725 std::vector<Idx> pop,push;
726 std::vector<Idx>::iterator it;
732 for (historyit = history.rbegin(); historyit != history.rend();
738 for (mergeit = merges.begin(); mergeit != merges.end(); ++mergeit) {
740 Idx state = mergeit->first;
753 for(it = pop.begin(); it != pop.end(); ++it)
755 for(it = push.begin(); it != push.end(); ++it)
784 std::set<GrammarProduction>::const_iterator proit;
786 PopPushSet::const_iterator ppit;
798 if (termPtr != NULL) {
800 if (termPtr->IsLambda()) {
805 DEBUG_PRINTF(debug,
"Find Tfinal P = " + (*proit).Str(),
"");
814 std::vector<Idx> pop = ppit->first;
815 std::vector<Idx> push = ppit->second;
819 && pop.front() == lhs.
OnStack().front()
825 DEBUG_PRINTF(debug,
"Find T2 P = "+ (*proit).Str(),
"");
840 std::vector<Idx> pop = ppit->first;
841 std::vector<Idx> push = ppit->second;
844 std::tr1::dynamic_pointer_cast<
Nonterminal>(rhs.back());
847 if (nontermPtr != NULL
848 && transit->X2 == nontermPtr->StartState()
849 && transit->Ev == termPtr->Event()
850 && pop.front() == lhs.
OnStack().front()
851 && push.front() == lhs.
OnStack().front()) {
855 DEBUG_PRINTF(debug,
"Find T1 P = "+ (*proit).Str(),
"");
857 }
else if (nontermPtr == NULL) {
859 FD_WARN(
"RemainingPd: Find not identifiable production" + (*proit).Str());
868 std::tr1::dynamic_pointer_cast<
Nonterminal>(rhs.front());
869 if (nonterm1Ptr != NULL) {
870 if (rhs.size() == 1) {
878 std::vector<Idx> pop = ppit->first;
879 std::vector<Idx> push = ppit->second;
882 if (transit->X2 == nonterm1Ptr->StartState()
883 && pop.front() == lhs.
OnStack().front()
887 == nonterm1Ptr->OnStack().front()
888 && push.back() == lhs.
OnStack().front()
893 DEBUG_PRINTF(debug,
"Find T3L P = "+ (*proit).Str(),
"");
906 std::vector<Idx> pop = ppit->first;
907 std::vector<Idx> push = ppit->second;
914 if (nonterm2Ptr != NULL
915 && transit->X2 == nonterm1Ptr->StartState()
916 && pop.front() == lhs.
OnStack().front()
920 == nonterm1Ptr->OnStack().front()
922 == nonterm2Ptr->OnStack().front()
927 DEBUG_PRINTF(debug,
"Find T3R P = "+ (*proit).Str(),
"");
928 }
else if (nonterm2Ptr == NULL) {
930 FD_WARN(
"RemainingPd: Find not identifiable production" + (*proit).Str());
949 FD_WARN(
"RemoveLambdaPop: Generator is not deterministic ! Perhaps not all lambda popping transitions will remove.")
1001 StackSymbolSet::Iterator ssit;
1002 std::vector<Idx> examinedPop, examinedPush, newPop, newPush;
1004 for (tit = transRel.
Begin(); tit != transRel.
End(); tit++) {
1010 examinedPop = rPd.
PopPush(*tit).begin()->first;
1011 examinedPush = rPd.
PopPush(*tit).begin()->second;
1024 newPop.push_back(*ssit);
1027 newPush.insert(newPush.end(), examinedPush.begin(),
1028 examinedPush.end());
1029 newPush.push_back(*ssit);
1045 FD_DF(
"Sp2Lr(" << &xrPd <<
"," << n <<
")");
1050 StateSet::Iterator stateit1, stateit2;
1051 EventSet::Iterator eventit;
1053 StackSymbolSet::Iterator ssit;
1054 PopPushSet::const_iterator ppit, ppit2, ppit3;
1055 std::vector<Idx>::const_iterator popit, pushit;
1056 std::vector<Idx> ssVector, pop, push;
1057 std::map<Idx,StateSet> reachableStatesMap;
1063 if(!ignorReducible){
1092 ssVector.push_back(*ssit);
1104 FD_DF(
"Sp2Lr: Inserting" + gp.
Str())
1113 push = ppit->second;
1117 Idx qi = transit->X1;
1118 Idx qj = transit->X2;
1123 std::stringstream errstr;
1124 errstr <<
"While executing Sp2Lr(): Found transition that push lambda but don't read lambda, "
1125 "so is neither read nor pop, which is not allowed" << std::endl;
1126 throw Exception(
"Sp2Lr", errstr.str(), 1001);
1137 rhs.push_back(tPtr);
1157 Idx qi = transit->X1;
1158 Idx qj = transit->X2;
1159 Idx a = transit->Ev;
1160 std::vector<Idx> b = ppit->first;
1161 push = ppit->second;
1168 std::stringstream errstr;
1169 errstr <<
"While executing Sp2Lr(): Found transition that pop != push but don't read lambda, so is neither read nor pop nor push, which is not allowed" << std::endl;
1170 throw Exception(
"Sp2Lr", errstr.str(), 1001);
1192 rhs.push_back(tPtr);
1193 rhs.push_back(ntRhsPtr);
1202 StateSet reachFromTrg = reachableStatesMap.find(qj)->second;
1203 for (stateit1 = reachFromTrg.
Begin(); stateit1 != reachFromTrg.
End(); stateit1++) {
1223 rhs.push_back(tPtr);
1224 rhs.push_back(ntRhsPtr);
1241 else if (push.size() == 2) {
1244 c.push_back(push.front());
1263 rhs.push_back(ntRhsPtr);
1271 StateSet reachFromTrg = reachableStatesMap.find(qj)->second;
1272 for (stateit1 = reachFromTrg.
Begin(); stateit1 != reachFromTrg.
End(); stateit1++) {
1297 rhs.push_back(ntRhs1Ptr);
1298 rhs.push_back(ntRhs2Ptr);
1309 if (tmpPd.
IsStackSymbolLambda((ppit2->second).front()) && (ppit2->first).front() == push.front()) {
1311 Idx qp = transit2->X2;
1314 StateSet reachFromqs = reachableStatesMap.find(qs)->second;
1315 for (stateit2 = reachFromqs.
Begin(); stateit2 != reachFromqs.
End(); ++stateit2) {
1323 && (ppit3->first).front() == push.back()) {
1325 Idx qt = transit3->X2;
1348 rhs.push_back(ntRhs1Ptr);
1349 rhs.push_back(ntRhs2Ptr);
1381 std::set<Nonterminal> rSet;
1383 GrammarSymbolVector::const_iterator wit;
1384 std::set<Nonterminal>::const_iterator ntit;
1386 for(wit = w.begin(); wit != w.end(); wit++){
1392 ntit = symbolSet.find(*nt);
1395 if(ntit != symbolSet.end()){
1406 std::set<Nonterminal>
Rnpp1(
const Grammar& gr,
const std::set<Nonterminal>& ntSet){
1408 std::set<Nonterminal> rSet, filterSet;
1412 std::set<GrammarProduction>::const_iterator pit;
1422 if(std::includes(ntSet.begin(), ntSet.end(), filterSet.begin(), filterSet.end())){
1424 rSet.insert(pit->Lhs());
1433 std::set<Nonterminal>
Rnppl(
const Grammar& gr,
const std::set<Nonterminal>& ntSet){
1436 std::set<Nonterminal> rSet =
Rnpp1(gr,ntSet);
1440 rSet =
Rnppl(gr,rSet);
1454 std::set<Nonterminal> removableNts =
Rnppl(gr,std::set<Nonterminal>());
1456 std::set<GrammarProduction> productions;
1459 if(removableNts.find(gr.
StartSymbol()) != removableNts.end()){
1461 std::set<GrammarProduction>::const_iterator gpit;
1469 symbols.push_back(aPtr);
1471 std::set<Nonterminal> filteredSet;
1476 if(std::includes(removableNts.begin(), removableNts.end(), filteredSet.begin(), filteredSet.end())){
1477 productions.insert(*gpit);
1486 rGr.InsNonterminals(removableNts);
1489 rGr.InsGrammarProductions(productions);
1505 std::set<GrammarProduction> todoProductions, reachableProductions;
1506 std::set<GrammarProduction>::const_iterator gpit;
1507 std::set<Nonterminal> usedNonterminals;
1515 todoProductions.insert(*gpit);
1520 while(!todoProductions.empty()){
1524 todoProductions.erase(currentGp);
1527 reachableProductions.insert(currentGp);
1531 usedNonterminals.insert(filtered.begin(), filtered.end());
1537 if(usedNonterminals.find(gpit->Lhs()) != usedNonterminals.end()){
1538 todoProductions.insert(*gpit);
1544 for(gpit = reachableProductions.begin(); gpit != reachableProductions.end(); gpit++){
1545 todoProductions.erase(*gpit);
1574 StateSet::Iterator stateit;
1576 PopPushSet::const_iterator ppIt;
1578 Idx src,trg,lastState;
1579 std::vector<Idx> oldPop,oldPush,pop,push;
1580 std::vector<Idx>::iterator popit;
1582 std::map<std::vector<Idx>,
Idx> popStateMap;
1583 std::map<std::vector<Idx>,
Idx>::iterator mapit;
1590 popStateMap.clear();
1594 oldPop = ppIt->first;
1595 oldPush = ppIt->second;
1599 std::stringstream errstr;
1600 errstr <<
"While executing RemoveMultPop(): Found transition that pop lambda, which is not allowed !" << std::endl;
1601 throw Exception(
"RemoveMultPop", errstr.str(), 1001);
1605 lastState = transit->X1;
1606 for (popit = oldPop.begin(); popit != oldPop.end(); ++popit) {
1607 std::vector<Idx> tmpPop(oldPop.begin(),popit+1);
1611 mapit = popStateMap.find(tmpPop);
1612 if(mapit != popStateMap.end()){
1613 trg = mapit->second;
1617 popStateMap[tmpPop] = trg;
1622 pop.push_back(*popit);
1626 if(std::distance(popit, oldPop.end() ) == 1)
1628 push.push_back(*popit);
1631 push.push_back(lambdaSS);
1643 pop.push_back(oldPop.back());
1646 rPd.
SetTransition(src, transit->Ev, transit->X2, pop, oldPush);
1667 titEnd = transByX2.
EndByX2(trg);
1670 for(transit = transByX2.
BeginByX2(trg); transit != titEnd; ++transit){
1671 if(rPd.
PopPush(*transit).empty())
1676 count += rPd.
PopPush(*transit).size();
1688 std::set<std::pair <Transition,Transition> > res,tmp;
1696 transRel2Begin, transRel2End, transRel2it;
1703 for(transRel1it = transRel1Begin; transRel1it != transRel1End ; ++transRel1it){
1704 Idx q2 = transRel1it->X2;
1727 bool canNotMerge =
false;
1728 transRel2it = transRel2Begin;
1729 while((transRel2it != transRel2End) && !canNotMerge){
1731 canNotMerge = canNotMerge
1735 || (transRel2it->X1 == transRel2it->X2)
1743 tmp.insert(std::make_pair(*transRel1it,*transRel2it));
1748 res.insert(tmp.begin(),tmp.end());
1761 std::multimap<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > > toRmTrans;
1762 std::multimap<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > >::iterator toRmTransit;
1764 std::pair<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > > pdtransition;
1765 std::pair<std::vector<Idx>, std::vector<Idx> > pp;
1766 std::vector<Idx> pop1,push1, pop2, push2, newPop, newPush;
1771 std::set<std::pair <Transition,Transition> > pairs ;
1772 std::set<std::pair <Transition,Transition> >::iterator pairsIt;
1773 PopPushSet::const_iterator pp1it, pp2it;
1782 bool merged =
false;
1785 for(pairsIt = pairs.begin(); pairsIt != pairs.end(); ++pairsIt){
1787 trans1 = pairsIt->first;
1788 trans2 = pairsIt->second;
1790 DEBUG_PRINTF(debug,
"CombinedTransitions: Try ("+trans1.
Str()+
"/"+trans2.
Str()+
")",
"");
1795 pop1 = pp1it->first;
1796 push1 = pp1it->second;
1799 std::vector<Idx> pop2 = pp2it->first;
1800 std::vector<Idx> push2 = pp2it->second;
1803 if(std::equal(push1.begin(),push1.begin() + std::min(push1.size(),pop2.size()) ,pop2.begin())){
1811 if(push1.size() <= pop2.size()){
1813 newPop.insert(newPop.end(),pop2.begin()+ push1.size(), pop2.end());
1816 if(newPop.size() == 1){
1820 if(pop2.size() <= push1.size())
1822 newPush.insert(newPush.end(),push1.begin() + pop2.size(), push1.end());
1825 if(newPop.empty()) newPop.push_back(lambda);
1826 if(newPush.empty())newPush.push_back(lambda);
1829 pp = std::make_pair(pop1,push1);
1830 pdtransition = std::make_pair(trans1,pp);
1831 toRmTrans.insert(pdtransition);
1833 pp = std::make_pair(pop2,push2);
1834 pdtransition = std::make_pair(trans2,pp);
1835 toRmTrans.insert(pdtransition);
1843 "CombinedTransitions: Merge ("+ trans1.
Str()+
" | "+ trans2.
Str() +
") to "+ nt.
Str() +
"\n",
"");
1849 DEBUG_PRINTF(debug,
"CombinedTransitions: New Pop != 1",
"");
1853 DEBUG_PRINTF(debug,
"CombinedTransitions: Pop - Push incompatible",
"");
1859 for(toRmTransit = toRmTrans.begin(); toRmTransit != toRmTrans.end(); ++toRmTransit)
1860 rPd.
ClrTransition(toRmTransit->first,toRmTransit->second.first,toRmTransit->second.second);
1868 DEBUG_PRINTF(debug,
"CombinedTransitions: Pairs empty",
"");
1875 for (; tit != tit_end; ++tit) {
1876 succStates.
Insert(tit->X2);
1892 StateSet::Iterator it;
1908 while(!todo.
Empty()){
1911 for(it = todo.
Begin(); it != todo.
End(); ++it){