Está en la página 1de 38

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

INDICE INTRODUCCION . LEX. UNA HERRAMIENTA PARA EL ANALISIS LEXICO LA PLANTILLA DE LEX . SECCION DE DECLARACIONES .. SECCIN DE REGLAS. . SECCIN DE PROCEDIMIENTOS DE USUARIO. LAS VARIABLES, FUNCIONES, PROCEDIMIENTOS Y MACROS INTERNAS DE LEX.. FIJANDO CONDICIONES A LAS REGLAS.. EL PROCESO DE COMPILACIN .. LEX COMO UN ANALIZADOR LXICO.. ESPECIFICACIN DE CLASES DE CARACTERES. ESPECIFICACIN DE EXPRESIONES REPETIDAS. . ESPECIFICACIN DE ALTERNACIN Y DE AGRUPAMIENTO... ESPECIFICACIN DE SENSITIVIDAD DE CONTEXTO ESPECIFICACIN DE REPETICIN DE EXPRESIONES. ESPECIFICAR DEFINICIONES.. ESPECIFICACIN DE ACCIONES.. . MANEJO DE RDENES FUENTES AMBIGUAS. ESPECIFICACIN DE SENSIBILIDAD DE CONTEXTO IZQUIERDO
1

2 4 6 7 8 1 0 1 1 1 5 1 6 1 7 2 3 2 4 2 4 2 4 2 5 2 5 2 5 2 6 2 7 2 8 3 0 3 3 3

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

ESPECIFICACIN DE DEFINICIONES FUENTE.. EJEMPLOS .. CONCLUSIONES .. BIBLIOGRAFIA . ANEXOS ..

4 3 5

INTRODUCCION
EN EL PRESENTE ESCRITO LES EXPLICARE ACERCA DE COMO FUNCIONA UNA APLICACIN LLAMADA LEX QUE ES UNA HERRAMIENTA PARA CONSTRUIR ANALIZADORES LXICOS PARA UNA VARIEDAD DE LENGUAJES. LEX ES UNA HERRAMIENTA DE LOS SISTEMAS UNIX/LINUX QUE NOS VA A PERMITIR GENERAR CDIGO C QUE LUEGO PODREMOS COMPILAR Y ENLAZAR CON NUESTRO PROGRAMA. LA PRINCIPAL CARACTERSTICA DE LEX ES QUE NOS VA A PERMITIR ASOCIAR ACCIONES DESCRITAS EN C, A LA LOCALIZACIN DE LAS EXPRESIONES REGULARES QUE LE HAYAMOS DEFINIDO. PARA ELLO LEX SE APOYA EN UNA PLANTILLA QUE RECIBE COMO PARMETRO, Y QUE DEBEREMOS DISEAR CON CUIDADO. INTERNAMENTE LEX VA A ACTUAR COMO UN AUTMATA QUE LOCALIZAR LAS EXPRESIONES REGULARES QUE LE DESCRIBAMOS,
2

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

Y UNA VEZ RECONOCIDA LA CADENA REPRESENTADA POR DICHA EXPRESIN REGULAR, EJECUTAR EL CDIGO ASOCIADO A ESA REGLA. EXTERNAMENTE PODEMOS VER A LEX COMO SE MUESTRA EN LA SIGUIENTE ESTRUCTURA: Plantilla.l Lex a.out (fich.Ejecutable)
Otros mdulos de nuestro programa

yy.lex.c

Compilador + Enlazador (cc)

UNA VEZ EXPUESTA DE FORMA GENERAL COMO FUNCIONA ESTA HERRAMIENTA PROPIA DE LINUX LES DARE UNA BREVE EXPLICACION DE LO QUE ES UN ANALIZADOR LEXICO Y EN QUE CONSISTEN SUS FUNCIONES. UN ANALIZADOR LEXICO (TAMBIEN LLAMADO SCANNER) ES UN PROGRAMA QUE RECIBE COMO ENTRADA EL CDIGO FUENTE DE OTRO PROGRAMA (SECUENCIA DE CARACTERES) Y PRODUCE UNA SALIDA COMPUESTA DE TOKENS (COMPONENTES LXICOS) O SMBOLOS. ESTOS TOKENS SIRVEN PARA UNA POSTERIOR ETAPA DEL PROCESO DE TRADUCCIN, SIENDO LA ENTRADA PARA EL ANALIZADOR SINTCTICO. UNAS DE LAS PRINCIPALES FUNCIONES DEL ANALIZADOR LEXICO SON LEER LA SECUENCIA DE CARACTERES DEL PROGRAMA FUENTE, CARACTER A CARACTER, Y LOS AGRUPA PARA FORMAR UNIDADES CON SIGNINCADO PROPIO, LOS COMPONENTES LEXICOS (TOKENS EN INGLES). ESTOS COMPONENTES LEXICOS REPRESENTAN: PALABRAS RESERVADAS: if, while, do, ETC. IDENTIFICADORES: ASOCIADOS A VARIABLES, NOMBRES DE FUNCIONES, TIPOS DEFINIDOS POR EL USUARIO, ETIQUETAS, ETC. POR EJEMPLO: posicin, velocidad, tiempo, ETC.
3

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

OPERADORES: = * + - / == > < & ! = ETC. SIMBOLOS ESPECIALES: ; ( ) [ ] ETC. CONSTANTES NUMERICAS: LITERALES QUE REPRESENTAN VALORES ENTEROS, EN COMA FLOTANTE, ETC. POR EJEMPLO: 982, 0xF678, -83.2E+2, ETC. CONSTANTES DE CARACTERES: LITERALES QUE REPRESENTAN CADENAS CONCRETAS DE CARACTERES. POR EJEMPLO: hola mundo, ETC. EL ANALIZADOR LEXICO OPERA BAJO PETICION DEL ANALIZADOR SINTACTICO DEVOLVIENDO UN COMPONENTE LEXICO CONFORME EL ANALIZADOR SINTACTI- CO LO VA NECESITANDO PARA AVANZAR EN LA GRAMATICA. LOS COMPONENTES LEXICOS SON LOS SIMBOLOS TERMINALES DE LA GRAMATICA. SUELE IMPLEMENTARSE COMO UNA SUBRUTINA DEL ANALIZADOR SINTACTICO. CUANDO RECIBE LA ORDEN OBTEN EL SIGUIENTE COMPONENTE LEXICO, EL ANALIZADOR LEXICO LEE LOS CARACTERES DE ENTRADA HASTA IDENTICAR EL SIGUIENTE COMPONENTE LEXICO.
Prog. fuente anlisis sintctico componente lex. Componente lxico rbol de Obten. sig.

Analizad or Lxico

Analizad or Sintctic

ESTRUCTURA DE UN ANALIZADOR LEXICO EN CONJUNTO CON EL ANALIZADOR SINTACTICO. LEX. UNA HERRAMIENTA PARA EL ANALISIS LEXICO EL LEX ES UN GENERADOR DE PROGRAMAS DISEADO PARA EL PROCESO LXICO DE CADENAS DE CARACTERES DE INPUT. EL PROGRAMA ACEPTA UNA ESPECIFICACIN, ORIENTADA A RESOLVER UN PROBLEMA DE ALTO NIVEL PARA COMPARAR LITERALES DE CARACTERES, Y PRODUCE UN PROGRAMA C QUE RECONOCE EXPRESIONES REGULARES. ESTAS EXPRESIONES LAS
4

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

ESPECIFICA EL USUARIO EN LAS ESPECIFICACIONES FUENTE QUE SE LE DAN AL LEX. EL CDIGO LEX RECONOCE ESTAS EXPRESIONES EN UNA CADENA DE INPUT Y DIVIDE ESTE INPUT EN CADENAS DE CARACTERES QUE COINCIDEN CON LAS EXPRESIONES. EN LOS BORDES ENTRE LOS LITERALES, SE EJECUTAN LAS SECCIONES DE PROGRAMAS PROPORCIONADOS POR EL USUARIO. EL FICHERO FUENTE LEX ASOCIA LAS EXPRESIONES REGULARES Y LOS FRAGMENTOS DE PROGRAMAS. PUESTO QUE CADA EXPRESIN APARECE EN EL INPUT DEL PROGRAMA ESCRITO POR EL LEX, SE EJECUTA EL FRAGMENTO CORRESPONDIENTE. EL USUARIO PROPORCIONA EL CDIGO ADICIONAL NECESARIO PARA COMPLETAR ESTAS FUNCIONES, INCLUYENDO CDIGO ESCRITO POR OTROS GENERADORES. EL PROGRAMA QUE RECONOCE LAS EXPRESIONES SE GENERA EN FORMA DE FRAGMENTOS DE PROGRAMA C DEL USUARIO, EL LEX NO ES UN LENGUAJE COMPLETO SINO UN GENERADOR QUE REPRESENTA UNA CUALIDAD DE UN NUEVO LENGUAJE QUE SE AADE AL LEGUAJE DE PROGRAMACIN C. EL LEX CONVIERTE LAS EXPRESIONES Y ACCIONES DEL USUARIO EN UN PROGRAMA C LLAMADO YYLEX. EL PROGRAMA YYLEX RECONOCE EXPRESIONES EN UN FLUJO (LLAMADO INPUT) Y LLEVA A CABO LAS ACCIONES ESPECIFICADAS PARA CADA EXPRESIN A MEDIDA QUE SE VA DETECTANDO. CONSIDERE UN PROGRAMA PARA BORRAR DEL INPUT TODOS LOS ESPACIOS EN BLANCO Y TODOS LOS TABULADORES DE LOS EXTREMOS DE LAS LNEAS. LAS LNEAS SIGUIENTES: %% [b\ t]+ $; ES TODO LO QUE SE REQUIERE. EL PROGRAMA CONTIENE UN DELIMITADO %% PARA MARCAR EL PRINCIPIO DE LAS RDENES, Y UNA ORDEN. ESTA ORDEN CONTIENE UNA EXPRESIN QUE COINCIDE CON UNA O MS APARICIONES DE LOS CARACTERES ESPACIO EN BLANCO O TABULADOR (ESCRITO \ T PARA QUE SE VEA CON MAYOR CLARIDAD, DE ACUERDO CON LA CONVENCIN DEL LENGUAJE C) JUSTO ANTES DEL FINAL DE UNA LNEA. LOS CORCHETES INDICAN LA CLASE DEL CARCTER COMPUESTO DE ESPACIOS EN BLANCO Y TABULADORES; EL + INDICA UNO O MS DEL ITEM ANTERIOR; Y EL SIGNO DE DLAR ($) INDICA EL FINAL DE LA LNEA. NO SE ESPECIFICA NINGUNA ACCIN, POR LO TANTO EL PROGRAMA GENERADO POR EL LEX IGNORAR ESTOS
5

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

