Generadores de código lex y flex

Solo disponible en BuenasTareas
  • Páginas : 5 (1003 palabras )
  • Descarga(s) : 0
  • Publicado : 5 de septiembre de 2012
Leer documento completo
Vista previa del texto
Instituto Tecnológico De Acapulco
Generadores De Código Léxico: Lex

Al contrario que sed y awk, lex no es un analizador sino un generador de analizadores. Esto permite incluir de manera cómoda un analizador a medida en cualquier programa:

Esquema general Un programa fuente de Lex tiene el siguiente aspecto:

De estas tres secciones, sólo la segunda es obligatoria, y cualquiera de ellaspuede estar vacía. Esto quiere decir que el mínimo programa en lex es: %% La sección de declaraciones incluye declaraciones de variables, constantes y definiciones regulares, que constituyen una manera cómoda de utilizar expresiones regulares largas en la sección de reglas; por ejemplo:

letra

[A-Za-z]

La sección de reglas especifica los patrones a reconocer y las acciones asociadas aéstos, de forma similar a la que utiliza awk: patrón {acciones en C}

La sección de rutinas permite definir funciones auxiliares en C, incluida la función main(). Por defecto, lex proporciona un main() que simplemente llama a la función yylex(). El comportamiento del programa generado (por defecto a.out, si no se le indica otra cosa al compilador de C) es el siguiente: Imprimir en la salida estándarlos lexemas que no se adapten a ningún patrón. Realizar la acción indicada para los lexemas que se ajustan a un patrón. Por lo tanto, si compilamos y ejecutamos el programa mínimo en lex, que consta únicamente de una sección de reglas vacía (%%), veremos que se limita a copiar literalmente la entrada estándar en la salida estándar. Sección de reglas A primera vista, una regla de lex tiene elmismo aspecto que una sentencia patrón-acción de awk. Su estructura es: patrón_regular • acción_en_C

El patrón regular debe estar situado en la primera posición de la línea; es decir, que no puede haber espacios antes del patrón regular. Lex admite todas las expresiones regulares de egrep, con alguna extensión más. El patrón y la acción se separan por un blanco o un tabulador (o más). La acciónpuede ser una sola sentencia de C, o una sentencia compuesta, encerrada entre llaves {}. Cuando hay más de un patrón regular que puede adaptarse a la entrada, lex tomará la cadena más larga posible que pueda adaptarse a un patrón. Si aún así hay más de un patrón que se adapta a la entrada, lex ejecutará la acción de la regla que antes aparezca en el fuente lex. Lex almacena el lexema encontrado en unarray de tipo char llamado yytext, y su longitud en la variable yyleng.

• •







La acción especial ECHO copia el lexema reconocido en la salida estándar. Es un sinónimo de printf("%s",yytext); La acción especial | (barra vertical) indica que para este patrón debe ejecutarse la acción correspondiente al patrón inmediatamente inferior. Todo programa lex incorpora automáticamentela siguiente línea como última regla:





.|\n ECHO; equivalente a estas dos reglas separadas: .| \n ECHO; De manera que todos los lexemas que no encajan con ningún otro patrón, se copian en la salida estándar. Se puede evitar este comportamiento especificando reglas para . y para \n. Código C en un programa lex Muchas veces es útil poder incluir código en C dentro de un programa en lex,para apoyar el trabajo del analizador. Suele ser normal, por ejemplo, declarar una estructura de datos que contenga detalles sobre cada lexema encontrado o incluir nuestra propia función main(). En la sección de declaraciones, entre una línea %{ y una línea %} (nótese que no es }%). Este código será externo y se situará antes de la función yylex() en el programa lex.yy.c. En la sección dedeclaraciones, cualquier línea que comience por un espacio en blanco se considerará código C y será también externo y anterior a yylex(). En la sección de reglas, y antes de que empiece la primera regla, toda línea que comience por un espacio en blanco se considerará código C que será interno a la función yylex(). Normalmente no es necesario incluir código C de esta manera. En la sección de reglas, las...
tracking img