first <- {}
união <- {}
para cada produção p da forma A -> X1,X2...Xn da gramática:
first(p) <- {}
nulo <- verdadeiro
para cada símbolo Xk na direita da produção p:
se Xk pertence aos não-terminais:
para cada regra r da forma Xk -> α:
se r é diferente p:
adiciona r a união(p)
caso contrário:
adiciona Xk a first(p)
se Xk não produz ε:
nulo = falso
para
se nulo é verdadeiro:
adiciona ε a first(p)
para cada chave k de união:
se união(k) é vazio:
continua para próxima iteração
pilha s
adiciona k ao topo de s
enquanto tamanho de s > 0:
topo <- topo de s
primeiro <- primeiro elemento de união(topo)
se união(primeiro) não é vazio e primeiro ainda não foi adicionado a s:
adiciona primeiro ao topo de s
continua para a próxima iteração
para cada item f de first(primeiro):
adiciona f a first(topo)
remove primeiro de união(topo)
se união(topo) é vazio:
remove o topo de s