CARACTERES. TODO LO DEMS SE COPIAR. PARA CAMBIAR CUALQUIER CADENA DE CARACTERES EN BLANCO O TABULADORES QUE QUEDEN EN UN SOLO ESPACIO EN BLANCO, AADA OTRA ORDEN: %% [b\ t]+$; [b\ t] + printf ( ); LA AUTOMATIZACIN GENERADA POR ESTE FUENTE EXPLORA AMBAS RDENES A LA VEZ, OBSERVA LA TERMINACIN DE LA CADENA DE ESPACIOS O TABULADORES HAYA O NO UN CARCTER NEWLINE, Y DESPUS EJECUTA LA ACCIN DE LA ORDEN DESEADA. LA PRIMERA ORDEN COINCIDE CON TODAS LAS CADENAS DE CARACTERES DE ESPACIOS EN BLANCO O TABULADORES HASTA EL FINAL DE LAS LNEAS, Y LA SEGUNDA ORDEN COINCIDE CON TODOS LOS LITERALES RESTANTES DE ESPACIOS O TABULADORES. EL LEX SE PUEDE USAR SLO PARA TRANSFORMACIONES SENCILLAS, O POR ANLISIS O ESTADSTICAS BUSCANDO EN UN NIVEL LXICO. EL LEX TAMBIN SE PUEDE USAR CON UN GENERADOR RECONOCEDOR PARA LLEVAR A CABO LA FASE DE ANLISIS LXICO; ES ESPECIALMENTE FCIL HACER QUE EL LEX Y EL YACC FUNCIONEN JUNTOS. LOS PROGRAMAS LEX RECONOCEN SLO EXPRESIONES REGULARES; YACC ESCRIBE RECONOCEDORES QUE ACEPTAN UNA AMPLIA CLASE DE GRAMTICAS DE TEXTO LIBRE, PERO QUE REQUIEREN UN ANALIZADOR DE NIVEL BAJO PARA RECONOCER TOKENS DE INPUT. POR LO TANTO, A MENUDO ES CONVENIENTE UNA COMBINACIN DEL LEX Y DEL YACC. CUANDO SE USA COMO UN PREPROCESADOR PARA UN GENERADOR, EL LEX SE USA PARA DIVIDIR EL INPUT, Y EL GENERADOR DE RECONOCIMIENTO ASIGNA UNA ESTRUCTURA A LAS PIEZAS RESULTANTES. LOS PROGRAMAS ADICIONALES, ESCRITOS POR OTROS GENERADORES O A MANO, SE PUEDEN AADIR FCILMENTE A PROGRAMAS QUE HAN SIDO ESCRITOS POR EL LEX. LOS USUARIOS DEL YACC SE DARN CUENTA DE QUE EL NOMBRE YYLEX ES EL QUE EL YACC DA A SU ANALIZADOR LXICO, DE FORMA QUE EL USO DE ESTE NOMBRE POR EL LEX SIMPLIFICA EL INTERFACE. EL LEX GENERA UN AUTMATA FINITO PARTIENDO DE EXPRESIONES REGULARES DEL FUENTE. EL AUTMATA ES INTERPRETADO, EN VEZ DE COMPILADO, PARA AHORRAR ESPACIO.
6

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

EL RESULTADO ES TODAVA UN ANALIZADOR RPIDO. EN PARTICULAR, EL TIEMPO QUE UTILIZA UN PROGRAMA LEX PARA RECONOCER Y DIVIDIR UNA CADENA DE INPUT ES PROPORCIONAL A LA LONGITUD DEL INPUT. EL NMERO DE RDENES LEX O LA COMPLEJIDAD DE LAS RDENES NO ES IMPORTANTE PARA DETERMINAR LA VELOCIDAD, A NO SER QUE LAS RDENES QUE INCLUYAN CONTEXTO POSTERIOR REQUIERAN UNA CANTIDAD IMPORTANTE DE EXPLORACIN. LO QUE AUMENTA CON EL NMERO Y COMPLEJIDAD DE LAS RDENES ES EL TAMAO DEL AUTMATA FINITO, Y POR LO TANTO EL TAMAO DEL PROGRAMA GENERADO POR EL LEX. EN EL PROGRAMA ESCRITO POR EL LEX, LOS FRAGMENTOS DEL USUARIO (REPRESENTANDO ACCIONES QUE SE VAN A LLEVAR A CABO A MEDIDA QUE SE ENCUENTRA CADA EXPRESIN) SE COLECTAN COMO CASOS DE UN INTERCAMBIO. EL INTRPRETE DEL AUTMATA DIRIGE EL FLUJO DE CONTROL. SE PROPORCIONA LA OPORTUNIDAD AL USUARIO PARA INSERTAR DECLARACIONES O SENTENCIAS ADICIONALES EN LA RUTINA QUE CONTIENE LAS ACCIONES, O PARA AADIR SUBRUTINAS FUERA DE ESTA RUTINA DE ACCIN. EL LEX NO EST LIMITADO A FUENTE QUE SE PUEDE INTERPRETAR SOBRE LA BASE DE UN POSIBLE CARCTER. POR EJEMPLO, SI HAY DOS RDENES UNA QUE BUSCA AB Y LA OTRA QUE BUSCA ABCDEFG, Y LA CADENA DE CARACTERES DEL INPUT ES ABCDEFH, EL LEX RECONOCER AB Y DEJAR EL PUNTERO DEL INPUT JUSTO DELANTE DE CD. TAL PRECAUCIN ES MS COSTOSA QUE EL PROCESO DE LENGUAJES MS SENCILLOS. LA PLANTILLA DE LEX. LA PLANTILLA EN LA QUE LEX SE VA A APOYAR PARA GENERAR EL CDIGO C, Y DONDE NOSOTROS DEBEREMOS DESCRIBIR TODA LA FUNCIONALIDAD REQUERIDA, VA A SER UN FICHERO DE TEXTO PLANO CON UNA ESTRUCTURA BIEN DEFINIDA, DONDE IREMOS DESCRIBIENDO LAS EXPRESIONES REGULARES Y LAS ACCIONES ASOCIADAS A ELLA. LA ESTRUCTURA DE LA PLANTILLA ES LA SIGUIENTE: Declaraciones %%
7

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

Reglas %% Procedimientos De Usuario SE COMPONE DE TRES SECCIONES CON ESTRUCTURAS DISTINTAS Y CLARAMENTE DELIMITADAS POR UNA LNEA EN LA QUE LO NICO QUE APARECE ES EL CARCTER DOBLE %. LAS SECCIONES DE DECLARACIONES Y LA DE PROCEDIMIENTOS DE USUARIO SON OPCIONALES, MIENTRAS QUE LA DE REGLAS ES OBLIGATORIA (AUNQUE SE ENCUENTRE VACA), CON LO QUE TENEMOS QUE LA PLANTILLA MS PEQUEA QUE PODEMOS DEFINIR ES: %% ESTA PLANTILLA, INTRODUCIDA EN LEX, GENERARA UN PROGRAMA C DONDE EL CONTENIDO DE LA ENTRADA ESTNDAR SERA COPIADO EN LA SALIDA ESTNDAR POR LA APLICACIN DE LAS REGLAS Y ACCIONES POR DEFECTO. EL FORMATO DE CADA UNA DE LAS SECCIONES DE LA PLANTILLA DE LEX LO DISCUTIREMOS MAS ADELANTE. LEX VA A ACTUAR COMO UN PRE-PROCESADOR QUE VA A TRASFORMAR LAS DEFINICIONES DE ESTA PLANTILLA EN UN FICHERO DE CDIGO C. SECCION DE DECLARACIONES. EN LA SECCIN DE DECLARACIONES PODEMOS ENCONTRARNOS CON 3 TIPOS DE DECLARACIONES BIEN DIFERENCIADOS:
UN BLOQUE DONDE LE INDICAREMOS AL PRE-PROCESADOR

QUE LO QUE ESTAMOS DEFINIENDO QUEREMOS QUE APAREZCA TAL CUAL EN EL FICHERO C GENERADO. ES UN BLOQUE DE COPIA DELIMITADO POR LAS SECUENCIAS %{ Y %} DONDE PODEMOS INDICAR LA INCLUSIN DE LOS FICHEROS DE CABECERA NECESARIOS, O LA DECLARACIN DE VARIABLES GLOBALES, O DECLARACIONES PROCEDIMIENTOS DESCRITOS EN LA SECCIN DE PROCEDIMIENTOS DE USUARIO:

%{ 8

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS /* Este bloque aparecer tal cual en el fichero yy.lex.c */ #include <stdio.h> #include <stdlib.h> #define VALUE 33 int nl, np, nw %}

UN BLOQUE DE DEFINICIN DE ALIAS, DONDE PONDREMOS NOMBRE A ALGUNAS DE LAS EXPRESIONES REGULARES UTILIZADAS. EN ESTE BLOQUE, APARECER AL COMIENZO DE LA LNEA EL NOMBRE CON EL QUE BAUTIZAREMOS A ESA EXPRESIN REGULAR Y SEPARADO POR UN TABULADOR (AL MENOS), INDICAREMOS LA DEFINICIN DELA EXPRESIN REGULAR. PARA UTILIZAR DICHOS NOMBRES EN VEZ DE LAS EXPRESIONES REGULARES DEBEMOS ESCRIBIRLOS ENTRE LLAVES: entero [0-9]+ real {entero}.{entero} real2 {real}[eE][\+\-]?{entero} numero {entero}|{real}|{real2} UN BLOQUE DE DEFINICIN DE LAS CONDICIONES DE ARRANQUE DEL AUTMATA. %s normal ESTOS BLOQUES PUEDEN APARECER EN CUALQUIER ORDEN, Y PUEDEN APARECER VARIOS DE ELLOS A LO LARGO DE LA SECCIN DE DECLARACIONES. SECCIN DE REGLAS. EN LA SECCIN DE REGLAS SLO PERMITIREMOS UN NICO TIPO DE ESCRITURA. LAS REGLAS SE DEFINEN COMO SIGUE: Exp.reg.tab-> {acciones escritas en C}
9

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

AL COMIENZO DE LA LNEA SE INDICA LA EXPRESIN REGULAR, SEGUIDA INMEDIATAMENTE POR UNO O VARIOS TABULADORES, HASTA LLEGAR AL CONJUNTO DE ACCIONES EN C QUE DEBEN IR ENCERRADOS EN UN BLOQUE DE LLAVES. A LA HORA DE ESCRIBIR LAS EXPRESIONES REGULARES PODEMOS HACER USO DE LOS ACRNIMOS DADOS EN LA SECCIN DE DECLARACIONES, ESCRIBINDOLOS ENTRE LLAVES, Y MEZCLNDOLOS CON LA SINTAXIS GENERAL DE LAS EXPRESIONES REGULARES. SI LAS ACCIONES DESCRITAS QUEREMOS QUE APAREZCAN EN VARIAS LNEAS DEBIDO A SU TAMAO, DEBEMOS COMENZAR CADA UNA DE ESAS LNEAS CON AL MENOS UN CARCTER DE TABULACIN. SI QUEREMOS INCORPORAR ALGN COMENTARIO EN C EN UNA O VARIAS LNEAS DEBEMOS COMENZAR CADA UNA DE ESAS LNEAS CON AL MENOS UN CARCTER DE TABULACIN. [a-zA-Z_][a-zA-Z0-9_]* { printf (ID: %s, yytext); } {numero} { printf (NUM: %s, yytext);} ^{numero} { printf (NUM al ppio linea);} COMO NORMAS PARA LA IDENTIFICACIN REGULARES, LEX SIGUE LAS SIGUIENTES: DE EXPRESIONES

- SIEMPRE INTENTA ENCAJAR UNA EXPRESIN REGULAR CON LA CADENA MS LARGA POSIBLE. - EN CASO DE CONFLICTO ENTRE EXPRESIONES REGULARES (PUEDEN APLICARSE DOS O MS PARA UNA MISMA CADENA DE ENTRADA), LEX, SE GUA POR ESTRICTO ORDEN DE DECLARACIN DE LAS REGLAS. EXISTE UNA REGLA POR DEFECTO, QUE ES: . {ECHO;}

10

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

ES DECIR, QUE EN CASO DE QUE LA ENTRADA NO ENCAJE CON NINGUNA DE LAS REGLAS, SE APLICAR ESTA: CUALQUIER CARCTER->LO IMPRIME EN LA SALIDA ESTNDAR. SI QUEREMOS MODIFICAR ESTE COMPORTAMIENTO TAN SOLO DEBEMOS SOBRESCRIBIR LA REGLA . CON LA ACCIN DESEADA ({} SI NO QUEREMOS QUE HAGA NADA). .{}

SECCIN DE PROCEDIMIENTOS DE USUARIO. EN LA SECCIN DE PROCEDIMIENTOS DE USUARIO ESCRIBIREMOS EN C SIN NINGUNA RESTRICCIN AQUELLOS PROCEDIMIENTOS QUE HAYAMOS NECESITADO EN LA SECCIN DE REGLAS. TODO LO QUE APAREZCA EN ESTA SECCIN SER INCORPORADO TAL CUAL AL FINAL DEL FICHERO YY.LEX.L. NO DEBEMOS OLVIDAR COMO CONCEPTO DE C, QUE SI LA IMPLEMENTACIN DE LOS PROCEDIMIENTOS SE REALIZA DESPUS DE SU INVOCACIN (EN EL CASO DE LEX, LO MS PROBABLE ES QUE SE HAYAN INVOCADO EN LA SECCIN DE REGLAS), DEBEMOS HABERLOS DECLARADO PREVIAMENTE. PARA ELLO NO DEBEMOS OLVIDAR DECLARARLOS EN LA SECCIN DE DECLARACIONES. %{ int func1 (int param); void proc1 (); }% COMO FUNCIN TPICA A SER DESCRITA EN UNA PLANTILLA LEX, APARECE EL MTODO PRINCIPAL (MAIN). SI NO SE DESCRIBE NINGN MTODO MAIN LEX INCORPORA UNO POR DEFECTO DONDE LO NICO QUE SE HACE ES FIJAR EL FICHERO DE ENTRADA
11

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

COMO LA ENTRADA ESTNDAR E INVOCAR A LA HERRAMIENTA PARA QUE COMIENCE SU PROCESAMIENTO:

int main () { yyin = stdin; yylex (); }

UN EJEMPLO DE MTODO MAIN TPICO ES AQUEL QUE ACEPTA UN NOMBRE DE FICHERO COMO FICHERO DE ENTRADA:

int main (int argc, char *argv[]) { if (argc == 2) { yyin = fopen (argv[1], rt); if (yyin == NULL) { printf (El fichero %s no se puede abrir\n, argv[1]); exit (-1); } } else yyin = stdin; yylex (); return 0; }

LAS VARIABLES, FUNCIONES, PROCEDIMIENTOS Y MACROS INTERNAS DE LEX COMO HEMOS IDO REFLEJANDO EN ALGUNOS EJEMPLOS, LEX INCORPORA ALGUNAS VARIABLES, FUNCIONES, PROCEDIMIENTOS Y MACROS QUE NOS PERMITEN REALIZAR DE UNA FORMA MS SENCILLA TODO EL PROCESAMIENTO.
12

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

COMO VARIABLES, LAS MS UTILIZADAS SON:

COMO MTODOS (FUNCIONES Y PROCEDIMIENTOS), TENEMOS:

ADEMS DE YYLEX(), EXISTEN UNAS POCAS FUNCIONES QUE SE PUEDEN UTILIZAR EN UN PROGRAMA LEX, QUE DESCRIBIMOS A CONTINUACIN. ALGUNOS DERIVADOS DE LEX (NOTABLEMENTE FLEX) OFRECEN VARIAS FUNCIONES ADEMS DE LAS PRESENTADAS, PERO NO FORMAN PARTE DEL ESTNDAR DE LEX.

YYMORE() INT YYMORE(VOID) CUANDO SE LA LLAMA, SE LE INDICA A LEX QUE LA PRXIMA CADENA DE ENTRADA QUE ENCAJE CON UNA REGLA NO DEBE SOBRESCRIBIR YYTEXT, SINO QUE DEBE AADIRSE AL FINAL DE STE. ES TIL EN CASOS EN LOS QUE UNA EXPRESIN REGULAR SE AJUSTA A UNA CADENA DE TEXTO Y A UNA SUBCADENA DE ELLA,
13

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

POR EJEMPLO, AL BUSCAR CADENAS DE CARACTERES EN C CON LA EXPRESIN REGULAR \"[^"]* PARA LA CADENA "HOLA \" MUNDO". YYLESS() INT YYLESS(INT N) VUELVE A INTRODUCIR EN LA ENTRADA TODOS LOS CARACTERES DE YYTEXT, EXCEPTO LOS N PRIMEROS. DICHO DE OTRA MANERA, YYLESS() DEVUELVE A LA ENTRADA LOS (YYLENG-N) LTIMOS CARACTERES DE YYTEXT. A PRIMERA VISTA, PUEDE PARECER QUE YYLESS(0) HACE LO MISMO QUE REJECT, PERO YYLESS(0) NO IMPIDE QUE SE VUELVA A UTILIZAR LA MISMA REGLA CONTINUAMENTE, POR LO QUE PUEDE CONDUCIR A UN BUCLE INFINITO. SIN EMBARGO, EL HECHO DE UTILIZAR YYLESS() NO PROVOCA QUE TODO EL ANALIZADOR SEA MS LENTO, COMO OCURRE AL UTILIZAR REJECT. INPUT() INT INPUT(VOID) DEVUELVE EL SIGUIENTE CARCTER DE LA ENTRADA, Y AVANZA EN 1 EL PUNTERO DE LEX. PUEDE SER TIL CUANDO ES POSIBLE QUE SE NECESITE HACER ALGO CON LOS CARACTERES QUE HAYA DESPUS DE UNA EXPRESIN REGULAR ENCONTRADA. AUNQUE NO ES EL MEJOR EJEMPLO, PUEDE VENIR BIEN PARA SALTAR LOS COMENTARIOS DE UN PROGRAMA EN C. UNPUT() INT UNPUT(INT C) PONE EN LA ENTRADA EL CARCTER C, QUE SER EL PRXIMO QUE LEA LEX. NOTA: DEPENDIENDO DE LA VERSIN DE LEX QUE SE UTILICE, ES POSIBLE QUE SE DESTRUYA EL CONTENIDO DE YYTEXT AL UTILIZAR UNPUT(). DE FORMA NOTABLE, ESTO OCURRE EN FLEX, QUE ES LA VERSIN INCLUIDA EN LOS SISTEMAS LINUX (A NO SER QUE SE CAMBIE SU COMPORTAMIENTO POR DEFECTO MEDIANTE LA OPCIN ADECUADA).
14

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

