Trabalho Prático da Disciplina de Processamento de Linguagens I

Semestre 2 - 1999/2000

Bruno Miguel Pereira Pinto - Nº 24806

Rui José Gonçalves de Castro - Nº 24874

Resumo:

Neste documento, apresenta-se o relatório da primeira parte do trabalho práctico de Processamento de Linguagens I .

Trabalho esse em que se pretende implementar um processador genérico de documentos estruturados.


Índice

  1. Introdução
  2. Ferramentas
  3. Gramática
  4. Estrutura de Dados
  5. Solução (Programa)

Introdução

Foi-nos pedido para criarmos um reconhecedor genérico de documentos XML que fizesse a validação da estrutura dos mesmos e guardasse toda a informação num grove.

A solução para o problema passou por criar um parser bottom-up , utilizando para o efeito as mesmas Ferramentas que utilizamos nas aulas prácticas.

No capítulo Ferramentas apresentaremos as ferramentas que irão ser utilizadas no desenvolvimento da solução, no capítulo Gramática apresenta-se a gramática da linguagem em causa e no capítulo Estrutura de Dados irá ser descrita a estrutura de dados( grove ) utilizada para guardar o documento.


Ferramentas

As ferramentas utilizadas para as tarefas descritas na Introdução foram as mesmas utilizadas nas aulas práticas


Gramática

A gramatica que utilizamos para descrever a linguagem XML foi a sugerida pelo professor com umas ligeiras, mas indispensáveis, alterações.


 Documento : Envelope '$' ;

 Envelope  : '<' id AttrList '>' ElemList '<' '/' id '>' ;

 ElemList  : ElemList Elem
           |
           ;

 Elem      : Envelope
           | texto
           | '&' id ';'
           | '<' id AttrList '/' '>'
           ;

 AttrList  : AttrList Attr
           |
           ;

 Attr      : id '=' valor ;
  

Estrutura de Dados

A estrutura de dados que utilizamos para guardar o documento foi um módulo de àrvores genéricas, existente na biblioteca do Glib. A informação nos nodos da àrvore é do tipo Info que está definido da seguinte forma:


 typedef struct _info {
   int flag;
   union C { // é o conteudo
     char* text; // para nodos texto
    
     struct _tag { // para os outros nodos
       char *ident;
       GSList *atributos;
     } tag;
  
   } conteudo;
 } Info;

 /* Flags possíveis */
 #define TEXTO 0 /* Texto!!! */
 #define TAG1  1 /* <id id="valor" ...> ... </id> */
 #define TAG2  2 /* <id id="valor" ... /> */
 #define TAG3  3 /* &id; */

Para o caso do conteúdo ser uma TAG utiliza-se ainda um outro módulo, de listas ligadas, também da biblioteca do Glib, para guardar os atributos dessa TAG. Os atributos são guardados na lista numa estrutura do tipo Atributo , definida do seguinte modo:


 typedef struct _atributo {
   char* nome;
   char* valor;
 } *Atributo;

 

Solução (Programa)

O nosso programa é constituido por 5 módulos:

O programa resultante da compilação destes módulos é capaz de analizar um texto (documento XML), guardar o seu conteúdo num grove e enviar para o standard output o resultado da travessia ESIS deste. Pode ainda receber um parâmetro opcional [ -g ] na linha de comandos que fará com que o programa envie para stderr informações sobre todos os passos executados.


Agradecimentos: Bibliografia: