Trabalho Prático de Processamento de Linguagens I

Universidade do Minho 12/4/99

Marisa Alexandra Jesus Oliveira Moreira

E-mail: mc23197@ci.uminho.pt

Marlene Jesus Camões Moura

E-mail: mc23777@ci.uminho.pt

Resumo:

O objectivo deste trabalho é dada uma gramática que reconhece documentos em XML executarmos diferentes tarefas em volta desta gramática. Estas tarefas serão divididas em várias fases sendo esta a primeira fase.

Ao todo irão ser realizadas 3 fases. Cada uma delas vai ser a continução da anterior. Esta primeira fase é constituida por três etapas. A primeira etapa consistirá em criar um analisador léxico, usando o Lex, que vai reconhecer os simbolos terminais da gramática dada, criar um analisador sintáctico, usando o Yacc que é um parser Bottom_Up, sendo este encarregado de receber os simbolos terminais passados pelo Lex e reconhecer as frases pertencentes á linguagem da gramática dada.

A segunda etapa consiste em dar alguma semântica á linguagem, visto que na etapa anterior apenas se preocupava com a forma e não com o conteúdo.

A terceira etapa será um pouco mais complicada, pois terá de se armazenar numa árvore irregular, ou seja num Grove, o conteúdo de todo o documento em XML. Para a verificação de que a informação armazenada no Grove é realmente a correcta iremos imprimir esta informação no formato ESIS.

Nas secções seguintes irá ser mais detalhadamente explicada cada uma das etapas desta fase.


Índice

  1. 1.Introdução
  2. 2.Desenvolvimento
    1. 2.1.Etapa 1
      1. Fase11.l
      2. Fase11.y
    2. 2.2.Etapa 2
      1. Fase12.l
      2. Fase12.y
    3. 2.3.Etapa 3
  3. 3.Conclusão
  4. 4.Anexos
    1. 4.1.Gramática
    2. 4.2.Exemplos de execução
      1. 4.2.1.Etapa 1
      2. 4.2.2.Etapa 2
      3. 4.2.3.Etapa 3
      4. 4.3.Ficheiros da Etapa 3
        1. Fase13.l
        2. Fase13.y
        3. Est.h
        4. Aux1.c

1.Introdução

Esta primeira fase do trabalho é dividida em 3 etapas, sendo cada uma delas o seguimento da outra. Toda esta fase consiste em dada uma gramática que define a linguagem para documentos em XML se faça um reconhecedor para o mesma linguagem e também que se faça um Grove e escreva num ficheiro no formato Esis o respectivo documento em XML. Ora, então a Etapa 1 consiste em efectuar a análise léxica e a análise sintáctica para a gramática dada. Para a análise léxica será efectuado o analisador léxico feito em Lex, o qual se preocupa em reconhecer os simbolos terminais da gramática. Para a análise sintáctica será efectuado como analisador sintáctico o parser Top_Down usando o Yacc. Nesta etapa da análise léxica e sintáctica apenas nos preocupa a forma da linguagem e não o conteúdo, ou seja ainda não é relevante dar á nossa linguagem algum significado. Podemos dizer também que será sempre usado o Lex e o Yacc em conjunto, logo iremos efectuar uma ligação entre eles.

A Etapa 2 consiste em efectuar a análise semântica, ou seja é aqui que nos vamos preocupar em dar algum significado á nossa linguagem. O significado que queremos dar nesta etapa é que a primeira marca a fechar é a última que foi aberta e para isso iremos comparar os nomes de cada marca para verificar a concordância ou não do nome de cada uma.

A Etapa 3 consiste em criar um Grove (árvore irregular) para armazenar a informação de um respectivo documento em XML. Consequentemente teremos de efectuar uma função que se encarregara de gerar a informação guardada no Grove do respectivo documento em XML para o formato Esis.


2.Desenvolvimento

2.1.Etapa 1

Como já referimos anteriormente esta etapa consiste na análise léxica e na análise sintáctica. Vamos então fazer referência ao código efectuado em Lex e também em Yacc de cada uma das análises referidas.