YYWRAP() INT YYWRAP(VOID) YYWRAP() ES UNA FUNCIN QUE SE UTILIZA PARA DECIDIR QU DEBE HACER YYLEX() CUANDO SE ALCANZA EL FINAL DEL FICHERO DE ENTRADA. LAS OPCIONES POSIBLES SON: A) QUE YYLEX() FINALICE Y DEVUELVA EL CONTROL A LA FUNCIN LLAMANTE (NORMALMENTE MAIN()). ESTO OCURRE CUANDO YYWRAP() DEVUELVE 1. B) QUE YYLEX() CONTINE PROCESANDO LA ENTRADA DE YYIN COMO SI NO HUBIERA SUCEDIDO NADA. ESTO OCURRE CUANDO YYWRAP() DEVUELVE 0. PARA QUE ESTO FUNCIONE, YYWRAP() DEBE LLEVAR A CABO LAS ACCIONES NECESARIAS PARA QUE YYIN APUNTE A ALGUNA ENTRADA QUE SEGUIR PROCESANDO. LA FUNCIN YYWRAP() QUE EXISTE POR DEFECTO DEVUELVE SIEMPRE 1, POR ESO YYLEX() FINALIZA EN CUANTO ACABA DE PROCESAR UN FICHERO DE ENTRADA. SI QUEREMOS CONSTRUIR UN ANALIZADOR QUE PROCESE VARIOS FICHEROS, UNO DETRS DE OTRO, LA MANERA IDNEA ES PROPORCIONAR NUESTRA PROPIA FUNCIN YYWRAP() QUE: 1234CIERRE EL FICHERO DE ENTRADA ACTUAL (YYIN). ABRA EL SIGUIENTE FICHERO DE ENTRADA (CON FOPEN()). APUNTE YYIN AL FICHERO RECIN ABIERTO. DEVUELVA 0.

YYLEX() SEGUIR PROCESANDO LA ENTRADA DE YYIN HASTA QUE ALCANCE EL FIN DE FICHERO E YYWRAP() DEVUELVA 1. YYLEX() INT YYLEX(VOID) LA FUNCIN YYLEX() ES EL ANALIZADOR LXICO EN S. DEVUELVE 0 CUANDO SE HA
15

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

ALCANZADO EL FIN DE FICHERO Y EL RESULTADO DE LLAMAR A YYWRAP() HA SIDO 1. YYLEX() PUEDE DEVOLVER OTROS VALORES SI SE INCLUYEN SENTENCIAS RETURN COMO PARTE DE UNA ACCIN DENTRO DE LA SECCIN DE REGLAS. LOS PROCEDIMIENTOS YYERROR () E YYWRAP () PUEDEN SER REESCRITOS EN LA SECCIN DE PROCEDIMIENTOS DE USUARIO, CAMBIANDO DE ESTA FORMA, EL COMPORTAMIENTO ANTE LA LOCALIZACIN DE ERRORES, O DEL FINAL DEL FICHERO DE ENTRADA. COMO MACROS Y DIRECTIVAS CARACTERSTICOS, EXISTEN:

FIJANDO CONDICIONES A LAS REGLAS LEX PERMITE AADIR CONDICIONES DE EJECUCIN A LAS REGLAS. ESTO ES, CONDICIONES BAJO LAS CUALES UNA REGLA PUEDE SER EJECUTADA. ESTO ES MUY TIL SOBRE TODO CUANDO SE DA EL CASO DE QUE UNAS REGLAS HAN DE APLICARSE BAJO CIERTAS CONDICIONES Y NO BAJO OTRAS. POR EJEMPLO LA DETECCIN DE PALABRAS CLAVE O DE IDENTIFICADORES EN UN FICHERO DE ENTRADA CON FORMATO C: SI LAS PALABRAS CLAVE ESTN DENTRO DE UN BLOQUE DE COMENTARIO O DENTRO DE UN PAR DE COMILLAS DOBLES (DEFINICIN DE CONSTANTE DE CADENA), NO HAN DE INTERPRETARSE COMO PALABRAS CLAVE O IDENTIFICADORES, SINO COMO COMPONENTES DEL COMENTARIO O DE LA CONSTANTE:
16

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

if (i < 3) a++; /* if (i < 3) a++; */ printf (if (i < 3) a++;\n);

PARA ELLO, LEX INCORPORA LA POSIBILIDAD DE DEFINIR ESTAS CONDICIONES A LAS REGLAS, Y LOS MTODOS (DIRECTIVAS) PARA CAMBIAR DE UNAS CONDICIONES A OTRAS. PARA DEFINIR QUE UNA REGLA EST SUJETA A UNA DETERMINADA CONDICIN, HAY QUE ANTECEDER DICHA CONDICIN A LA REGLA PONINDOLA ENTRE PARES <>: <cond1 [, cond2]*>exp.reg. { acciones } PARA INDICAR EXPLCITAMENTE QUE SE HA DE ENTRAR EN UNA CONDICIN, SE UTILIZA LA DIRECTIVA BEGIN COND1 [, COND2]*; MIENTRAS QUE PARA SALIR DE UNA CONDICIN SE UTILIZA LA DIRECTIVA END COND1 [, COND2]*.
{id} { ECHO; } /* { BEGIN comentario; } <comentario>*/ { END comentario; /* = BEGIN 0; */ } <comentario>. { }

LAS REGLAS QUE NO SON PRECEDIDAS DE NINGUNA CONDICIN SE PRESUPONE QUE SE EJECUTAN SOLAMENTE BAJA LA CONDICIN 0 (SIN CONDICIONES). LA INVOCACIN DE BEGIN CAMBIA LA LISTA DE CONDICIONES POR COMPLETO A LA INDICADA (NO LAS SUMA). HACIENDO BEGIN 0, SE VUELVE AL ESTADO DONDE LAS REGLAS NO NECESITAN SER PRECEDIDAS DE CONDICIONES. PARA INDICAR LAS CONDICIONES INICIALES DEL PROCESAMIENTO, SE INCORPORA UNA SENTENCIA CON EL FORMATO SIGUIENTE EN LA SECCIN DE DECLARACIONES.
17

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

%start cond1 [, cond2]* /* %start = %s */

EL PROCESO DE COMPILACIN UNA VEZ ESCRITA LA PLANTILLA, INVOCAMOS A LA HERRAMIENTA MEDIANTE EL COMANDO DE SHELL: $ lex plantilla.l ESTO NOS GENERAR UN FICHERO C, DENOMINADO YY.LEX.C QUE CONTIENE TODO EL CDIGO NECESARIO PARA COMPILAR NUESTRA APLICACIN. LUEGO SLO QUEDA COMPILAR CON LAS LIBRERAS ADECUADAS: $ cc yy.lex.l ll EN LOS SISTEMAS GNU (LNUX), EXISTEN AMBAS HERRAMIENTAS (LEX Y CC) PERO DENOMINADAS CON LOS NOMBRES FLEX, Y GCC AUNQUE SUELEN INCORPORAR ENLACES A ELLAS A TRAVS DE LOS NOMBRES TRADICIONALES. LEX COMO UN ANALIZADOR LXICO LEX PUEDE VERSE DESDE OTRO PUNTO DE VISTA ADEMS DE CMO UNA HERRAMIENTA QUE NOS PERMITE EJECUTAR ACCIONES TRAS LA LOCALIZACIN DE CADENAS DE ENTRADA QUE CONFRONTAN CON EXPRESIONES REGULARES. LEX PUEDE SER VISTO COMO LA PRIMERA ETAPA NECESARIA A LA HORA DE ELABORAR UN COMPILADOR, UN INTRPRETE, UN EMULADOR O CUALQUIER OTRO TIPO DE HERRAMIENTA QUE NECESITE PROCESAR UN FICHERO DE ENTRADA PARA PODER CUMPLIR SU MISIN.
18

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

