união <- {}
follow <- {}
follow(S) = {$}, onde S é o símbolo inicial
para cada produção p da forma X1,X2...Xn na gramática:
    para cada símbolo Xk do lado direito de p:
        seguinte <- Xk+1
        se Xk não pertence aos não-terminais:
            continua para próxima iteração
        se Xk não existe em follow:
            follow(Xk) <- {}
        pos <- 1
        enquanto verdadeiro:
            se seguinte é nulo:
                se Xk não existe em união:
                    união(Xk) <- {}
                se esquerda de p é diferente de Xk:
                    adiciona (esquerda de p) a união(Xk)
                para
            se seguinte pertence aos não-terminais:
                vazio <- false
                para cada item f em first:
                    se (produção correspondente a f) = seguinte:
                        se ε pertence a f:
                            vazio <- verdadeiro
                            continua para próxima iteração
                        para cada item i em f:
                            adiciona i a follow(Xk)
                se vazio é verdadeiro:
                    para
                seguinte <- Xk+1+pos
                pos < pos + 1
            caso contrário:
                adiciona seguinte a follow(Xk)
                para
para cada chave k de união:
    se tamanho 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 follow(primeiro):
            adiciona f a follow(topo)
        remove primeiro de união(topo)
        se união(topo) é vazio:
            remove o topo de s