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;