Fase11.l


%{
#include "y.tab.h"
%}
id [a-zA-Z][a-zA-Z0-9]*
num [+-]?[0-9]+
str \"[^"]*\"
%x MARCA
%%
[ \t\n]+ ;
"<" {BEGIN(MARCA); return ('<');}
"&" {BEGIN(MARCA); return ('&');}
<MARCA>">" {BEGIN(0); return ('>');}
<MARCA>";" {BEGIN(0); return (';');}
<MARCA>"=" {return ('=');}
<MARCA>"/" {return ('/');}
<MARCA>{id} {return (Id);}
<MARCA>{num} {return (Num);}
<MARCA>{str} {return (Str);}
.|\n {return (Car);}

		

Fase11.y


%token Id Num Str Car
%start DocXML
%%
DocXML:Abert Elems Fecho
      { 
	     printf ("Documento XML Valido!\n");
      }
      ;
Abert:'<' Id Atribs '>'
     {
	    printf("Reconheci Abert!\n");
     }
     ;
Atribs:
      {
        printf("Reconheci Atribs como vazio!\n");
       }
       |Atribs Atrib
       {
        printf("Reconheci Atribs como Atribs Atrib!\n");
       }
       ;
Atrib:Id '=' Valor
     {
      printf("Reconheci Atrib!\n");
     }
     ;
Valor:Id
     {
      printf("Reconheci Valor como Id!\n");
     }
     |Num
     {
      printf("Reconheci Valor como Num!\n");
     }
     |Str
     {
      printf("Reconheci Valor como Str!\n");
     }
     ;
Elems:Elem
     {
      printf("Reconheci Elems como Elem!\n");
     }
     |Elems Elem
     {
      printf("Reconheci Elems como Elems Elem!\n");
     }    
    ;
Elem:Txt
     {
      printf("Reconheci Elem como Txt!\n");
     }
     |'&' Id ';'
     {
      printf("Reconheci Elem como '&' Id ';' !\n");
     }
     |AbertFecho
     {
      printf("Reconheci Elem como AbertFecho!\n");
     } 
     |Abert Elems Fecho
     {
      printf("Reconheci Elems como Abert Elems Fecho!\n");
     }
     ;
Txt:Car
    {
     printf("Reconheci Txt como Car!\n");
    }
   |Txt Car
   {
    printf("Reconheci Txt como Txt Car!\n");
   }
   ;
Fecho:'<' '/' Id '>'
     {
      printf("Reconheci Fecho!\n");
     }
     ;
AbertFecho:'<' Id Atribs '/' '>'
          {
           printf("Reconheci AbertFecho!\n");
          }
          ;
%%
#include "lex.yy.c"

yyerror(){
  printf("ERRO! Documento XML nao Valido!\n");
}

main(){
  yyparse();
}

            

2.2.Etapa 2

Esta etapa consiste na análise semântica. Nesta análise o que nós queremos é que o nome de cada marca aberta e fechada esteja em concordância, ou seja que a última marca a abrir seja a primeira a fechar. Vamos então fazer referência ao código efectuado em Lex e também em Yacc desta análise.

Fase12.l


%{
#include <string.h>
%}
id [a-zA-Z][a-zA-Z0-9]*
num [+-]?[0-9]+
str \"[^"]*\"
%x MARCA
%%
[ \t\n]+ ;
"<" {BEGIN(MARCA); return ('<');}
"&" {BEGIN(MARCA); return ('&');}
<MARCA>">" {BEGIN(0); return ('>');}
<MARCA>";" {BEGIN(0); return (';');}
<MARCA>"=" {return ('=');}
<MARCA>"/" {return ('/');}
<MARCA>{id} {yylval.nome=strdup(yytext); return (Id);}
<MARCA>{num} {return (Num);}
<MARCA>{str} {return (Str);}
.|\n {return (Car);}
           

Fase12.y