SUPONGAMOS QUE QUEREMOS DISEAR UNA CALCULADORA. PARA ELLO TOMAREMOS LAS EXPRESIONES A EVALUAR DE UN FICHERO DE ENTRADA (O DE LA MISMA ENTRADA ESTNDAR). DISEAR UN PROGRAMA EN C QUE TOME UNA EXPRESIN DE LA ENTRADA ESTNDAR Y LA EVALE, NO ES NADA SENCILLO. PENSAD QUE LA ENTRADA PUEDE SER ALGO SENCILLO O ALGO TAN COMPLEJO COMO LA SIGUIENTE EXPRESIN: SQRT (2/3.141592654) * SIN (0.707) LO PRIMERO QUE DEBEREMOS HACER ES RECONOCER LOS ELEMENTOS QUE FORMAN DICHA ENTRADA. ES DECIR, LAS CONSTANTES NUMRICAS, LOS OPERADORES, LAS FUNCIONES PREDEFINIDAS (SENO, COSENO) A ESTOS ELEMENTOS INDIVIDUALES QUE LLEVAN ASOCIADO UN SENTIDO PROPIO, LOS DENOMINAREMOS TOKENS. LOS TOKENS NOS DAN TODA LA INFORMACIN NECESARIA DE ESTE PRIMER NIVEL, PUES LO MISMO NOS DA QUE LA CONSTANTE NUMRICA RECONOCIDA SEA UN 3 QUE UN 300, EL PROCESAMIENTO VA A SER EL MISMO. LO IMPORTANTE ES QUE ES UNA CONSTANTE NUMRICA (TOKEN). ESTA ETAPA LA PODEMOS HACER CON LEX SIN NINGN PROBLEMA TAL Y COMO HEMOS VISTO. TAN SOLO DEBEMOS DEFINIR LAS REGLAS NECESARIAS PARA RECONOCER ESOS TOKENS. A ESTA PRIMERA ETAPA SE LE DA EL NOMBRE DE ANLISIS LXICO, DEBIDO A QUE LO QUE EL PROCESAMIENTO FUNDAMENTAL SE REALIZA EN BASE A LA DETECCIN DE LOS LEXEMAS (TOKENS) SIGNIFICATIVOS. PERO ESTOS ELEMENTOS INDIVIDUALES (TOKEN) NO NOS APORTAN TODA LA INFORMACIN NECESARIA PARA LLEVAR A CABO EL PROCESAMIENTO FINAL. SI NOS FIJAMOS SLO EN LOS TOKENS, NOS FALTA INFORMACIN: CMO SE COMBINAN LOS ELEMENTOS? ES POSIBLE LA SIGUIENTE SECUENCIA +*2/(-4-*3)4SIN?. DESDE EL PUNTO DE VISTA DE LEX, PODEMOS RECONOCER TODOS LOS TOKENS CORRECTAMENTE, PERO EN CAMBIO LA SINTAXIS DE LA EXPRESIN ES INCORRECTA. NO TIENE SENTIDO. NECESITAMOS ENTONCES UNA SEGUNDA ETAPA QUE NOS INFORME SOBRE LA COMBINACIN DE LOS ELEMENTOS DE ENTRADA, Y LES DE UNA INTERPRETACIN SEGN SU COMBINACIN. ESTA SEGUNDA ETAPA
19

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

RECIBE EL NOMBRE DE ANLISIS SINTCTICO, DONDE LO IMPORTANTE EL LA ESTRUCTURA QUE TIENEN LOS DATOS (TOKEN) EN LA ENTRADA. DICHA ESTRUCTURA LA VAMOS A DEFINIR ENTORNO A UN CONJUNTO DE REGLAS ESPECIALES, AL QUE DENOMINAREMOS GRAMTICA. LA HERRAMIENTA QUE NOS VA A PERMITIR LLEVAR A CABO LA IMPLEMENTACI N DE ESTA SEGUNDA ETAPA VA A SER YACC, QUE AL IGUAL QUE LEX, ES UN GENERADOR DE CDIGO C BASADO EN UNA PLANTILLA SIMILAR A LA DE LEX, PERO QUE VA A PERMITIRNOS CODIFICAR ESTAS NUEVAS REGLAS DE COMBINACIN DE LOS ELEMENTOS. AMBAS ETAPAS ESTN MUY INTERRELACIONADAS. TAL Y COMO SE VE EN EL ESQUEMA SIGUIENTE:

A________ _________ _________

Anlisis lxico

Get_Next_Token Anlisis () token

sintctico

Fichero de entrada
Tabla de

token

token

smbolos

A CONTINUACIN VEREMOS CMO ES EL FUNCIONAMIENTO DEL SISTEMA GLOBAL. PARA EMPEZAR DIREMOS QUE EL CONTROL DEL FLUJO PASA A LA HERRAMIENTA DE ANLISIS SINTCTICO, QUE ES QUIEN VA A DECIDIR LO QUE SE HACE EN CADA MOMENTO. EL ANALIZADOR SINTCTICO VA A SOLICITAR AL ANALIZADOR LXICO EL SIGUIENTE TOKEN DE LA ENTRADA. CON L VA A PODER
20

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

DECIDIR QU REGLA APLICAR EN CADA CASO, O BIEN, SI NO SE PUEDE APLICAR NINGUNA REGLA, DECIDIR QUE LO QUE HA OCURRIDO ES UN ERROR SINTCTICO (GRAMATICAL). EL ANALIZADOR LXICO VA A PROPORCIONAR CADA TOKEN DE LA ENTRADA BAJO LA PETICIN DEL ANALIZADOR SINTCTICO. PARA ELLO EL PRIMER CAMBIO QUE HAY QUE HACER EN LA PLANTILLA DE LEX ES INCORPORAR SENTENCIAS DE RETURN AL FINAL DE CADA REGLA QUE DEFINA UN TOKEN: exp.reg { acciones; return token; } ADEMS DEL TOKEN, ES IMPORTANTE QUE EL ANALIZADOR LXICO MANTENGA OTRA SERIE DE CARACTERSTICAS, COMO POR EJEMPLO EL TEXTO ASOCIADO AL TOKEN (LA CADENA RECONOCIDA) PORQUE AUNQUE LO IMPORTANTE PARA EL ANALIZADOR SINTCTICO ES LA NATURALEZA DE LAS ENTRADAS (TOKENS), NO DEBEMOS OLVIDAR QUE EL RESULTADO FINAL HA DE TENER EN CUENTA QU VALOR ES CON EL QUE HAY QUE TRABAJAR, O QU VARIABLE ES A LA QUE HACEMOS REFERENCIA. PARA ELLO ENTRA EN JUEGO LA TABLA DE SMBOLOS. EN ELLA EL ANALIZADOR LXICO DEBER IR ANOTANDO CADA NUEVO SMBOLO RECONOCIDO, JUNTO CON SUS PROPIEDADES (SU NATURALEZA -> TOKEN, ETC.) DE ESTA FORMA, SI UN SMBOLO YA HA SIDO RECONOCIDO PREVIAMENTE, APARECER EN LA TABLA DE SMBOLOS Y PODEMOS ADJUDICARLE LA MISMA ENTRADA. UN EJEMPLO SENCILLO DONDE SE ILUSTRA EL COMPORTAMIENTO DEL SISTEMA Y DE LA TABLA DE SMBOLOS ES EL SIGUIENTE: int a; a = 0;
1. EL ANALIZADOR SINTCTICO (YACC) PIDE UN TOKEN, Y EL

ANALIZADOR LXICO (LEX) DEVUELVE EL TOKEN TOKEN_INT (PALABRA CLAVE).

21

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS 2. YACC PIDE EL SIGUIENTE TOKEN (TOKEN_ID) Y LO ENCAJA EN

SU GRAMTICA. YACC YA SABE QUE EL ID RECONOCIDO ES DE TIPO INTEGER. PUEDE IR A LA TABLA DE SMBOLOS Y MODIFICAR SU PROPIEDAD TYPE (POR EJEMPLO) Y ASOCIARLE EL TIPO ENTERO. DE ESTA FORMA CADA VEZ QUE SE HAGA REFERENCIA A A SABREMOS QUE ES UN TOKEN_ID Y ES DE TIPO INTEGER. Y SI EN ALGN MOMENTO SE INTENTA OPERAR CON A UTILIZANDO OTRO TIPO DE DATOS, PODEMOS SABER QUE SE COMETE UN ERROR. ESTE ERROR ES UN ERROR SEMNTICO, NO SINTCTICO (LA SINTAXIS GRAMATICAL PUEDE SER CORRECTA), PERO AMBOS TIPOS DE ANLISIS PUEDEN LLEVARSE A CABO SIMULTNEAMENTE COMO SE PUEDE VER. LA ESTRUCTURA DE LA TABLA DE SMBOLOS DEPENDE DEL TIPO DE PROCESAMIENTO QUE QUERAMOS REALIZAR. ENTRE SUS CAMPOS PODEMOS HACERNOS UNA IDEA DE CULES NOS VAN A PODER SER TILES PARA EL PROCESAMIENTO:

LA TABLA DE SMBOLOS ES ACCESIBLE A TODOS LOS ANALIZADORES, Y CADA UNO VA A TOMAR DE ELLA LOS DATOS QUE NECESITA EN CADA CASO, Y VA A APORTAR SU GRANITO DE ARENA EN LA DEFINICIN COMPLETA DE ESE SMBOLO. CON RESPECTO A QU SMBOLOS HAN DE INTRODUCIRSE EN LA TABLA, DIREMOS QUE TAMPOCO HAY UNA REGLA CONCRETA. PODEMOS INTRODUCIRLOS TODOS, INCLUSO LOS OPERADORES O
22

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

LOS SIGNOS DE PUNTUACIN, O BIEN SLO INTRODUCIR AQUELLOS QUE NOS SEAN TILES (IDENTIFICADORES Y/O CONSTANTES). ES RECOMENDABLE QUE LA TABLA DE SMBOLOS EST INDEXADA PARA PODER REALIZAR LAS BSQUEDAS MS RPIDAMENTE. PARA ELLO DEBEMOS DE TENER EN CUENTA QUE UN SMBOLO PUEDE SER DISTINTO AUNQUE TENGA EL MISMO NOMBRE, SI SE DEFINE BAJO CONTEXTOS DISTINTOS (UNA VARIABLE GLOBAL Y UNA REDEFINICIN DENTRO DE UNA FUNCIN), CON LO QUE LA CLAVE DE BSQUEDA DEBERA CONTEMPLAR EL CONTEXTO COMO COMPONENTE JUNTO CON EL NOMBRE DEL SMBOLO. EN LA PRIMERA PARTE SE DECLARAN LAS EXPRESIONES REGULARES QUE DEFINEN LOS COMPONENTES LXICOS QUE EL ANALIZADOR RECONOCERA. LOS OPERADORES QUE SE EMPLEAN EN ESTAS EXPRESIONES SON:

