canonical_collection: List (Set Item);

runGOTO(state: Int, symbol: Symbol): Maybe Int;


getLA(state: Int, item: Item): Set Terminal

{

    map: Map (Int, Item) (Set Terminal);

    go(state: Int, item: Item): Set Terminal

    {

        switch map.lookup((state, item))

        {

        case (Just lookaheads):

            return lookaheads;

        case Nothing:

            preds := getPRED(state, item.left);

            lookaheads := empty;

            map.insert((state, item), lookaheads);

            for state' in preds

            {

                for item' in canonical_collection.at(state')

                {

                    switch (item'.right)

                    {

                    case Nil:

                        break;

                    case (Cons symbol symbols):

                        if (symbol == item.lhs)

                            lookaheads += ring_sum(getFIRST(symbols), go(state', item'));

                    }

                }

            }

            map.update((state, item), lookaheads);

            return lookaheads;

        }

    }

    start_item := Item {

        lhs := start_symbol';

        left := Nil;

        right := Cons start_symbol Nil;

    };

    map := singleton((0, start_item), singleton(EOF));

    return (go(state, item));

}

물론 슈도 코드임 ㅇㅅㅇ