%token Id Num Str Car
%union {char *nome;}
%type <nome> Abert Fecho
%token <nome> Id
%start DocXML
%%
DocXML:Abert Elems Fecho
      {printf("%s %s\n",$1,$3); 
      if (strcmp($1,$3)==0)
	      {printf(" Documento XML Valido!\n");}
      else
        {printf ("ERRO! Documento XML nao Valido!\n");}
      }
      ;
Abert:'<' Id Atribs '>'
      {
       $$=$2;
       printf("Reconheci Abert!\n");
      }
     ;
Atribs:
      {
       printf("Reconheci Atribs como vazio!\n");
      }
      |Atribs Atrib
      {
       printf("Reconheci Atribs como Atribs Atrib!\n");
      }
      ;
Atrib:Id '=' Valor
     {
      printf("Reconheci Atrib!\n");
     }
     ;
Valor:Id
     {
      printf("Reconheci Valor como Id!\n");
     }
     |Num
     {
      printf("Reconheci Valor como Num!\n");
     }
     |Str
     {
      printf("Reconheci Valor como Str!\n");
     }
     ;
Elems:Elem
     {
      printf("Reconheci Elems como Elem!\n");
     }
     |Elems Elem
     {
      printf("Reconheci Elems como Elems Elem!\n");
     }    
    ;
Elem:Txt
     {
      printf("Reconheci Elem como Txt!\n");
     }
     |'&' Id ';'
     {
      printf("Reconheci Elem como '&' Id ';' !\n");
     }
     |AbertFecho
     {
      printf("Reconheci Elem como AbertFecho!\n");
     } 
    |Abert Elems Fecho
    {printf("%s %s\n",$1,$3); 
    if (strcmp($1,$3)==0)
	    printf("Reconheci Elems como Abert Elems Fecho!\n");
    else
{printf ("ERRO! Documento XML não Valido!\n");exit(0);}
     }
     ;
Txt:Car
    {
     printf("Reconheci Txt como Car!\n");
    }
   |Txt Car
   {
    printf("Reconheci Txt como Txt Car!\n");
   }
   ;
Fecho:'<' '/' Id '>'
     {
      $$=$3;
      printf("Reconheci Fecho!\n");
     }
     ;
AbertFecho:'<' Id Atribs '/' '>'
          {
            printf("Reconheci AbertFecho!\n");
          }
          ;
%%
#include "lex.yy.c"

yyerror(){
  printf("ERRO! Documento XML nao Valido!\n");
}

main(){
  yyparse();
}
        
         

2.3.Etapa 3

Esta etapa consiste então em efectuar o respectivo Grove já referido e uma função que gere a informação contida neste (com o formato em XML) para o formato Esis. Para isso escolhemos a estrutura de dados que achamos mais adequada.


typedef struct atributo
   { char *idAtrib;
     char flag;
     char *valAtrib;
     struct atributo *seg;
}tCelAtribs;
            

Esta estrutura vai armazenar a informação sobre os atributos: idAtrib é uma sequência de caracteres que nos dá a identificação do atributo. flag é um caracter que nos diz se o valor do atributo é uma string, um identificador ou um número. valAtrib diz-nos qual o valor do atributo. seg é um apontador para esta estrutura.


typedef struct nodo
   { char *idNodo;
     union C
      { char *texto;
	struct X
	 { struct nodo *conteudo;
	   tCelAtribs *atribs;
	   }normal;
     }cont;
     struct nodo *seg;
}tCelGrove;
          

Esta estrutura vai armazenar a informação sobre o conteúdo. Ela podera ter duas formas visto que ela tem uma union, ou é uma célula com três campos ou uma célula com quatro campos. Terá apenas três campos quando o conteúdo for texto ou uma entidade especial e terá quatro campos caso contrário: idNodo é uma sequência de caracteres que nos dá a identificação da marca de abertura e fecho. texto é uma sequência de caracteres que nos guarda a informação se o conteúdo for um texto. conteudo é um apontador para esta estrutura que nos dá o conteúdo. atribs é um apontador para a estrutura que guarda os atributos. seg é um apontador para esta estrutura.


typedef struct A
  { char *idNodo;
    tCelAtribs *atribs;
}tAbre;
          

Esta estrutura é apenas utilizada para o tipo de alguns simbolos não terminais no Yacc. Ela guarda a informação sobre o identificador da marca e dos seus atributos.


typedef struct V
  { char *val;
    char flag;
}tValor;
          

Esta estrutura também é usada apenas como tipo para alguns não terminais no Yacc. Ela guarda a informação sobre o valor do atributo e na flag armazenamos a informação se o atributo é uma string, um identificador ou um número.

/* apontador para o conteudo */


typedef tCelGrove *tNodoGrove;

/* apontador para os atributos */


typedef tCelAtribs *tNodoAtribs;

/* apontador para caracter */


typedef char *tCaracter;

3.Conclusão

Durante a realização deste trabalho tivemos várias dificuldades, sendo estas ultrapassadas com a ajuda do nosso docente, bem como a ajuda de vários colegas e também da bibliografia aconselhada pelo docente.

Gostamos bastante de elaborar este trabalho, especialmente no que diz respeito a este caso de estudo. Com ele aprendemos várias coisas e principalmente alargamos os nossos horizontes.

Em relação ás perspectivas para um trabalho futuro o nosso objectivo seria aprofundar ainda mais o assunto em relação ao nosso caso de estudo e também conhecer mais em relação ás ferramentas utilizadas para a elaboração do nosso trabalho e também o conhecimento de outras possiveis ferramentas não utilizadas por nós mas também possiveis de se efectuar neste trabalho.

Damos agora por terminado a nossa primeira fase deste trabalho e esperamos conseguir alcançar os objectivos pretendidos pelo docente da disciplina para a realização das fases seguintes.


4.Anexos

4.1.Gramática


	GRAM'ATICA

DocXML  -> Abert Elems Fecho
Abert -> '<' id Atribs '>'
Atribs -> Î | Atribs Atrib
Atrib -> id '=' Valor
Valor -> id | num | str
Elems -> Elem | Elems Elem
Elem -> Txt | '&' id ';' | AbertFecho | Abert Elems Fecho
Txt -> car | Txt car
Fecho -> '<' '/' id '>'
AbertFecho -> '<' id Atribs '/' '>'

4.2.Exemplos de execução

4.2.1.Etapa 1


		EXEMPLOS

-> < hgf hsdg="567hjgf"> &zfk987; < hgdf67384/> </fvjhg>

Reconheci Atribs como vazio!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elem!
Reconheci Atribs como vazio!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
 Documento XML Valido!

      
-> < shgdf> jhdgfs542765#;: </hsgdf>

Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elem!
Reconheci Fecho!
 Documento XML Valido!

         
-> < hsgadf gfasc3456="hgdf"> </hdgjf>

Reconheci Atribs como vazio!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
 ERRO! Documento XML nao Valido!

  
-> < hgasfd> &hjdkgsf4765; ghdfruiyteravb < hsgafd7356/> </jsdhgfk>

Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elem!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
 Documento XML Valido!
       
         
-> < hjsdgfk sghdf=7465 hgsfd23456=sdf2546> < aghdf> 36745nzv hjgf </sghdf> </sc>

Reconheci Atribs como vazio!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Id!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elem!
Reconheci Fecho!
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Fecho!
 Documento XML Valido!
       

-> < hgfd345> < gs sgfd="nsbvd3645" hgsfd6345=63745> &nbcv; </sghd>

Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elem!
Reconheci Fecho!
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
 ERRO! Documento XML nao Valido!

      
-> < hgdf hsgd="hsd567*:;" agfsd=43675> &hsgfd; &hsgdf; < sdyhtf hsdgf=twer435/> < sgdhf> hdgkjh </sdghf> &hdfg; jhdgfkuahg </v>

Reconheci Atribs como vazio!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elem!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci Valor como Id!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elem!
Reconheci Fecho!
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elems Elem!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
 Documento XML Valido!

		
