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(
"A 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);
725 TransformationHistoryVec::const_reverse_iterator historyit;
726 std::vector<std::pair<Idx,MergeTransition> > merges;
727 std::vector<std::pair<Idx,MergeTransition> >::iterator mergeit;
728 std::vector<Idx> pop,push;
729 std::vector<Idx>::iterator it;
735 for (historyit = history.rbegin(); historyit != history.rend();
741 for (mergeit = merges.begin(); mergeit != merges.end(); ++mergeit) {
743 Idx state = mergeit->first;
756 for(it = pop.begin(); it != pop.end(); ++it)
758 for(it = push.begin(); it != push.end(); ++it)
787 std::set<GrammarProduction>::const_iterator proit;
789 PopPushSet::const_iterator ppit;
803 if (termPtr->IsLambda()) {
808 DEBUG_PRINTF(debug,
"Find Tfinal P = " + (*proit).Str(),
"");
817 std::vector<Idx> pop = ppit->first;
818 std::vector<Idx> push = ppit->second;
822 && pop.front() == lhs.
OnStack().front()
828 DEBUG_PRINTF(debug,
"Find T2 P = "+ (*proit).Str(),
"");
843 std::vector<Idx> pop = ppit->first;
844 std::vector<Idx> push = ppit->second;
847 std::dynamic_pointer_cast<
Nonterminal>(rhs.back());
851 if(transit->X2 == nontermPtr->StartState()
852 && transit->Ev == termPtr->Event()
853 && pop.front() == lhs.
OnStack().front()
854 && push.front() == lhs.
OnStack().front()) {
858 DEBUG_PRINTF(debug,
"Find T1 P = "+ (*proit).Str(),
"");
861 FD_WARN(
"RemainingPd: Find not identifiable production" + (*proit).Str());
870 std::dynamic_pointer_cast<
Nonterminal>(rhs.front());
872 if (rhs.size() == 1) {
880 std::vector<Idx> pop = ppit->first;
881 std::vector<Idx> push = ppit->second;
884 if (transit->X2 == nonterm1Ptr->StartState()
885 && pop.front() == lhs.
OnStack().front()
889 == nonterm1Ptr->OnStack().front()
890 && push.back() == lhs.
OnStack().front()
895 DEBUG_PRINTF(debug,
"Find T3L P = "+ (*proit).Str(),
"");
908 std::vector<Idx> pop = ppit->first;
909 std::vector<Idx> push = ppit->second;
917 if(transit->X2 == nonterm1Ptr->StartState()
918 && pop.front() == lhs.
OnStack().front()
922 == nonterm1Ptr->OnStack().front()
924 == nonterm2Ptr->OnStack().front()
929 DEBUG_PRINTF(debug,
"Find T3R P = "+ (*proit).Str(),
"");
933 FD_WARN(
"RemainingPd: Find not identifiable production" + (*proit).Str());
952 FD_WARN(
"RemoveLambdaPop: Generator is not deterministic ! Perhaps not all lambda popping transitions will remove.")
1004 StackSymbolSet::Iterator ssit;
1005 std::vector<Idx> examinedPop, examinedPush, newPop, newPush;
1007 for (tit = transRel.
Begin(); tit != transRel.
End(); tit++) {
1013 examinedPop = rPd.
PopPush(*tit).begin()->first;
1014 examinedPush = rPd.
PopPush(*tit).begin()->second;
1027 newPop.push_back(*ssit);
1030 newPush.insert(newPush.end(), examinedPush.begin(),
1031 examinedPush.end());
1032 newPush.push_back(*ssit);
1048 FD_DF(
"Sp2Lr(" << &xrPd <<
"," << n <<
")");
1053 StateSet::Iterator stateit1, stateit2;
1054 EventSet::Iterator eventit;
1056 StackSymbolSet::Iterator ssit;
1057 PopPushSet::const_iterator ppit, ppit2, ppit3;
1058 std::vector<Idx>::const_iterator popit, pushit;
1059 std::vector<Idx> ssVector, pop, push;
1060 std::map<Idx,StateSet> reachableStatesMap;
1066 if(!ignorReducible){
1095 ssVector.push_back(*ssit);
1107 FD_DF(
"Sp2Lr: Inserting" + gp.
Str())
1116 push = ppit->second;
1120 Idx qi = transit->X1;
1121 Idx qj = transit->X2;
1126 std::stringstream errstr;
1127 errstr <<
"While executing Sp2Lr(): Found transition that push lambda but don't read lambda, "
1128 "so is neither read nor pop, which is not allowed" << std::endl;
1129 throw Exception(
"Sp2Lr", errstr.str(), 1001);
1140 rhs.push_back(tPtr);
1160 Idx qi = transit->X1;
1161 Idx qj = transit->X2;
1162 Idx a = transit->Ev;
1163 std::vector<Idx> b = ppit->first;
1164 push = ppit->second;
1171 std::stringstream errstr;
1172 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;
1173 throw Exception(
"Sp2Lr", errstr.str(), 1001);
1195 rhs.push_back(tPtr);
1196 rhs.push_back(ntRhsPtr);
1205 StateSet reachFromTrg = reachableStatesMap.find(qj)->second;
1206 for (stateit1 = reachFromTrg.
Begin(); stateit1 != reachFromTrg.
End(); stateit1++) {
1226 rhs.push_back(tPtr);
1227 rhs.push_back(ntRhsPtr);
1244 else if (push.size() == 2) {
1247 c.push_back(push.front());
1266 rhs.push_back(ntRhsPtr);
1274 StateSet reachFromTrg = reachableStatesMap.find(qj)->second;
1275 for (stateit1 = reachFromTrg.
Begin(); stateit1 != reachFromTrg.
End(); stateit1++) {
1300 rhs.push_back(ntRhs1Ptr);
1301 rhs.push_back(ntRhs2Ptr);
1312 if (tmpPd.
IsStackSymbolLambda((ppit2->second).front()) && (ppit2->first).front() == push.front()) {
1314 Idx qp = transit2->X2;
1317 StateSet reachFromqs = reachableStatesMap.find(qs)->second;
1318 for (stateit2 = reachFromqs.
Begin(); stateit2 != reachFromqs.
End(); ++stateit2) {
1326 && (ppit3->first).front() == push.back()) {
1328 Idx qt = transit3->X2;
1351 rhs.push_back(ntRhs1Ptr);
1352 rhs.push_back(ntRhs2Ptr);
1384 std::set<Nonterminal> rSet;
1386 GrammarSymbolVector::const_iterator wit;
1387 std::set<Nonterminal>::const_iterator ntit;
1389 for(wit = w.begin(); wit != w.end(); wit++){
1395 ntit = symbolSet.find(*nt);
1398 if(ntit != symbolSet.end()){
1409 std::set<Nonterminal>
Rnpp1(
const Grammar& gr,
const std::set<Nonterminal>& ntSet){
1411 std::set<Nonterminal> rSet, filterSet;
1415 std::set<GrammarProduction>::const_iterator pit;
1425 if(std::includes(ntSet.begin(), ntSet.end(), filterSet.begin(), filterSet.end())){
1427 rSet.insert(pit->Lhs());
1436 std::set<Nonterminal>
Rnppl(
const Grammar& gr,
const std::set<Nonterminal>& ntSet){
1439 std::set<Nonterminal> rSet =
Rnpp1(gr,ntSet);
1443 rSet =
Rnppl(gr,rSet);
1457 std::set<Nonterminal> removableNts =
Rnppl(gr,std::set<Nonterminal>());
1459 std::set<GrammarProduction> productions;
1462 if(removableNts.find(gr.
StartSymbol()) != removableNts.end()){
1464 std::set<GrammarProduction>::const_iterator gpit;
1472 symbols.push_back(aPtr);
1474 std::set<Nonterminal> filteredSet;
1479 if(std::includes(removableNts.begin(), removableNts.end(), filteredSet.begin(), filteredSet.end())){
1480 productions.insert(*gpit);
1489 rGr.InsNonterminals(removableNts);
1492 rGr.InsGrammarProductions(productions);
1508 std::set<GrammarProduction> todoProductions, reachableProductions;
1509 std::set<GrammarProduction>::const_iterator gpit;
1510 std::set<Nonterminal> usedNonterminals;
1518 todoProductions.insert(*gpit);
1523 while(!todoProductions.empty()){
1527 todoProductions.erase(currentGp);
1530 reachableProductions.insert(currentGp);
1534 usedNonterminals.insert(filtered.begin(), filtered.end());
1540 if(usedNonterminals.find(gpit->Lhs()) != usedNonterminals.end()){
1541 todoProductions.insert(*gpit);
1547 for(gpit = reachableProductions.begin(); gpit != reachableProductions.end(); gpit++){
1548 todoProductions.erase(*gpit);
1577 StateSet::Iterator stateit;
1579 PopPushSet::const_iterator ppIt;
1581 Idx src,trg,lastState;
1582 std::vector<Idx> oldPop,oldPush,pop,push;
1583 std::vector<Idx>::iterator popit;
1585 std::map<std::vector<Idx>,
Idx> popStateMap;
1586 std::map<std::vector<Idx>,
Idx>::iterator mapit;
1593 popStateMap.clear();
1597 oldPop = ppIt->first;
1598 oldPush = ppIt->second;
1602 std::stringstream errstr;
1603 errstr <<
"While executing RemoveMultPop(): Found transition that pop lambda, which is not allowed !" << std::endl;
1604 throw Exception(
"RemoveMultPop", errstr.str(), 1001);
1608 lastState = transit->X1;
1609 for (popit = oldPop.begin(); popit != oldPop.end(); ++popit) {
1610 std::vector<Idx> tmpPop(oldPop.begin(),popit+1);
1614 mapit = popStateMap.find(tmpPop);
1615 if(mapit != popStateMap.end()){
1616 trg = mapit->second;
1620 popStateMap[tmpPop] = trg;
1625 pop.push_back(*popit);
1629 if(std::distance(popit, oldPop.end() ) == 1)
1631 push.push_back(*popit);
1634 push.push_back(lambdaSS);
1646 pop.push_back(oldPop.back());
1649 rPd.
SetTransition(src, transit->Ev, transit->X2, pop, oldPush);
1670 titEnd = transByX2.
EndByX2(trg);
1673 for(transit = transByX2.
BeginByX2(trg); transit != titEnd; ++transit){
1674 if(rPd.
PopPush(*transit).empty())
1679 count += rPd.
PopPush(*transit).size();
1691 std::set<std::pair <Transition,Transition> > res,tmp;
1699 transRel2Begin, transRel2End, transRel2it;
1706 for(transRel1it = transRel1Begin; transRel1it != transRel1End ; ++transRel1it){
1707 Idx q2 = transRel1it->X2;
1730 bool canNotMerge =
false;
1731 transRel2it = transRel2Begin;
1732 while((transRel2it != transRel2End) && !canNotMerge){
1734 canNotMerge = canNotMerge
1738 || (transRel2it->X1 == transRel2it->X2)
1746 tmp.insert(std::make_pair(*transRel1it,*transRel2it));
1751 res.insert(tmp.begin(),tmp.end());
1764 std::multimap<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > > toRmTrans;
1765 std::multimap<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > >::iterator toRmTransit;
1767 std::pair<Transition, std::pair<std::vector<Idx>, std::vector<Idx> > > pdtransition;
1768 std::pair<std::vector<Idx>, std::vector<Idx> > pp;
1769 std::vector<Idx> pop1,push1, pop2, push2, newPop, newPush;
1774 std::set<std::pair <Transition,Transition> > pairs ;
1775 std::set<std::pair <Transition,Transition> >::iterator pairsIt;
1776 PopPushSet::const_iterator pp1it, pp2it;
1785 bool merged =
false;
1788 for(pairsIt = pairs.begin(); pairsIt != pairs.end(); ++pairsIt){
1790 trans1 = pairsIt->first;
1791 trans2 = pairsIt->second;
1793 DEBUG_PRINTF(debug,
"CombinedTransitions: Try ("+trans1.
Str()+
"/"+trans2.
Str()+
")",
"");
1798 pop1 = pp1it->first;
1799 push1 = pp1it->second;
1802 std::vector<Idx> pop2 = pp2it->first;
1803 std::vector<Idx> push2 = pp2it->second;
1806 if(std::equal(push1.begin(),push1.begin() + std::min(push1.size(),pop2.size()) ,pop2.begin())){
1814 if(push1.size() <= pop2.size()){
1816 newPop.insert(newPop.end(),pop2.begin()+ push1.size(), pop2.end());
1819 if(newPop.size() == 1){
1823 if(pop2.size() <= push1.size())
1825 newPush.insert(newPush.end(),push1.begin() + pop2.size(), push1.end());
1828 if(newPop.empty()) newPop.push_back(lambda);
1829 if(newPush.empty())newPush.push_back(lambda);
1832 pp = std::make_pair(pop1,push1);
1833 pdtransition = std::make_pair(trans1,pp);
1834 toRmTrans.insert(pdtransition);
1836 pp = std::make_pair(pop2,push2);
1837 pdtransition = std::make_pair(trans2,pp);
1838 toRmTrans.insert(pdtransition);
1846 "CombinedTransitions: Merge ("+ trans1.
Str()+
" | "+ trans2.
Str() +
") to "+ nt.
Str() +
"\n",
"");
1852 DEBUG_PRINTF(debug,
"CombinedTransitions: New Pop != 1",
"");
1856 DEBUG_PRINTF(debug,
"CombinedTransitions: Pop - Push incompatible",
"");
1862 for(toRmTransit = toRmTrans.begin(); toRmTransit != toRmTrans.end(); ++toRmTransit)
1863 rPd.
ClrTransition(toRmTransit->first,toRmTransit->second.first,toRmTransit->second.second);
1871 DEBUG_PRINTF(debug,
"CombinedTransitions: Pairs empty",
"");
1878 for (; tit != tit_end; ++tit) {
1879 succStates.
Insert(tit->X2);
1895 StateSet::Iterator it;
1911 while(!todo.
Empty()){
1914 for(it = todo.
Begin(); it != todo.
End(); ++it){