Pré-relatório do trabalho prático de Processamento de Linguagens I

Universidade do Minho 14/04/00

Paula Cristina Araújo Melo

E-mail: mc21148@ci.uminho.pt

Sandro Filipe Silva Almeida

E-mail: mc20233@ci.uminho.pt

Sílvia Conceição Oliveira Freitas

E-mail: mc20239@ci.uminho.pt

Resumo:

Neste trabalho pretende-se construír um processador genérico de documentos estruturados XML .

Será realizado em três fases, na primeira fase é pretendido criar um processador genérico de documentos estruturados, a segunda um processador de CQL e por ultimo na terceira um processador de CCL.


Índice

  1. Introdução
  2. Primeira fase
    1. Primeira etapa - Análise léxica e sintática
      1. Análise léxica
      2. Análise Sintática
    2. Segunda etapa- Análise Semântica
      1. Análise Semântica
    3. Terceira etapa- Criação do GROVE
      1. GROVE
      2. Geração do documento no formato ESIS
  3. Código
  4. Conclusão

Introdução

Por agora só vamos falar da primeira fase,esta é dividida em três atapas. Na primeira etapa é pretendido a construção um analisador léxico e um analisador sintático, os quais deverão ser capazes de realizaro processo de reconhecimento léxico e sintático do documento.As ferramentas utilizadas são o LEX e o YACC.

O LEX irá efectuar a análise léxica, a qual é responsável pela leitura sequencial dos caracteres que formam o texto fonte, pela sua separação em palavras e pelo reconhecimento dos vocábulos (s'mbolos terminais) representados por cada palavra. O YACC(Yet Another Compiler-Compiler) por sua vez trata da parte da análise sintática, a qual está encarregue de agrupar os símbolos terminais, verificando se formam uma frase sintaticamente correcta, isto é, composta de acordo com as regras sintáticas da linguagem.

Na segunda etapa foi acrescentado ao analisador construído na etapa anterior a análise semântica .

Por ultimo na terceira etapa foi criada uma estrutura de dados para armazenar o documento - GROVE. O GROVE é implementado através de uma árvore.Para isso foi necessário criar estruturas que representem os nodos da respectiva árvore.


Primeira fase

Primeira etapa - Análise léxica e sintática

Após a leitura do enunciado do problema e uma recapitulação dos nossos conhecimentos de Lex, foi desenvolvido um analisador léxico e sintáctico. Nesta parte do relatório iremos explicar todos os passos desenvolvidos na construção dos analisadores, tendo sido divididos de modo a obtermos uma melhor compreensão.

Análise léxica

Criamos um ficheiro de especificações que comporta uma zona para definições gerais e outra para regras de tradução.

Na primeira zona definimos três identificadores, um referente a caracteres letra e dígitos (id), outro referente só a dígitos(num)e por fim outro que nos reconhece todos os caracteres de uma string. Ainda nesta zona, faz-se referência a estados que nos permitem, na zona das regras, obter um seguimento na transição de um estado para outro, sendo eles: opentag e fim.

Em relação ás regras de tradução, foi definido o seguinte formato:


 <Estado> Express~ao Regular   "{"<Pr'oximo estado> Ac,c~ao "}"

sendo a acção um bloco de instruções em C, que deve ser executada sempre que o analisador léxico emparelha uma cadeia de caracteres de entrada com a linguagem gerada pela expressão regular.

Relativamente a transição de estados, esxemplificando com o código Lex.


%{
#include <string.h>
#define ERRO -1
%}
id [a-zA-Z][a-zA-Z0-9]* 
num [+ -]?[0-9]+ 
str \"[^"]*\" 
%x opentag fim
%%
"<"                             {BEGIN opentag; return('<');}
"&"                                {BEGIN opentag; return('&');}
\n                                 {BEGIN(fim);}
<fim><<EOF>>              {yyterminate();}
<fim>.                          {BEGIN(INITIAL);yyless(INITIAL);return(caracter);}
.                                  {yylval.caract=yytext[0];return(caracter);}
<opentag>">"                    {BEGIN(INITIAL); return('>');}
<opentag>";"                    {BEGIN(INITIAL); return(';');}
<opentag>"="                    {return('=');}
<opentag>"/"                    {return('/');}
<opentag>{id}                   {yylval.valor=strdup(yytext);return(id);}
<opentag>{str}                  {yylval.valor=strdup(yytext);return(str);}
opentag>{num}                      {yylval.valor=strdup(yytext);return(num);}
opentag>[ \t\n]                          ;
opentag>.                          {return(ERRO);}
%%

