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