Ejemplos Analizador Lexico -LEX

/****************************** Ejemplo lex1.l *******************************/ nulo blanco digito letra resto ident idl

Views 82 Downloads 2 File size 13KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

/****************************** 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})*

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

; {printf("programa \n");} {printf("int \n");} {printf("ident(8) \n");} {printf("ident(+8) \n");} {printf("error lexico (%s) \n", yytext);}

/**************************** 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() */ %% .

{printf("%s",yytext); conta += yyleng;} ECHO;

\n %% main() {

yylex(); printf ("numero de caracteres %d \n", conta); printf("terminado main \n"); } yywrap() { printf("terminado return 1; }

yywrap \n");

/************************ 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]+ {principio}{contenido}{fin}

%% {etiqueta}

;

"á" "é" "í" "ó" "ú" "Á" "É" "Í" "Ó" "Ú" " "

{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(" ");}