Ops
[]

Ejempl o
[a-z]

Explicacin
Una clase de Caracteres, coincide con un carcter perteneciente a la clase, pueden usarse rangos, como en el ejemplo, cualquier carcter, excepto aquellos especiales o de control son tomados literalmente, en el caso de los que no, pueden usarse secuencias de escape como las de C, \t, \n etctera. Si su primer carcter es un "^", entonces coincidir con cualquier carcter fuera de la clase. Todas las cadenas que se puedan formar, se puede decir que este operador indica que se va a coincidir con cadenas formadas por ninguna o varias apariciones del patrn que lo antecede. El ejemplo coincide con cualquier combinacin de smbolos usados para separar, el espacio, retorno y tabulador. Todas las cadenas que se puedan formar, excepto cadenas vacas. En el ejemplo se aceptan a todos los nmeros naturales y al cero. Este es una expresin regular que coincide con cualquier entrada excepto el retorno de carro ("\n"). El ejemplo acepta cualquier cadena no vaca.

[ \n\t]*

+ .

[0-9]+ .+

23

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS {} a{3,6} Indica un rango de repeticin cuando contiene dos nmeros separados por comas, como en el ejemplo, la cadena aceptada ser aquella con longitud 3, 4, 5 o 6 formada por el carcter 'a'. Indica una repeticin fija cuando contiene un solo numero, por ejemplo, a{5}, aceptara cualquier cadena formada por 5 a's sucesivas. En caso de contener un nombre, indica una sustitucin por una declaracin en la seccin de declaraciones (Revisar el ejemplo1). Indica que el patrn que lo antecede es opcional, es decir, puede existir o no. En el ejemplo, el patrn coincide con todos los nmeros enteros, positivos o negativos por igual, ya que el signo es opcional. Este hace coincidir, al patrn que lo precede o lo antecede y puede usarse consecutivamente. En el ejemplo tenemos un patrn que coincidir con un entero positivo, negativo o con signo de complemento. Las cadenas encerradas entre " y " son aceptadas literalmente, es decir tal como aparecen dentro de las comillas, para incluir caracteres de control o no imprimibles, pueden usarse dentro de ellas secuencias de escape de C. En el ejemplo la nica cadena que coincide es 'bye'. Indica a lex que el carcter a continuacin ser tomado literalmente, como una secuencia de escape, este funciona para todos los caracteres reservados para lex y para C por igual. En el ejemplo, el patrn coincide solo con el carcter "." (Punto), en lugar de coincidir con cualquier carcter, como sera el casi sin el uso de "\". Solo en flex, este patrn coincide con el fin de archivo.

-?[0-9]+

(-|+|~)? [0-9]+ "bye"

""

\.

<<EOF >>

[a-z]

LA SIGUIENTE TABLA PRESENTA EN ORDEN DECRECIENTE LA PRECEDENCIA, LA CONFORMACIN DE EXPRESIONES REGULARES EN LEX. (C REPRESENTA CUALQUIER CARCTER SIMPLE, R UNA EXPRESIN REGUALAR Y S UNA CADENA). Expresi Significado n c cualquier carcter c que no sea operador \c el carcter c literalmente "s" la cadena s literalmente . cualquier carcter excepto de nueva lnea ^ el comienzo de lnea
24

Ejemplo a \+ "adios..." a.*b ^int

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

$ [s] [^s] r* r* r? r{m.n} r1r2 r1|r2 (r) r1/r2

el fin de lnea cualquier carcter en s excepto cualquier carcter que no este en s cero o ms ocurrencias de r una o ms ocurrencias de r cero o una r m a n ocurrencias de r r1 y entonces r2 r1 o r2 r r1 cuando va seguida de r2

a;$ [*+ab] [^123456789 ] a* a+ a? a{1,8} ab a|b (a|b) a/--

ESPECIFICACIN DE CLASES DE CARACTERES. LAS CLASES DE CARACTERES SE PUEDEN ESPECIFICAR USANDO CORCHETES: [Y]. LA CONSTRUCCIN [ ABC ]COINCIDE CON CUALQUIER CARCTER, QUE PUEDA SE UNA A, B, O C. DENTRO DE LOS CORCHETES, LA MAYORA DE LOS SIGNIFICADOS DE LOS OPERADORES SE IGNORAN. SLO TRES CARACTERES SON ESPECIALES: STOS SON LA BARRA INVERTIDA ( \ ), EL GUIN ( - ), Y EL SIGNO DE INTERCALACIN ( ^ ). EL CARCTER GUIN INDICA RANGOS, POR EJEMPLO [ A-Z0-9<>_ ]

ESPECIFICACIN DE EXPRESIONES REPETIDAS. LAS REPETICIONES DE CLASES SE INDICAN CON LOS OPERADORES ASTERISCO ( * ) Y EL SIGNO MS ( + ). POR EJEMPLO A* COINCIDE CON CUALQUIER NMERO DE CARACTERES CONSECUTIVOS, INCLUYENDO CERO; MIENTRAS QUE A+ COINCIDE CON UNA O MS APARICIONES DE A. POR EJEMPLO, [ A-Z ]+ COINCIDE CON TODOS LOS LITERALES DE LETRAS MINSCULAS, Y [ A-ZA-Z ] [A-ZA-Z0-9 ]* COINCIDE CON TODOS LOS LITERALES ALFANUMRICOS CON UN CARCTER ALFABTICO AL PRINCIPIO; STA ES UNA EXPRESIN TPICA PARA RECONOCER IDENTIFICADORES EN LENGUAJES INFORMTICOS.
25

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

ESPECIFICACIN DE ALTERNACIN Y DE AGRUPAMIENTO. EL OPERADOR BARRA VERTICAL ( | ) INDICA ALTERNACIN. POR EJEMPLO ( AB|CD ) COINCIDE CON AB O CON CD. NTESE QUE LOS PARNTESIS SE USAN PARA AGRUPAR, AUNQUE STOS NO SON NECESARIOS EN EL NIVEL EXTERIOR. POR EJEMPLO AB | CD HUBIESE SIDO SUFICIENTE EN EL EJEMPLO ANTERIOR. LOS PARNTESIS SE DEBERN USAR PARA EXPRESIONES MS COMPLEJAS, TALES COMO ( AB | CD+ )?( EF )* LA CUAL COINCIDE CON TALES LITERALES COMO ABEFEF, EFEFEF, CDEF, CDDD, PERO NO ABC, ABCD, O ABCDEF. ESPECIFICACIN DE SENSITIVIDAD DE CONTEXTO EL LEX RECONOCE UNA PEQUEA CANTIDAD DEL CONTEXTO QUE LE RODEA. LOS DOS OPERADORES MS SIMPLES PARA STOS SON EL SIGNO DE INTERCALACIN ( ^ ) Y EL SIGNO DE DLAR ( $ ). SI EL PRIMER CARCTER DE UNA EXPRESIN ES UN SIGNO ^, ENTONCES LA EXPRESIN SLO COINCIDE AL PRINCIPIO DE LA LNEA (DESPUS DE UN CARCTER NEWLINE, O AL PRINCIPIO DEL INPUT). ESTO NUNCA SE PUEDE CONFUNDIR CON EL OTRO SIGNIFICADO DEL SIGNO ^, COMPLEMENTACIN DE LAS CLASES DE CARACTERES, PUESTO QUE LA COMPLEMENTACIN SLO SE APLICA DENTRO DE CORCHETES. SI EL PRIMER CARCTER ES EL SIGNO DE DLAR, LA EXPRESIN SLO COINCIDE AL FINAL DE UNA LNEA (CUANDO VA SEGUIDO INMEDIATAMENTE DE UN CARCTER NEWLINE). ESTE LTIMO OPERADOR ES UN CASO ESPECIAL DEL OPERADOR BARRA ( / ) , EL CUAL INDICA CONTEXTO AL FINAL. LA EXPRESIN AB/CD COINCIDE CON EL LITERAL AB, PERO SLO SI VA SEGUIDO DE CD. POR LO TANTO AB$ ES LO MISMO QUE AB/\N. EL CONTEXTO DE LA IZQUIERDA SE MANEJA EN EL LEX ESPECIFICANDO LAS CONDICIONES START SEGN SE EXPLICA EN LA SECCIN ESPECIFICACIN DE SENSIBILIDAD DE CONTEXTO IZQUIERDO . SI UNA ORDEN SLO SE VA A EJECUTAR CUANDO EL INTERPRETE DEL AUTMATA DEL LEX EST EN LA CONDICIN X START, LA ORDEN SE DEBER INCLUIR ENTRE CORCHETES DE NGULOS: <X> SI CONSIDERAMOS QUE ESTAMOS AL COMIENZO DE UNA LNEA QUE ES EL COMIENZO DE LA CONDICIN ONE, ENTONCES EL OPERADOR ( ^ ) SER EQUIVALENTE A <ONE> LAS CONDICIONES START SE EXPLICAN CON DETALLES MS TARDE.
26

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

