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

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   Analisador gramatical    %
% por deslocamento e redução %
%   em DCG para português    %
%       baseado no de        %
%    Covington 1994: 159     %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% analisa(+Expressão, ?Categoria)
%  inicia o processo de análise da Expressão,
%  com a pilha vazia,
%  de forma que em Resultado apareça
%  a lista de categorias a que ela se reduz
analisa(Expressão, Categoria) :-
  analisa([], Categoria, Expressão, []).

% analisa(+Categorias, ?NovasCategorias, ...)
%  analisa (uma expressão através da DCG),
% a partir de uma pilha de Categorias,
% para chegar nas NovasCategorias
analisa(Categorias, NovasCategorias) -->
  desloca(Categorias, MaisCategorias),
  {reduz(MaisCategorias, CategoriasReduzidas)},
  analisa(CategoriasReduzidas, NovasCategorias).
analisa([Categoria], Categoria) --> [].

% desloca(+Categorias, ?MaisCategorias, ...)
%  desloca a Categoria da próxima Palavra
%  para a pilha de categorias
desloca(Categorias, [Categoria|Categorias]) --> [Palavra],
  {palavra(Categoria, Palavra)}.

% reduz(+Categorias, ?CategoriasReduzidas)
%  reduz repetidamente a pilha de Categorias
reduz(Categorias, CategoriasReduzidas) :-
  regra_invertida(Categorias, OutrasCategorias),
  reduz(OutrasCategorias, CategoriasReduzidas).
reduz(Categorias, Categorias).

% regra_invertida(+LDR, ?LER)
%  uma regra de estrutura sintagmática como A --> B C
%  fica como regra_invertida([B, C | Resto], [A | Resto])
regra_invertida([C, B | X], [A | X]) :-
  regra(A, [B, C]).

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

