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);
46 std::set<GrammarProduction>::const_iterator gpit;
56 gsVector.push_back(ntPtr);
57 rSet.insert(gsVector);
60 postfixSet =
PostCl(gpit->Rhs());
61 rSet.insert(postfixSet.begin(), postfixSet.end());
82 GrammarSymbolWordSet::const_iterator wordit;
83 std::set<Terminal>::const_iterator insertWordit;
85 std::set<GrammarProduction>::const_iterator gpit;
87 for(wordit = words.begin(); wordit != words.end(); wordit++){
94 if(terminalA != NULL){
96 std::set<Terminal> rfw;
99 if(rf.find(*wordit) == rf.end()){
100 rf.insert(std::make_pair(*wordit, std::set<Terminal>()));
104 changed = rf.find(*wordit)->second.insert(*terminalA).second;
105 if(changed) *madeChanges =
true;
110 if(nonterminalA != NULL){
112 std::set<Terminal> directDependencies;
119 if(gpit->Lhs() == *nonterminalA){
120 if(f.find(gpit->Rhs()) != f.end()){
123 std::set<Terminal> fx = f.find(gpit->Rhs())->second;
124 directDependencies.insert(fx.begin(),fx.end());
131 a.push_back(nonterminalA);
133 std::set<Terminal> fa;
134 if(f.find(a) != f.end()){
135 fa = f.find(a)->second;
147 bool faContainsLambda =
false;
149 if(fa.erase(tlambda) == 1){
150 faContainsLambda =
true;
152 directDependencies.erase(tlambda);
156 std::set<Terminal> rfw;
158 if(rf.find(*wordit) == rf.end()){
159 rf.insert(std::make_pair(*wordit, std::set<Terminal>()));
163 for(insertWordit = fa.begin(); insertWordit != fa.end(); insertWordit++){
164 changed = rf.find(*wordit)->second.insert(*insertWordit).second;
165 if(changed) *madeChanges =
true;
169 for(insertWordit = directDependencies.begin(); insertWordit != directDependencies.end(); insertWordit++){
170 changed = rf.find(*wordit)->second.insert(*insertWordit).second;
171 if(changed) *madeChanges =
true;
175 if(faContainsLambda){
176 std::set<Terminal> fwBack;
178 if(f.find(wBack) != f.end()){
179 fwBack = f.find(wBack)->second;
183 for(insertWordit = fwBack.begin(); insertWordit != fwBack.end(); insertWordit++){
184 changed = rf.find(*wordit)->second.insert(*insertWordit).second;
185 if(changed) *madeChanges =
true;
218 GrammarSymbolWordMap::const_iterator fit = f.find(word);
220 GrammarSymbolVector::const_iterator vit;
221 std::stringstream errstr;
222 errstr <<
"word " << std::endl;
223 for(vit = word.begin(); vit != word.end(); vit++){
224 errstr << (*vit)->Str();
226 errstr <<
" was not found in the first function";
227 throw Exception(
"FirstA", errstr.str(), 1001);
240 std::stringstream errstr;
241 errstr <<
"word parameter was empty. try calling it with lambda instead of an empty vector.";
242 throw Exception(
"First", errstr.str(), 1001);
246 std::set<Terminal> rSet;
272 if(rSet.erase(tlambda) == 1){
276 rSet.insert(recSet.begin(), recSet.end());
289 std::set<Terminal> rSet;
292 bool consistent =
true;
293 GrammarSymbolVector::const_iterator wordit;
294 std::set<Terminal>::const_iterator tit;
295 std::set<Nonterminal>::const_iterator ntit;
298 for(wordit = word.begin(); wordit != word.end(); wordit++){
323 rSet =
First(gr, word);
334 GrammarSymbolVector::const_iterator wit;
335 std::set<Nonterminal>::const_iterator ntit;
337 for(wit = w.begin(); wit != w.end(); wit++){
343 ntit = symbolSet.find(*nt);
346 if(ntit != symbolSet.end()){
362 std::set<Terminal> rSet;
368 if(filterSet.empty()){
369 rSet =
First(gr, word);
395 std::set<Terminal> rSet;
406 if(k == 0 && !rSet.empty()){
410 rSet.insert(tlambda);
420 GrammarSymbolWordMap::const_iterator fit;
421 std::set<Terminal>::const_iterator setit;
422 GrammarSymbolVector::const_iterator wordit;
423 std::stringstream mapstr;
424 mapstr <<
"************************************************" << std::endl;
425 mapstr <<
"changes made:";
426 if(changed) mapstr <<
"yes" << std::endl;
427 else mapstr <<
"no" << std::endl;
429 for(fit = f.begin(); fit != f.end(); fit++){
431 for(wordit = fit->first.begin(); wordit != fit->first.end(); wordit++){
432 mapstr << (*wordit)->Str();
436 mapstr << std::endl <<
" ";
437 for(setit = fit->second.begin(); setit != fit->second.end(); setit++){
438 if(setit != fit->second.begin()){
441 mapstr << (*wordit)->Str();
446 std::cout << mapstr.str() << std::endl;