//tworzymy zbiór tymczasowy tmpSet = new TokenSet(); add_rule_first(tmpSet,reguła,indeks za B); dodajemy do zbioru związanego z symbolem B wszystko z tmpSet poza epislonem jeśli coś się zmieniło changed = true; jeśli w tmpSet był epsilon, dodajemy do zbioru związanego z symbolem B wszystko ze zbioru związanego z A
while (changed); }
Funkcja add_rule_first przydaje się także przy sprawdzaniu warunku LL(1)
Przykład Mamy gramatykę (1) E → T E' (2) E' → + T E' (3) E' → ε (4) T → F T' (5) T' → * F T' (6) T' → ε (7) F → ( E ) (8) F → i
Chcąc wykorzystać gramatykę do budowy parsera, uzupełniamy ją nowym startowym symbolem nieterminalnym Z i produkcją:
(0) Z → E
First Stosując algorytm tworzenia zbiorów First dla tej gramatyki, mamy wartość zbiorów dla symboli nieterminalnych w kolejnych iteracjach: Symbol 0 1Z( i( iE( i( iE'ε +ε +T( i( iT'ε *ε *F( i( i
W kolejnych produkcjach (od 8 do 0) dodajemy symbole do zbiorów First skojarzonych z symbolem nieterminalnym: 8:i do F 7:( do F 6:ε do T' 5:* do T' 4:( i do T 3:ε do E' 2:+ do E' 1:( i do E 0:( i do Z
W drugim przebiegu produkcje które mogłyby coś ewentualnie dodać to 4,1 i 0 (których prawa strona zaczyna się od nieterminalnego), ale nie zostanie nic dodane, bo ostatnio First(F) się nie zmieniło.