Na primeira linha, temos o reconhecimento de um < em que a acção, relativa a este símbolo, indica-nos que transita para um estado de opentag.O reconhecimento do \n na terceira linha leva-nos a transitar para o estado fim, que nos indica fim de ficheiro ou continuação de texto.

Análise Sintática

Nesta parte, iniciou-se com a construção de um reconhecedor sintáctico. Este, recebe uma sequência de códigos dos identificadores léxicos e verifica se fazem parte da linguagem gerada pela gramática indicada no ficheiro.

Declaramos o símbolo objectivo da gramática (símbolo mais geral da gramática) na primeira parte das definições através da regra (%start Doc_Xml).A definição dos códigos dos elementos léxicos, é apresentada na primeira parte do ficheiro através da regra (% token caracter num str id )

Há a salientar, alterações feitas á gramática inicialmente facultada no enunciado do trabalho. Uma das alterações foi relativa á recursividade, em que esta respeitou a regra de ser definida á esquerda, para evitar a ocupação excessiva da pilha interna do analisador sintáctico. Uma outra foi na parte relativa á produção Elem que derivava no terminal char e passou a derivar no não terminal Txt,que por sua vez deriva em caracter e Txt caracter estrutura do em que consideramos possível a existência de uma produção vazia, que inicialmente não tinha sido considerada.

Segunda etapa- Análise Semântica

Nesta fase foi acrescentado ao analisador elaborado na primeira etapa algumas condições.

Análise Semântica

todas as anotaçõe correspondentes a elementos com conteúdo são abertas e fechadas correctamente.

o documento tem que obrigaróriamente começar com abertura de um elemento (que irá englobar todo o documento)

