Está en la página 1de 4

/****************************** Ejemplo lex1.

l *******************************/ nulo blanco digito letra resto ident idlargo [ \t\n] {nulo}+ [0-9] [A-Za-z] ({letra}|{digito}){0,7} {letra}{resto} {letra}({letra}|{digito})* ; {printf("programa \n");} {printf("int \n");} {printf("ident(8) \n");} {printf("ident(+8) \n");} {printf("error lexico (%s) \n", yytext);}

%% {nulo} program int {ident} {idlargo} .

/**************************** ejemplo lex2.l *********************************** */ %{ /* este codigo C se incorpora a las declaraciones de lex.yy.c */ /* la diferencia es que entre estas marcas es posible empezar en la columna 1 */ #define MAXNOMBRE 20 %} void leer_nombre(char *); /* esta linea de codigo debe comenzar por un blanco o tabulador*/ int conta=1; /* contador de ficheros procesados */ char entrada[MAXNOMBRE]; /* este programa elimina las secuencias de mayusculas de dos ficheros suministr ados como entrada. Escribe el resultado en el fichero de salida. Tambien imprime la longitud de las secuencias de mayusculas eliminadas */ %% [A-Z]+ {printf("%s",yytext); /*ECHO;*/ printf("%d \n",yyleng);} /* comparar el resultado obtenido al comentar printf("%s

", yytext); */ %% /* este codigo se incorpora al final de lex.yy.c */ /* este programa se compila sin la directiva -ll */ main() { char salida[MAXNOMBRE]; printf("nombre del fichero de entrada (max. 20 caracteres) ? \n"); leer_nombre(entrada); printf("nombre del fichero de salida (max. 20 caracteres) ? \n"); leer_nombre(salida);

yyin = fopen(entrada, "r"); yyout = fopen(salida, "w"); yylex(); fclose(yyin); fclose(yyout); printf("terminado \n"); } void leer_nombre(char *nombre) { char c; while((c=getchar())!= '\n') *nombre++ =c; *nombre = '\0'; } yywrap() {/* cuando termina de leer los 2 ficheros de entrada la funcion devuelve 1 y el programa termina, en otro caso abrimos el segundo fichero para procesarlo y devuelve 0 */ if (conta >= 2) return 1; else { fclose(yyin); printf("nombre del segundo fichero de entrada? \n"); leer_nombre(entrada); yyin = fopen(entrada, "r"); conta = conta + 1; return 0; } } /******************************** ejemplo lex3.l ****************************** **************/ /* este programa cuenta los caracteres del fichero de entrada incluyendo blancos y tabuladores incluimos las funciones main() y yywrap() */ int conta =0; /*declarado extern a yylex() */ %% . \n %% main() { yylex(); printf ("numero de caracteres %d \n", conta); printf("terminado main \n"); } yywrap() { printf("terminado return 1; } yywrap \n"); {printf("%s",yytext); conta += yyleng;} ECHO;

/************************ ejemplo lex4.l *********************************/ %{ int entero; float real; int conv1(unsigned char yytext[], int); float conv2(unsigned char yytext[], int); %} digito [0-9] %% {digito}+ {digito}+"."{digito}* . %% {entero=conv1(&yytext[0],yyleng); printf("entero = %d \n", entero);} {real=conv2(&yytext[0],yyleng); printf("real = %9.5f \n", real);} {}

int conv1(unsigned char *yytext, int yyleng) { int i, resultado=0; for (i=0; i< yyleng; ++i) resultado = (yytext[i]-'0') + resultado *10; return resultado; } float conv2(unsigned char *yytext, int yyleng) { int i, flag = 0; float resultado=0; for (i=0; i<yyleng; ++i){ if (yytext[i] == '.') flag = -1; else if (flag==0) resultado=(yytext[i]-'0')+resultado*10; else { int j; float peso=1; for (j=flag; j<0; ++j) peso/=10; resultado=resultado + (yytext[i]-'0') *peso; flag += -1; } } return resultado; } /*********************** ejemplo lex5.l *********************************/ /* elimina etiquetas sgml-xml de un archivo y algunas entidades caracter */ principio fin contenido etiqueta %% {etiqueta} "<" ">" [^>]+ {principio}{contenido}{fin} ;

"&aacute;" "&eacute;" "&iacute;" "&oacute;" "&uacute;" "&Aacute;" "&Eacute;" "&Iacute;" "&Oacute;" "&Uacute;" "&nbsp;"

{printf("%c",225);} {printf("%c",233);} {printf("%c",237);} {printf("%c",243);} {printf("%c",250);} {printf("%c",193);} {printf("%c",201);} {printf("%c",205);} {printf("%c",211);} {printf("%c",218);} {printf(" ");}

También podría gustarte