% tabular.pl
% Luiz Arthur Pagani
% arthur@ufpr.br

%%%%%%%%%%%%%%%%%%%%%%%%%%
%   Analisador tabular   %
%     baseado no de      %
% Matthews 1998: 239-242 %
%%%%%%%%%%%%%%%%%%%%%%%%%%

:- dynamic arco/5.

:- unknown(_, fail).

analisa(Expressão) :-
   abolish(arco/5),
   faz_tabela(1, Vn, Expressão),
   arco(1, Vn, Categoria, _, []),
   nl,
   write('-- Categoria = '),
   write(Categoria),
   fail.

faz_tabela(V, V, []).
faz_tabela(V1, Vn, [Palavra|Palavras]) :-
   V2 is V1 + 1,
   forall(palavra(Categoria, Palavra),
          faz_arco(V1, V2, Categoria, [], [])),
   faz_tabela(V2, Vn, Palavras).

faz_arco(V1, V2, Categoria, Achadas, Procuradas) :-
   arco(V1, V2, Categoria, Achadas, Procuradas), !.
faz_arco(V1, V2, Cat, Achadas, []) :-
   asserta(arco(V1, V2, Cat, Achadas, [])),
   write(arco(V1, V2, Cat, Achadas, [])), nl,
   forall(regra(Cat1, [Cat|Cats]),
          faz_arco(V1, V1, Cat1, [], [Cat|Cats])),
   forall(arco(V0, V1, Cat1, Achadas1, [Cat|RestoCats]),
          faz_arco(V0, V2, Cat1, [Cat|Achadas1], RestoCats)).
faz_arco(V0, V1, Cat, Achadas, [Cat1|RestoCats]) :-
   asserta(arco(V0, V1, Cat, Achadas, [Cat1|RestoCats])),
   write(arco(V0, V1, Cat, Achadas, [Cat1|RestoCats])), nl,
   forall(arco(V1, V2, Cat1, _, []),
          faz_arco(V0, V2, Cat, [Cat1|Achadas], RestoCats)).

% Carrega gramática (regras e léxico)
:- [gram].
