%{ #include #include #include "grove.h" #include "gramatica.tab.h" extern int nlines; GString* str; int conta(char* line) { char* a; int c=0; a=line; while(*line) { if(*line=='\n') c++; line++; } return c; } %} %x TAG ATRIB %% \< { if (str) { yylval.gstr=str; str=NULL; unput ('<'); return texto; } else { BEGIN(TAG); return *yytext; } } \>[ \n\t\r]*\< { BEGIN(0); nlines+=conta(yytext); unput('<'); return *yytext; } \>[ \n\t\r]*$ { nlines+=conta(yytext); BEGIN(0); return *yytext;} \> { BEGIN(0); return *yytext; } \= { return *yytext; } \"[^\"]*\" { yylval.str=strdup(yytext);return valor; } \/ { return *yytext; } [A-Za-z][A-Za-z0-9]* { yylval.str=strdup(yytext);return id; } [ \t\r]+ ; [\n] { nlines++; } PLI-DOC { BEGIN(ATRIB); return PLI_DOC; } ABERTURA { BEGIN(ATRIB); return ABERTURA; } TITULO { BEGIN(ATRIB); return TITULO; } DATA { BEGIN(ATRIB); return DATA; } AUTOR { BEGIN(ATRIB); return AUTOR; } NOME { BEGIN(ATRIB); return NOME; } EMAIL { BEGIN(ATRIB); return EMAIL; } URL { BEGIN(ATRIB); return URL; } RESUMO { BEGIN(ATRIB); return RESUMO; } CORPO { BEGIN(ATRIB); return CORPO; } SECCAO { BEGIN(ATRIB); return SECCAO; } CAPITULO { BEGIN(ATRIB); return CAPITULO; } PARA { BEGIN(ATRIB); return PARA; } LISTA { BEGIN(ATRIB); return LISTA; } ITEM { BEGIN(ATRIB); return ITEM; } REF { BEGIN(ATRIB); return REF; } REALCADO { BEGIN(ATRIB); return REALCADO; } COMANDO { BEGIN(ATRIB); return COMANDO; } FIGURA { BEGIN(ATRIB); return FIGURA; } GRAFICO { BEGIN(ATRIB); return GRAFICO; } EXEMPLO { BEGIN(ATRIB); return EXEMPLO; } FECHO { BEGIN(ATRIB); return FECHO; } AGRADECIMENTOS { BEGIN(ATRIB); return AGRADECIMENTOS; } BIBLIOGRAFIA { BEGIN(ATRIB); return BIBLIOGRAFIA; } BIBITEM { BEGIN(ATRIB); return BIBITEM; } CHAVE { BEGIN(ATRIB); return CHAVE; } PUB { BEGIN(ATRIB); return PUB; } CODPROGRAMA { BEGIN(ATRIB); return CODPROGRAMA; } . {printf("Erro: caracter esquisito na linha %d:%s\n",nlines,yytext); exit(1);} [^<]{1,128} { nlines+=conta(yytext); if (!str) str=g_string_new(""); str = g_string_append(str,yytext); } %%