-> < ghsdf> < shdgf36745 hsdgvf=678 hfg546387="hsgdf73564 dhgf"> jfhg326784 &hdfbv; </hdbnfv> sbhjfhjgfs7836756           

Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elem!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elems Elem!
Reconheci Fecho!
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
 ERRO! Documento XML nao Valido!
		

4.2.2.Etapa 2


		EXEMPLOS

-> < marca1 sgfdh="45sjkdh"> &shjdgf32564; < jhgf354/> </marca1>    

Reconheci Atribs como vazio!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elem!
Reconheci Atribs como vazio!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
marca1 marca1
 Documento XML Valido!


-> < marca1>sgdhf6354356#!: </shgf>

Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elem!
Reconheci Fecho!
marca1 shgf
 ERRO! Documento XML nao Valido!
	
	
-> < nome jsdhgf3645="djhsfg"> < marca> &sdhjfg3465; < hgdfhg sgfd=23564/> </marca> & dhjsgf74586; </nome>

Reconheci Atribs como vazio!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elem!
Reconheci Atribs como vazio!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
marca marca
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elems Elem!
Reconheci Fecho!
nome nome
 Documento XML Valido!
	

-> < marca1> &sghjfd245; eyurtdhg3265 < dhjfg56743/> </marc2>    

Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elem!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
marca1 marc2
 ERRO! Documento XML nao Valido!


-> < marca gfd=243 shgfddf36745=shjg3645> < marca1> 3645hsdfg sdfghj </marca1> </marca3>

Reconheci Atribs como vazio!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Id!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elem!
Reconheci Fecho!
marca1 marca1
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Fecho!
marca marca3
 ERRO! Documento XML nao Valido!


-> < nome1 dfgh="shfg38475:;*.," ashdgf2356=63245> &hsbvd; &sghdf36745; < nome2 shgdf=shg2354/> < nome3> udfgh </nome3> &shjdgf; sghfd </nome1>

Reconheci Atribs como vazio!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elem!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci Valor como Id!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elem!
Reconheci Fecho!
nome3 nome3
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elems Elem!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
nome1 nome1
Documento XML Valido!
	

-> < marca1> < marca2 gasdf=3756 hadg6345="hsfdg378564" > hgf465 &shdgf45678; </marca2> < marca3> < hsg8537 df=sgfd465 shdg3746=6354/> </marca4> hfg </marca1>

Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt!
Reconheci Elems como Elem!
Reconheci Elem como '&' Id ';' !
Reconheci Elems como Elems Elem!
Reconheci Fecho!
marca2 marca2
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Valor como Id!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elem!
Reconheci Fecho!
marca3 marca4
 ERRO! Documento XML nao Valido!
	

4.2.3.Etapa 3

-> O documento exemplo que escolhemos foi o seguinte:


	    EXEMPLO

< DocXML>
   < Abertura>
       < Titulo> &PLI; </Titulo>
       < Data> Semestre 2 - 1999/2000 </Data>
       < Autor>
         < Nome> Pedro Rangel Henriques </Nome>
	 < Email> prh@di.uminho.pt </Email>
	 < Url> www.di.uminho.pt/~prh </Url>
       </Autor>
       < Resumo>
           < Para Id1="MCC" Id2="LESI"/>
	   Neste documento apresenta-se um programa resumido da disciplina
       </Resumo>
   </Abertura>
   < Corpo Cp0=1999>
       < Capitulo Cap1=Capitulo1>
           < Titulo Tit=Compiladores/>
	   Nesta seccao apresenta-se toda a historia dos compiladores
       </Capitulo>
    </Corpo>
    < Fecho>
       < Agradecimentos agr1=345 agr2="fsdg46"/>
       < Bibliografia>
          A bibliografia aconselhada pelo docente
       </Bibliografia>
     </Fecho>
</DocXML>  

	    
-> O resultado foi o seguinte: 

Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Elem como '&' Id ';' ! ENTESP
Reconheci Elems como Elem!
Reconheci Fecho!
Titulo Titulo
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt! TEXTO
Reconheci Elems como Elem!
Reconheci Fecho!
Data Data
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt! TEXTO
Reconheci Elems como Elem!
Reconheci Fecho!
Nome Nome
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt! TEXTO
Reconheci Elems como Elem!
Reconheci Fecho!
Email Email
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt! TEXTO
Reconheci Elems como Elem!
Reconheci Fecho!
Url Url
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
Autor Autor
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elem!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt! TEXTO
Reconheci Elems como Elems Elem!
Reconheci Fecho!
Resumo Resumo
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
Abertura Abertura
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Atribs como vazio!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Valor como Id!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Valor como Id!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elem!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt! TEXTO
Reconheci Elems como Elems Elem!
Reconheci Fecho!
Capitulo Capitulo
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elem!
Reconheci Fecho!
Corpo Corpo
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Atribs como vazio!
Reconheci Valor como Num!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci Valor como Str!
Reconheci Atrib!
Reconheci Atribs como Atribs Atrib!
Reconheci AbertFecho!
Reconheci Elem como AbertFecho!
Reconheci Elems como Elem!
Reconheci Atribs como vazio!
Reconheci Abert!
Reconheci Txt como Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Txt como Txt Car!
Reconheci Elem como Txt! TEXTO
Reconheci Elems como Elem!
Reconheci Fecho!
Bibliografia Bibliografia
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
Fecho Fecho
Reconheci Elems como Abert Elems Fecho!
Reconheci Elems como Elems Elem!
Reconheci Fecho!
DocXML DocXML
 Documento XML Valido!

(DocXML
(Abertura
(Titulo
- PLI
)Titulo
(Data
- Semestre2-1999/2000
)Data
(Autor
(Nome
- PedroRangelHenriques
)Nome
(Email
- prh@di.uminho.pt
)Email
(Url
- www.di.uminho.pt/~prh
)Url
)Autor
(Resumo
(Para
A  Id1 "MCC"
A  Id2 "LESI"
)Para
- Nestedocumentoapresenta-seumprogramaresumidodadisciplina
)Resumo
)Abertura
(Corpo
A  Cp0 1999
(Capitulo
A  Cap1 Capitulo1
(Titulo
A  Tit Compiladores
)Titulo
- Nestaseccaoapresenta-setodaahistoriadoscompiladores
)Capitulo
)Corpo
(Fecho
(Agradecimentos
A  agr1 345
A  agr2 "fsdg46"
)Agradecimentos
(Bibliografia
- Abibliografiaaconselhadapelodocente
)Bibliografia
)Fecho
)DocXML

		

4.3.Ficheiros da Etapa 3

Fase13.l


%{
#include<string.h>
%}
id [a-zA-Z][a-zA-Z0-9]*
num [+-]?[0-9]+
str \"[^"]*\"
%x MARCA
%%
[ \t\n]+ ;
"<" {BEGIN(MARCA); return ('<');}
"&" {BEGIN(MARCA); return ('&');}
<MARCA>">" {BEGIN(0); return ('>');}
<MARCA>";" {BEGIN(0); return (';');}
<MARCA>"=" {return ('=');}
<MARCA>"/" {return ('/');}
<MARCA>{id} {yylval.nome=strdup(yytext); return (Id);}
<MARCA>{num} {yylval.nome =strdup(yytext);return (Num);}
<MARCA>{str} {yylval.nome =strdup(yytext);return (Str);}
.|\n {yylval.caract=yytext[0];return (Car);}
        
                        

Fase13.y


%{
#include "est.h"
%}
%token <nome> Id Num Str 
%token <caract> Car
%union { char *nome;
         char caract;
         tCelGrove *nodo;
         tAbre abre;
         tCelAtribs *atr;
         tValor vale;
}
%type <nodo> Elems Elem DocXML 
%type <abre> Abert AbertFecho
%type <atr> Atribs Atrib
%type <vale> Valor;
%type <nome> Txt Fecho;
%start DocXML
%%
DocXML:Abert Elems Fecho
      {
       $$=(tCelGrove *)malloc(sizeof(tCelGrove));
       $$->idNodo=$1.idNodo;
       $$->cont.normal.atribs=$1.atribs;
       $$->cont.normal.conteudo=$2;
       $$->seg=NULL;
       grove=$$;
       printf("%s %s\n",$1.idNodo,$3); 
       if (strcmp($1.idNodo,$3)==0)
	 {printf(" Documento XML Valido!\n");}
       else
         {printf ("ERRO! Documento XML nao Valido!\n");}
      }
      ;
