22 GrammarSymbolVector::const_reverse_iterator vit;
24 for(vit = word.rbegin(); vit != word.rend(); vit++){
26 postfix.insert(postfix.begin(),*vit);
34 lambda.push_back(ptr);
47 std::set<GrammarProduction>::const_iterator gpit;
57 gsVector.push_back(ntPtr);
58 rSet.insert(gsVector);
61 postfixSet =
PostCl(gpit->Rhs());
62 rSet.insert(postfixSet.begin(), postfixSet.end());
83 GrammarSymbolWordSet::const_iterator wordit;
84 std::set<Terminal>::const_iterator insertWordit;
86 std::set<GrammarProduction>::const_iterator gpit;
88 for(wordit = words.begin(); wordit != words.end(); wordit++){
97 std::set<Terminal> rfw;
100 if(rf.find(*wordit) == rf.end()){
101 rf.insert(std::make_pair(*wordit, std::set<Terminal>()));
105 changed = rf.find(*wordit)->second.insert(*terminalA).second;
106 if(changed) *madeChanges =
true;
113 std::set<Terminal> directDependencies;
120 if(gpit->Lhs() == *nonterminalA){
121 if(f.find(gpit->Rhs()) != f.end()){
124 std::set<Terminal> fx = f.find(gpit->Rhs())->second;
125 directDependencies.insert(fx.begin(),fx.end());
132 a.push_back(nonterminalA);
134 std::set<Terminal> fa;
135 if(f.find(a) != f.end()){
136 fa = f.find(a)->second;
148 bool faContainsLambda =
false;
150 if(fa.erase(tlambda) == 1){
151 faContainsLambda =
true;
153 directDependencies.erase(tlambda);
157 std::set<Terminal> rfw;
159 if(rf.find(*wordit) == rf.end()){
160 rf.insert(std::make_pair(*wordit, std::set<Terminal>()));
164 for(insertWordit = fa.begin(); insertWordit != fa.end(); insertWordit++){
165 changed = rf.find(*wordit)->second.insert(*insertWordit).second;
166 if(changed) *madeChanges =
true;
170 for(insertWordit = directDependencies.begin(); insertWordit != directDependencies.end(); insertWordit++){
171 changed = rf.find(*wordit)->second.insert(*insertWordit).second;
172 if(changed) *madeChanges =
true;
176 if(faContainsLambda){
177 std::set<Terminal> fwBack;
179 if(f.find(wBack) != f.end()){
180 fwBack = f.find(wBack)->second;
184 for(insertWordit = fwBack.begin(); insertWordit != fwBack.end(); insertWordit++){
185 changed = rf.find(*wordit)->second.insert(*insertWordit).second;
186 if(changed) *madeChanges =
true;
219 GrammarSymbolWordMap::const_iterator fit = f.find(word);
221 GrammarSymbolVector::const_iterator vit;
222 std::stringstream errstr;
223 errstr <<
"word " << std::endl;
224 for(vit = word.begin(); vit != word.end(); vit++){
225 errstr << (*vit)->Str();
227 errstr <<
" was not found in the first function";
228 throw Exception(
"FirstA", errstr.str(), 1001);
241 std::stringstream errstr;
242 errstr <<
"word parameter was empty. try calling it with lambda instead of an empty vector.";
243 throw Exception(
"First", errstr.str(), 1001);
247 std::set<Terminal> rSet;
273 if(rSet.erase(tlambda) == 1){
277 rSet.insert(recSet.begin(), recSet.end());
290 std::set<Terminal> rSet;
293 bool consistent =
true;
294 GrammarSymbolVector::const_iterator wordit;
295 std::set<Terminal>::const_iterator tit;
296 std::set<Nonterminal>::const_iterator ntit;
299 for(wordit = word.begin(); wordit != word.end(); wordit++){
324 rSet =
First(gr, word);
335 GrammarSymbolVector::const_iterator wit;
336 std::set<Nonterminal>::const_iterator ntit;
338 for(wit = w.begin(); wit != w.end(); wit++){
344 ntit = symbolSet.find(*nt);
347 if(ntit != symbolSet.end()){
363 std::set<Terminal> rSet;
369 if(filterSet.empty()){
370 rSet =
First(gr, word);
396 std::set<Terminal> rSet;
407 if(k == 0 && !rSet.empty()){
411 rSet.insert(tlambda);
422 GrammarSymbolWordMap::const_iterator fit;
423 std::set<Terminal>::const_iterator setit;
424 GrammarSymbolVector::const_iterator wordit;
425 std::stringstream mapstr;
426 mapstr <<
"************************************************" << std::endl;
427 mapstr <<
"changes made:";
428 if(changed) mapstr <<
"yes" << std::endl;
429 else mapstr <<
"no" << std::endl;
431 for(fit = f.begin(); fit != f.end(); fit++){
433 for(wordit = fit->first.begin(); wordit != fit->first.end(); wordit++){
434 mapstr << (*wordit)->Str();
438 mapstr << std::endl <<
" ";
439 for(setit = fit->second.begin(); setit != fit->second.end(); setit++){
440 if(setit != fit->second.begin()){
443 mapstr << (*wordit)->Str();
448 std::cout << mapstr.str() << std::endl;