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