enquanto haver itens modificados:
    para cada item do estado:
        se item não está marcado como modificado:
            continua para a próxima iteração
        marca como não modificado
        se o ponto está na última posição do item:
            continua para a próxima iteração
        b <- símbolo na posição do ponto do item
        se b é um terminal:
            continua para a próxima iteração
        lookahead <- {}
        se não há simbolos depois do ponto do item:
            lookahead <- lookahead do item
        senão:
            nulo <- verdadeiro
            para cada símbolo beta na regra, começando do símbolo seguinte ao item:
                se beta não é um não-terminal:
                    adiciona beta à lookahead
                    nulo <- falso
                    sai do loop
                senão:
                    first <- cópia do conjunto first(beta)
                    adiciona elementos de first, exceto ε, à lookahead
                    se ε não pertence a first:
                        nulo <- falso
                        sai do loop
            se nulo é verdadeiro:
                lookahead <- união de lookahead e lookahead do item
        para cada regra r em regras:
            se lado esquerdo de r é igual a símbolo:n>
                se um item com a regra r e ponto na posição 0 já existe:
                    adiciona lookahead ao lookahead do item existente
                    se o lookahead do item existente mudou:
                        marca item existente como modificado
                senão:
                    adiciona item {regra: r, posição: 0, lookahead: lookahead} ao estado
                    marca novo item como modificado
                    continua para a próxima iteração