ESPECIFICACIN DE REPETICIN DE EXPRESIONES. LAS LLAVES ( { Y } ) ESPECIFICAN O BIEN REPETICIONES ( SI STAS INCLUYEN NMEROS) O DEFINICIN DE EXPANSIN (SI INCLUYEN UN NOMBRE). POR EJEMPLO {DGITO} BUSCA UN LITERAL PREDEFINIDO LLAMADO DGITO Y LO INSERTA EN LA EXPRESIN, EN ESE PUNTO. ESPECIFICAR DEFINICIONES. LAS DEFINICIONES SE DAN EN LA PRIMERA PARTE DEL INPUT DEL LEX, ANTES DE LAS RDENES. EN CONTRASTE, A{1,5} BUSCA DE UNA A CINCO APARICIONES DEL CARCTER A.FINALMENTE, UN SIGNO DE TANTO POR CIENTO INICIAL ( % ) ES ESPECIAL PUESTO QUE ES EL SEPARADOR PARA LOS SEGMENTOS FUENTE DEL LEX. ESPECIFICACIN DE ACCIONES. CUANDO UNA EXPRESIN COINCIDE CON UN MODELO DE TEXTO EN EL INPUT EL LEX EJECUTA LA ACCIN CORRESPONDIENTE. ESTA SECCIN DESCRIBE ALGUNAS CARACTERSTICAS DEL LEX, LAS CUALES AYUDAN A ESCRIBIR ACCIONES. NTESE QUE HAY UNA ACCIN POR DEFECTO, LA CUAL CONSISTE EN COPIAR EL INPUT EN EL OUTPUT. ESTO SE LLEVA A CABO EN TODOS LOS LITERALES QUE DE OTRO MODO NO COINCIDIRAN. POR LO TANTO EL USUARIO DEL LEX QUE DESEE ABSORBER EL INPUT COMPLETO, SIN PRODUCIR NINGN OUTPUT, DEBE PROPORCIONAR RDENES PARA HACER QUE COINCIDA TODO. CUANDO SE EST USANDO EL LEX CON EL YACC, STA ES LA SITUACIN NORMAL. SE PUEDE TENER EN CUENTA QU ACCIONES SON LAS QUE SE HACEN EN VEZ DE COPIAR EL INPUT EN EL OUTPUT; POR LO TANTO, EN GENERAL, UNA ORDEN QUE SIMPLEMENTE COPIA SE PUEDE OMITIR. UNA DE LAS COSAS MS SIMPLES QUE SE PUEDEN HACER ES IGNORAR EL INPUT. ESPECIFICAR UNA SENTENCIA NULA DE C; COMO UNA ACCIN PRODUCE ESTE RESULTADO. LA ORDEN FRECUENTE ES [ \ T \ N] ; LA CUAL HACE QUE SE IGNOREN TRES CARACTERES DE ESPACIADO (ESPACIO EN BLANCO, TABULADOR, Y NEWLINE). OTRA FORMA FCIL DE EVITAR EL ESCRIBIR ACCIONES ES USAR EL CARCTER DE REPETICIN DE ACCIN, | , EL CUAL INDICA QUE LA ACCIN DE ESTA ORDEN ES LA ACCIN PARA LA ORDEN SIGUIENTE. EL EJEMPLO PREVIO TAMBIN
27

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

SE PODA HABER ESCRITO: | \ T | \ N ; CON EL MISMO RESULTADO, AUNQUE EN UN ESTILO DIFERENTE. LAS COMILLAS ALREDEDOR DE\ N Y \ T NO SON NECESARIAS. EN ACCIONES MS COMPLEJAS, A MENUDO SE QUIERE CONOCER EL TEXTO ACTUAL QUE COINCIDA CON ALGUNAS EXPRESIONES COMO: [ A-Z ] + EL LEX DEJA ESTE TEXTO EN UNA MATRIZ DE CARACTERES EXTERNOS LLAMADA YYTEXT. POR LO TANTO, PARA IMPRIMIR EL NOMBRE LOCALIZADO, UNA ORDEN COMO [ A-Z ] + PRINTF (%S , YYTEXT); IMPRIME EL LITERAL DE YYTEXT. LA FUNCIN C PRINTF ACEPTA UN ARGUMENTO DE FORMATO Y DATOS PARA IMPRIMIR; EN ESTE CASO, EL FORMATO ES PRINT LITERAL DONDE EL SIGNO DE TANTO POR CIENTO ( % ) INDICA CONVERSIN DE DATOS, Y LA S INDICA EL TIPO DE LITERAL, Y LOS DATOS SON LOS CARACTERES DE YYTEXT. POR LO TANTO ESTO SIMPLEMENTE COLOCA EL LITERAL QUE HA COINCIDIDO EN EL OUTPUT. ESTA ACCIN ES TAN COMN QUE SE PUEDE ESCRIBIR COMO ECHO. MANEJO DE RDENES FUENTES AMBIGUAS EL LEX PUEDE MANEJAR ESPECIFICACIONES AMBIGUAS. CUANDO MS DE UNA EXPRESIN PUEDE COINCIDIR CON EL INPUT EN CURSO, EL LEX SELECCIONA DE LA FORMA SIGUIENTE: ._SE PREFIERE LA COINCIDENCIA MS LARGA. ._DE ENTRE LAS RDENES QUE COINCIDEN EN EL MISMO NMERO DE CARACTERES, SE PREFIERE LA PRIMERA ORDEN ESPECIFICADA. POR EJEMPLO: SUPONGA QUE SE ESPECIFICAN LAS RDENES SIGUIENTES: INTEGER KEYWORD ACTION ... ; [ A-Z ] + IDENTIFIER ACTION ... ; SI EL INPUT ES INTEGERS, SE TOMA COMO UN IDENTIFICADOR, PUESTO QUE [ A-Z ] + COINCIDE CON OCHO CARACTERES MIENTRAS QUE INTEGER SLO COINCIDE CON SIETE. SI EL INPUT ES INTEGER, AMBAS RDENES COINCIDEN EN SIETE CARACTERES, Y SE SELECCIONA LA ORDEN KEYWORD PORQUE STA HA SIDO ESPECIFICADA PRIMERO. CUALQUIER COSA MS CORTA (POR EJEMPLO, INT) NO COINCIDE CON LA EXPRESIN INTEGER, POR LO TANTO SE USA LA INTERPRETACIN IDENTIFIER. EL PRINCIPIO DE LA PREFERENCIA DE LA COINCIDENCIA MS LARGA HACE QUE CIERTAS CONSTRUCCIONES SEAN PELIGROSAS, TALES COMO LA SIGUIENTE: .*
28

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

ESPECIFICACIN IZQUIERDO

DE

SENSIBILIDAD

DE

CONTEXTO

A VECES ES DESEABLE APLICAR VARIOS GRUPOS DE RDENES LXICAS EN DIFERENTES OCASIONES EN EL INPUT. POR EJEMPLO, UN COMPILADOR PREPROCESADOR PUEDE DISTINGUIR SENTENCIAS DEL PREPROCESADOR Y ANALIZARLAS DE FORMA DIFERENTE A COMO HACE CON LAS SENTENCIAS ORDINARIAS. ESTO REQUIERE SENSITIVIDAD AL CONTEXTO PREVIO, Y HAY VARIAS FORMAS DE TRATAR TALES PROBLEMAS. EL OPERADOR (^), POR EJEMPLO, ES UN OPERADOR DE CONTEXTO PREVIO, QUE RECONOCE INMEDIATAMENTE CONTEXTO QUE PRECEDE POR LA IZQUIERDA DEL MISMO MODO QUE EL SIGNO DE DLAR ($) RECONOCE EL CONTEXTO QUE VA INMEDIATAMENTE A LA DERECHA. EL CONTEXTO ADYACENTE A LA IZQUIERDA SE PODRA EXTENDER, PARA PRODUCIR UN DISPOSITIVO SIMILAR AL DEL CONTEXTO ADYACENTE A LA DERECHA, PERO NO ES MUY PROBABLE QUE SEA DE UTILIDAD, PUESTO QUE A MENUDO EL CONTEXTO DE LA DERECHA RELEVANTE APARECI ALGN TIEMPO ANTES TAL COMO AL PRINCIPIO DE UNA LNEA. ESTA SECCIN DESCRIBE ENTORNOS DIFERENTES: TRES FORMAS DE TRATAR CON

1. EL USO DE FLAGS, CUANDO DE UN ENTORNO A OTRO SLO CAMBIAN UNAS POCAS RDENES. 2. EL USO DE CONDICIONES START CON RDENES. 3. EL USO DE DIVERSOS ANALIZADORES LXICOS FUNCIONANDO JUNTOS. EN CADA CASO, HAY RDENES QUE RECONOCEN LA NECESIDAD DE CAMBIAR EL ENTORNO EN EL CUAL SE ANALIZA EL TEXTO DE INPUT SIGUIENTE, Y PONEN VARIOS PARMETROS PARA REFLEJAR EL CAMBIO. ESTO PUEDE SER UN FLAG PROBADO EXPLCITAMENTE POR EL CDIGO DE ACCIN DEL USUARIO; TAL FLAG ES UNA FORMA MS SENCILLA DE TRATAR CON EL PROBLEMA, PUESTO QUE EL LEX NO EST RELACIONADO. PUEDE QUE SEA MS CONVENIENTE, HACER QUE EL LEX RECUERDE LOS FLAGS COMO CONDICIONES INICIALES DE LAS RDENES. CUALQUIER ORDEN
29

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

