Yidx++) { RuleElem Y = rule.v[Yidx]; if (Y.kind==ekTerminal)

//dodajemy numer tokenu do każdego ciągu tempSet.append(Y.number);

else

//dodajemy wszystkie kombinacje ze zbioru Y tempSet.concat(Firstk[Y.number]);

//przerywamy pętlę jeśli zostały już tylko ciągi maksymalnej długości if (!tempSet.concatenable()) break;

//zbió© wynikowy := zbiór wynikowy OR nasz zbiór tymczasowy outSet.unionWith(tempSet); return true jeśli coś zostało dodane nowego do zbioru }

void makeFirstSets_k(int k) { bool changed; Tworzymy listę pustych zbiorów odpowiedniego typu do { changed = false; for (int Xidx=rulesByNonterminal.size() - 1; Xidx >= 0; Xidx--) { RulesForNonterminal &rules = rulesByNonterminal[Xidx]; for (int XruleIdx= rules.size() - 1; XruleIdx >= 0; XruleIdx--) { bool reschanged = addFirstOfRule_k(Firstk[Xidx], rules[XruleIdx]); if (reschanged) changed = true;

while (changed); }

void makeFollowSets_k(int k) { Followk.clear(); Tworzymy listę pustych zbiorów odpowiedniego typu Followk.eps = true; bool changed; do { changed = false; for (int Aidx=0;