Abert:'<' Id Atribs '>'
      {
       $$.idNodo=$2;
       $$.atribs=$3;
       printf("Reconheci Abert!\n");
      }
     ;
Atribs: 
      {
       $$=NULL;
       printf("Reconheci Atribs como vazio!\n");
      }
      |Atribs Atrib
      {
       $$=insereAtrib($1,$2);
       printf("Reconheci Atribs como Atribs Atrib!\n");
      }
      ;
Atrib:Id '=' Valor
     {
      $$=(tCelAtribs *)malloc(sizeof(tCelAtribs));
      $$->idAtrib=$1;
      $$->flag=$3.flag;
      $$->valAtrib=$3.val;
      $$->seg=NULL;
      printf("Reconheci Atrib!\n");
     }
     ;
Valor:Id
     {
      $$.val=$1;
      $$.flag='i';
      printf("Reconheci Valor como Id!\n");
     }
     |Num
     {
      $$.val=$1;
      $$.flag='n';
      printf("Reconheci Valor como Num!\n");
     }
     |Str
     {
      $$.val=$1;
      $$.flag='s';     
      printf("Reconheci Valor como Str!\n");
     }
     ;
Elems:Elem
     {
      $$=$1;
      printf("Reconheci Elems como Elem!\n");
     }
     |Elems Elem
     {
      $$=insereElem($1,$2);
      printf("Reconheci Elems como Elems Elem!\n");
     }    
    ;
Elem:Txt
     {
      $$=(tCelGrove *)malloc(sizeof(tCelGrove));
      $$->idNodo="TEXTO";
      $$->cont.texto=$1;
      $$->seg=NULL;
      printf("Reconheci Elem como Txt! %s\n",$$->idNodo);
     }
     |'&' Id ';'
     {
      $$=(tCelGrove *)malloc(sizeof(tCelGrove));
      $$->idNodo="ENTESP";
      $$->cont.texto=$2;
      $$->seg=NULL;
      printf("Reconheci Elem como '&' Id ';' ! %s\n",$$->idNodo);
     }
     |AbertFecho
     {
      $$=(tCelGrove *)malloc(sizeof(tCelGrove));
      $$->idNodo=$1.idNodo;
      $$->cont.normal.atribs=$1.atribs;
      $$->cont.normal.conteudo=NULL;
      $$->seg=NULL;
      printf("Reconheci Elem como AbertFecho!\n");
     } 
     |Abert Elems Fecho
     { 
       $$=(tCelGrove *)malloc(sizeof(tCelGrove));
       $$->idNodo=$1.idNodo;
       $$->cont.normal.atribs=$1.atribs;
       $$->cont.normal.conteudo=$2;
       $$->seg=NULL;
       printf("%s %s\n",$1.idNodo,$3); 
       if (strcmp($1.idNodo,$3)==0)
	 printf("Reconheci Elems como Abert Elems Fecho!\n");
       else
         {printf ("ERRO! Documento XML nao Valido!\n");exit(0);}
      }
     ;
Txt:Car
    {
     $$=insereCar(NULL,$1);
     printf("Reconheci Txt como Car!\n");
    }
   |Txt Car
     {
      $$=insereCar($1,$2);
      printf("Reconheci Txt como Txt Car!\n");
     }
   ;
Fecho:'<' '/' Id '>'
     {
      $$=$3;
      printf("Reconheci Fecho!\n");
     }
     ;
AbertFecho:'<' Id Atribs '/' '>'
          {
            $$.idNodo=$2;
            $$.atribs=$3;
            printf("Reconheci AbertFecho!\n");
          }
          ;
%%
#include "lex.yy.c"
#include "aux1.c"

yyerror(){
  printf("ERRO! Documento XML nao Valido!\n");
}