PUEDE ESTAR RELACIONADA CON UNA CONDICIN START. SLO SER RECONOCIDA CUANDO EL LEX EST EN ESA MISMA CONDICIN. LA CONDICIN DE START EN CURSO SE PUEDE CAMBIAR EN CUALQUIER MOMENTO. FINALMENTE, SI LOS CONJUNTOS DE RDENES DE LOS DIFERENTES ENTORNOS SON MUY DIFERENTES, SE PUEDE LOGRAR UNA MAYOR CLARIDAD ESCRIBIENDO VARIOS ANALIZADORES LXICOS DISTINTOS, Y CAMBIAR DE UNO A OTRO SEGN SE DESEE. CONSIDERE EL SIGUIENTE PROBLEMA: COPIE EL INPUT EN EL OUTPUT, CAMBIANDO LA PALABRA MAGIC A PRIMERO EN CADA LNEA QUE COMIENCE CON LA LETRA A, CAMBIANDO MAGIC POR SEGUNDO EN CADA LNEA QUE COMIENCE CON LA LETRA B, Y CAMBIANDO MAGIC POR TERCERO EN CADA LNEA QUE COMIENCE CON LA LETRA C. ESPECIFICACIN DE DEFINICIONES FUENTE RECUERDE EL FORMATO DE LA FUENTE LEX { DEFINICIONES } %% { RDENES } %% { RUTINAS DEL USUARIO } HASTA AHORA SLO SE HAN DESCRITO LAS RDENES. SE NECESITARN OPCIONES ADICIONALES, PARA DEFINIR VARIABLES PARA USARLAS EN EL PROGRAMA Y PARA QUE LAS USE EL LEX. ESTAS PUEDEN IR BIEN EN LA SECCIN DE DEFINICIONES O EN LA SECCIN DE RDENES. 1. CUALQUIER LNEA QUE NO APAREZCA COMO UNA ORDEN O ACCIN DE LEX, LA CUAL COMIENZA CON UN ESPACIO EN BLANCO O UN TABULADOR SE COPIA EN EL PROGRAMA GENERADO. TAL INPUT DE FUENTE ANTES DEL PRIMER DELIMITADOR %% SER EXTERNO A CUALQUIER FUNCIN DEL CDIGO; SI APARECE INMEDIATAMENTE DESPUS DEL PRIMER %%, APARECE EN UN LUGAR APROPIADO PARA LAS DECLARACIONES EN LA FUNCIN ESCRITA POR EL LEX EL CUAL CONTIENE LAS ACCIONES. ESTE
30

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

MATERIAL TIENE QUE BUSCAR FRAGMENTOS DE PROGRAMAS, Y DEBER IR DELANTE DE LA PRIMERA ORDEN DE LEX. COMO EFECTO SECUNDARIO DE LO ANTERIOR, LAS LNEAS QUE COMIENZAN CON UN ESPACIO EN BLANCO O UN TABULADOR, Y LAS CUALES CONTIENEN UN COMENTARIO, SE PASAN AL PROGRAMA GENERADO. ESTO SE PUEDE USAR PARA INCLUIR COMENTARIOS BIEN EN LA FUENTE LEX O BIEN EN EL CDIGO GENERADO. LOS COMENTARIOS DEBERN SEGUIR LAS CONVENCIONES DEL LENGUAJE C. 2. CUALQUIER COSA QUE VAYA INCLUIDA ENTRE LNEAS QUE SLO CONTIENEN % { Y % } SE COPIA COMO EN EL ANTERIOR. LOS DELIMITADORES SE DESECHAN. ESTE FORMATO PERMITE INTRODUCIR TEXTO COMO SENTENCIAS DE PREPROCESADOR QUE DEBEN COMENZAR EN LA COLUMNA 1, O COPIAR LNEAS QUE NO PARECEN PROGRAMAS. NOTA: EN UNA TERMINAL DE LINUX TECLEAR LO SIGUIENTE: boxer@boxer-desktop:~/Escritorio$flex [nombrePrograma].l boxer@boxer-desktop:~/Escritorio$gcc lex.yy.c -lfl boxer@boxer-desktop:~/Escritorio$./a.out En [nombreArchivo] se sustituye por el nombre del archivo fuente con la extensin.l

31

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

EJEMPLOS
1. A continuacin se presenta un ejemplo que ilustra de manera

general el uso de lex para reconocer patrones de expresiones regulares bsicas, que reconoce cualquier numero entero y cualquier palabra formada por letras maysculas de la "a" a la "z", sin importar si son maysculas o minsculas.

%{ #include int palabra=0, numero=0; %} Numero -?[0-9]+ Palabra [a-zA-Z]+ %% "bye" {bye();return 0;} "quit" {bye();return 0;} "resume" {bye();return 0;} {Palabra} {printf("Se leyo la palabra : %s", yytext);palabra++;} {Numero} {printf("Se leyo el numero : %d", atoi(yytext));numero+ +;} . printf("%s",yytext[0]); %% main(){ printf("ejem1.l\nEste ejemplo, distingue entre un numero entero y palabras.\n Introduzca bye, quit o resume para terminar.\n");
32

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

yylex(); } bye(){ printf("Se leyeron %d entradas, de las cuales se reconocieron\n %d\tEnteros\ny\ n%d\tPalabras.\n", (palabra+numero), numero, palabra); }

2. En este ejemplo, una de las primeras cosas a notar, son las

dos lneas "%%" que sirven como separadores para las tres secciones de una especificacin lex, la primera, la de definiciones, sirve para definir cosas que se van a usar en el programa resultante o en la misma especificacin: %{ #include int palabra=0, numero=0; %} Numero -?[0-9]+ Palabra [a-zA-Z]+ PODEMOS VER DOS TIPOS DE DECLARACIONES, DECLARACIONES DE C Y DECLARACIONES DE LEX, LAS DE C SON AQUELLAS ENCERRADAS ENTRE DOS LINEAS %{ Y %} RESPECTIVAMENTE QUE LE INDICAN A LEX, CUANDO SE INCLUYE CODIGO QUE SERA COPIADO SIN MODIFICAR AL ARCHIVO GENERADO EN C (TIPICAMENTE LEX.YY.C). LAS DECLARACIONES DE LEX ESTAN FORMADAS POR UN NOMBRE O IDENTIFICADOR Y SU RESPECTIVA EXPRESION REGULAR, SU FUNCIONAMIENTO ES ANALOGO A AQUEL DEL "#DEFINE" DEL PREPROCESADOR DE C, CADA VEZ QUE APARECEN ES COMO SI EN ESE LUGAR ESTUVIERA ESCRITA LA EXPRESIN REGULAR
33

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

EQUIVALENTE, TAMBIEN SE PUEDEN USAR ESTAS PARA FORMAR NUEVAS EXPRESIONES REGULARES.

3. Programa en lex que convierte cadenas de nmeros base 10 a base hexadecimal %{ #include<stdlib.h> #include<stdio.h> int count = 0; %} dig [0-9] num {dig}+ %% {num} {int n=atoi(yytext); printf("%x",n); if(n>9) count++; } %% main(){ yylex(); fprintf(stderr,"Numero de remplazos = %d",count); return 0; }

34

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS 4. Programa en Lex que incluye el numero de lneas de texto de

entrada %{ #include<stdio.h> int numLinea=1; %} linea .*\n %% {linea} {printf("%5d , %s",numLinea++,yytext);} %% main() { yylex(); return 0; } CONCLUSIONES UNA VEZ INVESTIGADO LO NECESARIO DE CMO USAR LA APLICACION LEX, ME DEDICARE A REALIZAR UN ANALISIS LEXICO UTILIZANDO ESTA HERRAMIENTA MUY UTIL PARA DESPUES SEGUIR DESARROLLANDO MI COMPILADOR CON EL SOFTWARE PARA HACER ANALISIS SINTACTICOS LLAMADO YACC, ESTAS DOS HERRAMIENTAS TE FACILITAN MUCHO HACER UN COMPILADOR YA SEA PARA EL LENGUAJE QUE SEA, YA QUE PUES LEX TE PERMITE INTRODUCIR LA GRAMATICA DE CUALQUIER LENGUAJE DE PROGRAMACION O BIEN TU PUEDES INVENTARTE TUS PROPIAS NORMAS Y TU PROGRAMAS QUE ES LO QUE ES ACEPTABLE O NO EN CADA PROGRAMA QUE COMPILE TU COMPILADOR YA SEAN NUMEROS ENTEROS, DECIMALES, LETRAS, PALABRAS, PALABRAS RESERVADAS, ETC. ESTOS DOS PROGRAMAS SON PARA SISTEMAS OPERATIVOS LINUX/UNIX ASI QUE SI TE HAN DEJADO DE TAREA REALIZAR UN COMPILADOR (O TE DIO CURIOSIDAD ESTE SOFTWARE) QUE ESPERAS PARA INSTALAR UN SISTEMA OPERATIVO LINUX/UNIX (SI AUN NO LO HAS INSTALADO) Y POSTERIORMENTE DESCARGATE ESTAS APLICACIONES MUY UTILES E INSTALALAS EN TU COMPUTADORA.

35

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

BIBLIOGRAFIA http://informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2008/tem a2.pdf http://www.infor.uva.es/~mluisa/talf/docs/labo/L6.pdf http://www.openboxer.260mb.com/asignaturas/compiladores.php http://biblioteca.uns.edu.pe/saladocentes/archivoz/curzoz/Sesion_5. pdf


http://www.medinaweb.com/programas/documents/tutoriales/lex_yacc/core/lex.html

*.PDF *.DOC

36

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

ANEXOS LO QUE LLEVO DE MI ANALIZADOR LEXICO. %{ /*Programa en Lex que lee un archivo y hace el reconocimiento de identificadores, palabras reservadas y enteros del lenguaje C */ FILE *archivo; %} dig [0-9] let [a-zA-Z] entero {dig}+ ident {let}({let}|{dig})* palRes if|else|while|int|char|do|void|break|double|long|struct| typedef|float|return |default|for|short
37

IRIS AMIEL NAVA TORRES PROGRAMACION DE SISTEMAS

%% {entero} fprintf(archivo,"%s es un Entero\n",yytext); {palRes} fprintf(archivo,"%s es una Palabra reservada\n",yytext); {ident} fprintf(archivo,"%s es un Identificador\n",yytext); %% main(int argc,char *argv[]){ yyin=fopen(argv[1],"r"); archivo=fopen("salida.txt","w"); yylex(); fclose(archivo); }

38

También podría gustarte