Na produção Doc_Xml acrescentamos a seguinte acção semântica:


     if(strcmp(($1,$3)!=0) {printf("ERRO!!Tem marcas diferentes\n");exit(0); 
      else
	printf ("\n\n\nReconheci o doc. Parabens!!!\n");

Na produção Elem que deriva em Abertura Elems Fecho acrescentamos a seguinte acção semântica:


    if(strcmp(($1,$3)!=0) printf(" \n\nERRO!! Tem marcas diferentes\n");
    else
      printf ("reconheci Elem apartir de abertura Elems Fecho.\n");}

Na produção Fecho acrescentamos a seguinte acção semântica:


   $$=$3;

Na produção Abertura acrescentamos a seguinte acção semântica:


   $$=$2;

Terceira etapa- Criação do GROVE

GROVE

Foi criada uma estrutura de dados para armazenar o documento GROVE. O GROVE é implementado através de uma árvore. Para isso foi necessário desenvolver estruturas que representem os nodos da respectiva árvore.

A estrutura seguinte refer-se a um campo atributos que não é mais que uma lista constituída por 3 campos, sendo eles:

idAtrib, refere-se ao identificador de um atributo;

valor, refere-se ao valor do respectivo atributo;

seg, apontador para uma estrutura deste tipo.


typedef struct atributos {
  char * idAtrib;
  char * valor;
  struct atributos * seg;
}tcelAtributos, *tAtr;

A próxima estrutura é a responsável pela criação do Grove. Esta estrutura tem uma Union, onde existe outra estrutura; tratando esta última da "recursividade". Esta estrutura de dados foi baseada numa definida nas aulas.


typedef struct elementos {
  char * idElem;
  union{
     char * texto;
    struct x{
      struct elementos * conteudo;
      tAtr atributos;
    }tnodo;
  }contador;
  struct elementos * seg;
}tcelGrove, * tgrove;

Definimos a estrutura seguinta para identificar a "abertura" e o "fecho".


typedef struct Abertura {
  char * idAbr;
  tAtr atribu;
}tcelAbertura, * tAbre;

De seguida iremos falar sobre as alterações efectuadas na parte da grámatica.

Introdução de um UNION, que permite atribuir um tipo a cada um dos símbolos usados na respectiva gramática. Definimos os tipos valor, caract, g, atributose abre os quais são declarados na instrução, que tem a seguinte estrutura: %token <tipo > símbolo terminal. O tipo do valor associado a símbolos não terminais, como g, atributos, valor e abre são igualmente declarados na zona de definições pela instrução %type <identificador> identificador, elemento léxico. Deste modo a zona de instruções tem as seguintes definições:


%{
#include "estruturas.h"
#include <string.h>
#include <stdio.h>
FILE *file1;
%}
%start Doc_Xml
%token <caract> caracter
%token <valor> id num str
%union {
  char * valor;
  char caract;
  tgrove g;
  tAtr atributos;
  tAbre abre;
}
%type <g> Elems Elem Doc_Xml
%type <atributos> Atribs Atrib
%type <valor> Txt Fecho Valor
%type <abre> Abertura AbreFecho
%%

Tal como já foi referido acima, é na definição das produções que implementamos a construção do GROVE, através de uma àrvore.

Para algumas produções da gramática definimos funções auxiliares tais como: tAtr ultAtributo(tAtr lista, tAtr insAtributo(tAtr lista,tAtr x), tgrove ultElemento(tgrove lista), tgrove insElemGrove(tgrove lista,tgrove x), char * insCaracter(char *sçhar c), void show_Atributo(tAtr at).

Geração do documento no formato ESIS

Criamos uma função de travessia chamada show_esis que será invocada a seguir ao yyparse(). Esta função chama a função show_Atributo.

A função show_esis imprime o Grove no formato ESIS para um ficheiro com este mesmo nome. ( id

A par par

)id

Quando a marca de abertura é diferente da marca do fecho o documento é corrigido aparencendo no ficheiro ESIS com marcas iguais.

Assumimos que o documento e inválido quando tem marcas de abertura e fecho diferentes.Logo se temos um documento com marcas iguais e um sub_documento com marcas diferentes ele vai dizer que o documento é válido e o sub_documento é inválido,e vice_versa.


Código

Vamos apresentar aqui todo o código do progama, que é constituido por 4 ficheiros sendo eles trab.l, trab.y, estruturas.h e estruturas.c.

FICHEIRO LEX (trab.l)


%{
#include <string.h>
#define ERRO -1
%}

id [a-zA-Z][a-zA-Z0-9]* 
num [+ -]?[0-9]+ 
str \"[^"]*\" 
%x opentag fim
%%
"<"                             {BEGIN opentag; return('<');}
"&"                                {BEGIN opentag; return('&');}
\n                                 {BEGIN(fim);}
<fim><<EOF>>              {yyterminate();}
<fim>.                          {BEGIN(INITIAL);yyless(INITIAL);return(caracter);}
.                                  {yylval.caract=yytext[0];return(caracter);}
<opentag>">"                    {BEGIN(INITIAL); return('>');}
<opentag>";"                    {BEGIN(INITIAL); return(';');}
<opentag>"="                    {return('=');}
<opentag>"/"                    {return('/');}
<opentag>{id}                   {yylval.valor=strdup(yytext);return(id);}
<opentag>{str}                  {yylval.valor=strdup(yytext);return(str);}
opentag>{num}                      {yylval.valor=strdup(yytext);return(num);}
opentag>[ \t\n]                          ;
opentag>.                          {return(ERRO);}
%%

FICHEIRO YACC (trab.y)


%{
#include "estruturas.h"
#include <string.h>
#include <stdio.h>
FILE *file1;
%}
%start Doc_Xml
%token <caract> caracter
%token <valor> id num str
%union {
  char * valor;
  char caract;
  tgrove g;
  tAtr atributos;
  tAbre abre;
}
%type <g> Elems Elem Doc_Xml
%type <atributos> Atribs Atrib
%type <valor> Txt Fecho Valor
%type <abre> Abertura AbreFecho
%%
Doc_Xml : Abertura Elems Fecho                        
          { $$=(tcelGrove *) malloc(sizeof(tcelGrove));
            $$->idElem=$1->idAbr;
            $$->contador.tnodo.atributos=$1->atribu;
            $$->contador.tnodo.conteudo=$2;
            $$->seg=NULL;
            grove=$$;
            if(strcmp($1->idAbr,$3)!=0) 
	      printf("ERRO!!O documento tem marcas diferentes!\n\n ( A marca de abertura: '%s' difere da marca de fecho: '%s' )\n\n",$1->idAbr,$3);
            else printf("Documento valido!! PARABENS \n");} 
            ; 

Elems : Elem                                 
      { $$=$1;
        printf("Reconheceu Elems apartir de Elem.\n");}
      | Elems Elem                               
      { $$=insElemGrove($1,$2);
        printf("Reconheceu Elems apartir de Elems Elem.\n");}
      ;

Elem : Txt                                            
     { $$=(tcelGrove *)malloc(sizeof(tcelGrove));
       $$->idElem="TEXTO";
       $$->contador.texto=$1;
       $$->seg=NULL;
       printf("Reconheceu Elem apartir de Txt.\n");}         
        
     | '&' id ';'                                          
       { $$=(tcelGrove *)malloc(sizeof(tcelGrove));
       $$->idElem="ENTESP";
       $$->contador.texto=$2;
       $$->seg=NULL; 
       printf("Reconheceu Elem apartir de '&' id ';'.\n");}   
       
     | Abertura Elems Fecho                              
     { if(strcmp($1->idAbr,$3)!=0) 
        {printf("ERRO !! Tem marcas diferentes\n");
         printf("ERRO!!O Sub_Documento é inválido, tem marcas diferentes!\n\n( A marca de abertura: '%s' difere da marca de fecho: '%s')\n\n",$1->idAbr,$3); }                                
       else
        {printf("Sub_Documento valido!!\n"); 
	 printf("Reconheceu Elem apartirde Abertura Elems Elem.\n");}  
        $$=(tcelGrove*)malloc(sizeof(tcelGrove)); 
	$$->idElem=$1->idAbr;        
        $$->contador.tnodo.conteudo=$2; 
        $$->contador.tnodo.atributos=$1->atribu; 	
        $$->seg=NULL;} 

     | AbreFecho
     { $$=(tcelGrove *)malloc(sizeof(tcelGrove));
       $$->idElem=$1->idAbr;
       $$->contador.tnodo.atributos=$1->atribu;
       $$->contador.tnodo.conteudo=NULL;
       $$->seg=NULL; 
       printf("Reconheceu Elem apartir de AbreFecho.\n");}   
     ;
     
Txt : caracter                                          
{ $$=insCaracter(NULL,$1);
      printf("Reconheceu Txt apartir de caracter.\n");}   
    | Txt caracter                                               
    { $$=insCaracter($1,$2);
      printf("Reconheceu Txt apartir de Txt caracter.\n");}   
    ;
   
Abertura : '< ' id Atribs '>'                          
         { $$=(tcelAbertura *)malloc(sizeof(tcelAbertura));
	   $$->idAbr=$2;
	   $$->atribu=$3;
           printf("Reconheceu Abertura apartir de '<' id Atribs '>'.\n");}   
         ;

Fecho :  '<' '/' id '>'                               
      { $$=$3;
        printf("Reconheceu Fecho apartir de '<' '/' id '>'.\n");}   
      ;

AbreFecho : '<' id Atribs '/' '>'
          { $$->idAbr=$2;
	    $$->atribu=$3; 
            printf("Reconheceu  AbreFecho apartir de '<' id Atribs '/' '>' .\n");}   
          ; 

Atribs :                              
          { $$=NULL; 
            printf("Reconheceu Atribs vazio.\n");}   
          | Atribs Atrib                    
          { $$=insAtributo($1,$2);
            printf("Reconheceu Atributos apartir de Atribs Atrib.\n");}    
          ;

Atrib : id '=' Valor 
      { $$=(tcelAtributos *)malloc(sizeof(tcelAtributos));
        $$->idAtrib=$1;
        $$->valor=$3;
        $$->seg=NULL;      
        printf("Reconheceu Atrib apartir de id '='Valor.\n");}
      ;

Valor : id 
      { $$=strdup($1);
        printf("Reconheceu Valor apartir de id.\n");}
      | num
      { $$=$1;                                  
        printf("Reconheceu Valor apartir de  num.\n");}
      | str 
      { $$=$1;                                   
        printf("Reconheceu Valor apartir de str.\n");}
      ;
%%

#include "lex.yy.c"
#include <stdio.h>
#include <string.h>
#include "estruturas.c"

int yyerror(char *s) 
{
  printf("ERRO! Documento invalido!\n");
}

main()
{
  yyparse();
  file1 = fopen("esis","w");
  show_esis(grove);
  fclose(file1);
}

FICHEIRO (estruturas.c)


#include <stdio.h>
#include <stdlib.h>
#define MAX 100

extern FILE *file1;

tAtr ultAtributo(tAtr lista)
{
  while(lista->seg!=NULL)
    {
      lista=lista->seg;
    }
  return(lista);
}


tAtr insAtributo(tAtr lista,tAtr x)
{
  tAtr aux;
  if(lista!=NULL)
    {
      aux=(tAtr)ultAtributo(lista);
      aux->seg=x;
    }
  else
    {
      lista=x;
    }
  return(lista);
}


tgrove ultElemento(tgrove lista)
{
  tgrove aux;
  if(lista->seg!=NULL)
    aux=ultElemento(lista->seg);
  else
   aux=lista;
  return(aux);
}


tgrove insElemGrove(tgrove lista,tgrove x)
{
  tgrove aux;
  aux=(tgrove)ultElemento(lista);
  aux->seg=x;
  return(lista);
}


char * insCaracter(char *s,char c)
{
  int i=0;
  int comp;
  char * aux=NULL;
  if(s!=NULL)
    {
      comp=strlen(s);
      aux=(char *)malloc(comp+2);  
      while(i<comp)
	{
	  aux[i]=s[i];
	  i++; 
	}
      aux[i]=c;
      aux[i+1]='\0';
   }
  else
    { comp=1;
      aux=(char *)malloc(comp+1);
      aux[0]=c;
      aux[1]='\0';
    }
   free(s);
  return(aux);
}


void show_Atributo(tAtr at)
{
  if(at!=NULL)
    {
      fprintf(file1,"A %s %s \n",at->idAtrib,at->valor);
      show_Atributo(at->seg);
    }
}


void show_esis(tgrove g)
{
  if(g!=NULL)
    {
      if(strcmp(g->idElem,"TEXTO")!=0 && strcmp(g->idElem,"ENTESP")!=0)
	{
	  fprintf(file1,"( %s\n",g->idElem);
	  show_Atributo(g->contador.tnodo.atributos);
	  show_esis(g->contador.tnodo.conteudo);
	  fprintf(file1,")%s\n",g->idElem);
	}
      else  
	{
	  fprintf(file1,"-%s\n",g->contador.texto);
	}
    show_esis(g->seg);
    }

}

FICHEIRO (estruturas.h)


typedef struct atributos {
  char * idAtrib;
  char * valor;
  struct atributos * seg;
}tcelAtributos, *tAtr;
		  


typedef struct elementos {
  char * idElem;
  union{
     char * texto;
    struct x{
      struct elementos * conteudo;
      tAtr atributos;
    }tnodo;
  }contador;
  struct elementos * seg;
}tcelGrove, * tgrove;


typedef struct Abertura {
  char * idAbr;
  tAtr atribu;
}tcelAbertura, * tAbre;


tgrove grove;

EXEMPLOS


-------teste1----------

<pal valor=acs>  & vdhhjhsjk ; </pal>


--Resultados

Reconheceu Atribs vazio.
Reconheceu Valor apartir de id.
Reconheceu Atrib apartir de id '='Valor.
Reconheceu Atributos apartir de Atribs Atrib.
Reconheceu Abertura apartir de '<' id Atribs '>'.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elem.
Reconheceu Elem apartir de '&' id ';'.
Reconheceu Elems apartir de Elems Elem.
Reconheceu Txt apartir de caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elems Elem.
Reconheceu Fecho apartir de '<' '/' id '>'.
Documento valido!! PARABENS                                 

--Resultado da ESIS

( pal
A valor acs 
-  
-vdhhjhsjk
- 
)pal

-------teste2----------

<c> sd <d> <fdfdf/d> </c>

--Resultados

Reconheceu Atribs vazio.
Reconheceu Abertura apartir de '<' id Atribs '>'.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elem.
Reconheceu Fecho apartir de '<' '/' id '>'.
Sub_Documento valido!!
Reconheceu Elem apartirde Abertura Elems Elem.
Reconheceu Elems apartir de Elems Elem.
Reconheceu Txt apartir de caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elems Elem.
Reconheceu Fecho apartir de '<' '/' id '>'.
Documento valido!! PARABENS                 


--Resultados da ESIS
                                                                            
 ( c
- sd 
( d
- fdfdf
)d
- 
)c                                                                             


-------teste3----------

<c> sd <d> fdfdf </d> </g>


--Resultados


Reconheceu Atribs vazio.
Reconheceu Abertura apartir de '<' id Atribs '>'.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elem.                                              Reconheceu Atribs vazio.
Reconheceu Abertura apartir de '<' id Atrbs ' >'                              Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elem.
Reconheceu Fecho apartir de '<' '/' id '>'.
Sub_Documento valido!!
Reconheceu Elem apartirde Abertura Elems Elem.
Reconheceu Elems apartir de Elems Elem.
Reconheceu Txt apartir de caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elems Elem.
Reconheceu Fecho apartir de '<' '/' id '>'.
ERRO!!O documento tem marcas diferentes!
 ( A marca de abertura: 'c' difere da marca de fecho: 'g' )                    


--Resultados da ESIS

  ( c
- sd 
( d
- fdfdf
)d
- 
)c
  

-------teste4----------                                                        

<ca> jkhjdfk


--Resultados
                                                                               Reconheceu Atribs vazio.
Reconheceu Abertura apartir de '<' id Atribs '>'.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
ERRO! Documento invalido!                                                       

                                                                              -------teste5----------                                                          
                                                                               <a> jkdfj </b>                                                                                                                                                --Resultados                                                                                                                                                  Reconheceu Atribs vazio.
Reconheceu Abertura apartir de '<' id Atribs '>'.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elem.
Reconheceu Fecho apartir de '<' '/' id '>'.
ERRO!!O documento tem marcas diferentes!
 
 ( A marca de abertura: 'a' difere da marca de fecho: 'b' )                                                                                                                                               
--Resultado da ESIS

( a
- jkdfj 
)a


-------teste6----------       


<bom11dia am = kld> hoje esta a chover!!!! <maudia outro =jki13> cvcvcvv
cvcvv </maudia>  </bom11dia>



Reconheceu Atribs vazio.
Reconheceu Valor apartir de id.
Reconheceu Atrib apartir de id '='Valor.
Reconheceu Atributos apartir de Atribs Atrib.
Reconheceu Abertura apartir de '<' id Atribs '>'.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elem.
Reconheceu Atribs vazio.
Reconheceu Valor apartir de id.
Reconheceu Atrib apartir de id '='Valor.
Reconheceu Atributos apartir de Atribs Atrib.
Reconheceu Abertura apartir de '<' id Atribs '>'.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.                                       
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elem.
Reconheceu Fecho apartir de '<' '/' id '>'.
Sub_Documento valido!!
Reconheceu Elem apartirde Abertura Elems Elem.
Reconheceu Elems apartir de Elems Elem.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elems Elem.
Reconheceu Fecho apartir de '<' '/' id '>'.
Documento valido!! PARABENS  


--Resultados da ESIS

( bom11dia
A am kld 
- hoje esta a chover!!!! 
( maudia
A outro jki13 
- cvcvcvvvcvcvv 
)maudia
-  
)bom11dia


-------teste7----------     


<bom_dia am = kld> hoje esta a chover!!!! <maudia outro =jki13> cvcvcvv
cvcvv </maudia>  </bom_dia>


-Resultados


Reconheceu Atribs vazio.
ERRO! Documento invalido!   

-

-------teste8----------     


<bomdia am = kld> hoje esta a chover!!!! <mau dia outro =jki13> cvcvcvv
cvcvv </mau dia>  </bomdia>


--Resultados
Reconheceu Atribs vazio.
Reconheceu Valor apartir de id.
Reconheceu Atrib apartir de id '='Valor.
Reconheceu Atributos apartir de Atribs Atrib.
Reconheceu Abertura apartir de '<' id Atribs '>'.
Reconheceu Txt apartir de caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Txt apartir de Txt caracter.
Reconheceu Elem apartir de Txt.
Reconheceu Elems apartir de Elem.
Reconheceu Atribs vazio.
ERRO! Documento invalido!                        


Conclusão

Atendendo aos requisitos do enunciado do trabalho achamos que alguns dos objectivos foram por nós atingidos. O estado actual corresponde a uma ferramenta que verifica e transforma documentos estruturados segundo uma gramática.

Após a realização completa do projecto, sentimo-nos mais à vontade com as ferramentas LEX e YACC. Para além do que nos foi apresentado nas aulas teóricas e teórico-práticas, foi sem dúvida importante o contacto com as dificu ldades, pois assim adquirimos mais alguns conhecimentos.

Todas as dúvidas e problemas que nos surgiram foram resolvidos, quer por nós próprios, quer através da ajuda dos nossos colegas e docentes, quer através da consulta da bibliografia da disciplina. Desde já, o nosso grupo agradece a todos os colegas e docentes a ajuda dispensada sempre que por nós foi solicitada.


Agradecimentos:

Queremos agradecer ajuda dos nossos colegas e ao professor Pedro Henriques

Bibliografia: