% tokador(L) coloca em L a lista de tokens.

tokador(L) :-
    get_char(X),
    tokador(X, L).

tokador('\n', []) :- !.

tokador(' ', L) :-
    !,
    tokador(L).

tokador(X, L) :-
    is_alnum(X),
    !,
    palavra([X], L).

tokador(X, L) :-
    tokador(L1),
    L = [X | L1].

% palavra(LP, L) já leu caracteres de palavra em LP e retorna L

palavra(LP, L) :-
    !,
    get_char(X),
    palavra(X, LP, L).

palavra('\n', LP, [P]) :-
    !,
    reverse(LP, LPR),
    atom_chars(P, LPR).

palavra(' ', LP, [P | L]) :-
    !,
    reverse(LP, LPR),
    atom_chars(P, LPR),
    tokador(L).

palavra(X, LP, L) :-
    is_alnum(X),
    !,
    palavra([X | LP], L).

palavra(X, LP, L) :-
    reverse(LP, LPR),
    atom_chars(P, LPR),
    tokador(L1),
    L = [P, X | L1].