main(){
  yyparse();
  geraEsis(grove);
}

        

Est.h


typedef struct atributo
   { char *idAtrib;
     char flag;
     char *valAtrib;
     struct atributo *seg;
}tCelAtribs;

typedef struct nodo
   { char *idNodo;
     union C
      { char *texto;
	struct X
	 { struct nodo *conteudo;
	   tCelAtribs *atribs;
	}normal;
     }cont;
     struct nodo *seg;
}tCelGrove;

typedef struct A
  { char *idNodo;
    tCelAtribs *atribs;
}tAbre;
typedef struct V
  { char *val;
    char flag;
}tValor;

typedef tCelGrove *tNodoGrove;

typedef tCelAtribs *tNodoAtribs;

typedef char *tCaracter;

tNodoGrove grove;

         

Aux1.c


/* retorna o apontador para o ultimo elemento da lista */ 

tNodoGrove ultimo_listaG(tNodoGrove lista)
  { if (lista->seg!=NULL)
    { return ultimo_listaG(lista->seg);}
  else
    return lista;
}

tNodoAtribs ultimo_listaA(tNodoAtribs lista)
  { if (lista->seg!=NULL)
    { return ultimo_listaA(lista->seg);}
  else
    return lista;
}

/* insere um elemento na lista */

tNodoGrove insereElem(tNodoGrove lista,tNodoGrove elem)
  { tNodoGrove aux;
  if (lista==NULL)
    lista=elem;
  else
    {aux=(tNodoGrove)ultimo_listaG(lista);
    aux->seg=elem;
    }
  return lista;
}

tNodoAtribs insereAtrib(tNodoAtribs lista,tNodoAtribs atrib)
  { tNodoAtribs aux;
  if (lista==NULL)
    lista=atrib;
  else
    {aux=(tNodoAtribs)ultimo_listaA(lista);
    aux->seg=atrib;
    }
  return lista;
}
/* insere um caracter numa lista de caracteres */

tCaracter insereCar(tCaracter lista,char c)
  { tCaracter aux,lista1,r,r1;
    int comp;
    if (lista!=NULL)
      {r=lista;
       comp=strlen(lista)+1;
       r1=lista1=(tCaracter)malloc(comp+1);
       while (*lista)
	 {*lista1=*lista;
	 lista1++;
	 lista++;
	 }
       *lista1=c;
       lista1++;
       *lista1='\0';
       free(r);
       return(r1);
      } 
    else
       { r1=lista=(tCaracter)malloc(2);
	       *lista=c;
	       lista++;
         *lista='\0';
         return(r1); 
       }
}
    
/* funcao que gera o documento XML no formato ESIS */

void escrever_atributos(tNodoAtribs atribs)
  { if (atribs!=NULL)
      { printf("A  %s %s\n",atribs->idAtrib,atribs->valAtrib);
        escrever_atributos(atribs->seg);
       }
}

void geraEsis(tNodoGrove grove)
  { if (grove!=NULL)
    { if ((strcmp(grove->idNodo,"TEXTO")!=0) && (strcmp(grove->idNodo,"ENTESP")!=0))
       { printf("(%s\n",grove->idNodo);
         escrever_atributos(grove->cont.normal.atribs);
	 geraEsis(grove->cont.normal.conteudo);
	 printf(")%s\n",grove->idNodo);
	 }
	 else
	   {printf("- %s\n",grove->cont.texto);}
       geraEsis(grove->seg);
    }
}

        

Agradecimentos:

Durante a realização deste trabalho tivemos várias dificuldades, sendo estas ultrapassadas com a ajuda do nosso docente, bem como a ajuda de vários colegas de curso e também várias outras pessoas nossas conhecidas. Tambem e não esquecendo foi-nos uma grande ajuda a bibliografia aconselhada pelo docente da disciplina de Processamentos de Linguagens I. A todas as pessoas a que recorremos para uma ajuda neste trabalho o nosso muito obrigado e pedimos desculpa pelo incomodo. Muito obrigado!...

Bibliografia: