%{ #include #include typedef struct A { char *nome; char *valor; struct A *seguinte; } Atributo, *Atributos; typedef struct E { char *id; Atributos atributos; union{ struct E *elems; char *pcdata; } conteudo; struct E *seguinte; } Elemento, *Elementos; Atributos criarAtributo(char* id, char* valor); Elementos criarElemento(char* id, Atributos atribs); Elementos criarPCdata(char* id); Atributos juntaAtributo(Atributos lst, Atributos e); Elementos juntaElemento(Elementos lst, Elementos e); %} %union { char* string; Elementos elems; Atributos atribs; } %token id valor pcdata %type DocXML Elems TagA TagAF Elem %type Atrib Atribs %% DocXML : TagA Elems TagF { $1->conteudo.elems = $2; $$ = $1; } ; TagA : '<' id Atribs '>' { $$ = criarElemento($2, $3); } ; TagF : '<' '/' id '>' ; TagAF : '<' id Atribs '/' '>' { $$ = criarElemento($2, $3); } ; Atribs : { $$ = NULL; } | Atribs Atrib { $$ = juntaAtributo($1, $2); } ; Atrib : id '=' valor { $$ = criarAtributo($1, $3); } ; Elems : { $$ = NULL; } | Elems Elem { $$ = juntaElemento($1, $2); } ; Elem : pcdata { $$ = criarPCData($1); } | DocXML { $$ = $1; } | TagAF { $1->conteudo.elems = NULL; $$ = $1; } ; %% Atributos criarAtributo(char* id, char* valor) { Atributos r = (Atributos) malloc(sizeof(Atributo)); r->nome = strdup(id); r->valor = strdup(valor); r->seguinte = NULL; return r; } Elementos criarElemento(char* id, Atributos a) { Elementos r = (Elementos) malloc(sizeof(Elemento)); r->id = strdup(id); r->atributos = a; r->seguinte = NULL; return r; } Elementos criarPCData(char* s) { Elementos r = (Elementos) malloc(sizeof(Elemento)); r->id = strdup(""); r->atributos = NULL; r->conteudo.pcdata = strdup(s); r->seguinte = NULL; return r; } Atributos juntaAtributo(Atributos lst, Atributos e); { Atributos l; if (lst==NULL) { lst = e; } else { l=lst; while (l->seguinte) { l=l->seguinte; } l->seguinte=e; } return lst; } Elementos juntaElemento(Elementos lst, Elementos e); { Elementos l; if (lst==NULL) { lst = e; } else { l=lst; while (l->seguinte) { l=l->seguinte; } l->seguinte = e; } return lst; } void yyerror(char *s) { fprintf(stderr, "ERRO: %s \n", s); } int main() { yyparse(); return(0); }