Lex yacc

588 views
370 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
588
On SlideShare
0
From Embeds
0
Number of Embeds
49
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lex yacc

  1. 1. PONTIFICIA UNIVERSIDAD CATÓLICA DEL ECUADOR SEDE SANTO DOMINGO COMPILADORES INTEGRANTES: Diego Balcázar Jeremy Camacho William Gallo GENERADOR LEX & YACC
  2. 2. INTRODUCCIÓN  Como la programación dirigida por patrones es de mucha utilidad, se introduce un lenguaje de patrón-acción, llamado Lex, para especificar los analizadores léxicos. En este lenguaje, los patrones se especifican por medio de expresiones regulares, y un compilador de Lex puede generar un reconocedor de las expresiones regulares mediante un autómata finito eficiente.
  3. 3.  El código Lex reconoce estas expresiones en una cadena de input y divide este input en cadenas de caracteres que coinciden con las expresiones. Se ejecutan las secciones de programas proporcionados por el usuario. El fichero fuente Lex asocia las expresiones regulares y los fragmentos de programas.
  4. 4.   Puesto que cada expresión aparece en el input del programa escrito por el Lex, se ejecuta el fragmento correspondiente. El usuario proporciona el código adicional necesario para completar estas funciones. El Lex convierte los patrones y acciones del usuario en un programa C llamado yylex. Elprograma yylex reconoce expresiones en un flujo y lleva a cabo las acciones especificadas para cada expresión a medida que se va detectando
  5. 5.  Considere un programa para borrar del input todos los espacios en blanco y todos los tabuladores de los extremos de las líneas. %% [b t]+$ ;  Los corchetes indican la clase del carácter compuesto de espacios en blanco y tabuladores; el + indica uno o más del item anterior; y el signo de dólar ($) indica el final de la línea. No se especifica ninguna acción, por lo tanto el programa generado por el Lex ignorará estos caracteres. Todo lo demás se copiará .
  6. 6. USO DE LEX CON YACC  Lex y Yacc (un generador de analizadores sintácticos) suelen ser utilizados juntos. Yacc utiliza una gramática formal para analizar un flujo de entradas, algo que Lex no puede hacer con expresiones regulares simples (Lex se limita a los autómatas de estados finitos simples). Sin embargo, Yacc no puede leer en un flujo de entradas simple - requiere una serie de símbolos. Lex se utiliza a menudo para proporcionar a Yacc estos símbolos.
  7. 7. FORMATO FUENTE DEL LEX El formato general de la fuente Lex es: {definiciones} %% {órdenes} %% {subrutinas del usuario} 
  8. 8.  Las definiciones y las subrutinas del usuarios seomiten a menudo. El segundo %% es opcional,pero el primero se requiere para marcar elprincipio de las órdenes. El programa Lexmínimo absoluto es por lo tanto %% (sin definiciones, ni órdenes) lo cual se traduce enun programa que copia el input en el output sinvariar.
  9. 9. EXPRESIONES DEL LEX   Esta contiene caracteres de texto y caracteresoperador . Las letras del alfabeto y los dígitos sonsiempre caracteres de texto. Los caracteres operador son: ´ [ ] ^ - ? . * + | ( ) $ / { } % < >  Si cualquiera de estos caracteres se va a usar literalmente, es necesario incluirlosindividualmente entre caracteres barra invertida( ) o como un grupo dentro de comillas ( ´ ).
  10. 10.   n t b  ( ´ ) indica que siempre que esté incluido dentro de unpar de comillas se va a tomar como un carácter detexto. xyz”++” Se reconocen varios escapes C normales con la barrainvertida ( ): newline tabulador backspace barra invertida Puesto que el carácter newline es ilegal en unaexpresión, es necesario usar n; no se requiere darescape al carácter tabulador y el backspace.
  11. 11. LLAMAR AL LEX    El programa Lex fuente tiene que ser convertido en un programa regenerado en el lenguaje de propósito general. Entonces éste programa tiene que ser compilado y cargado, normalmente con una librería de subrutinas Lex. El programa generado está en un fichero llamado lex.yy.c. La librería I/O está definida en términos de la librería estándar C. A la librería se accede por medio del flag de la carga -ll.Por lo tanto un conjunto de comandos apropiados es: ∗ lex source ∗ cc lex.yy.c-ll El programa resultante se pone en el fichero usual a.out para ser ejecutado posteriormente.
  12. 12. ESPECIFICACIÓN DE EXPRESIONES Especificación de clases de caracteres Las clases de caracteres se pueden especificarusando corchetes: [y]. La construcción:  ∗ [abc] Coincide con cualquier carácter, que pueda seruna a, b, o c. . Dentro de los corchetes, la mayoríade los operadores se ignoran.
  13. 13. Especificación de un carácter arbitrario Para hacer coincidir casi con cualquier carácter,el punto (.), designa la clase de todos loscaracteres excepto un carácter newline. Hacerescape en octal es posible, aunque esto no esportable. Por ejemplo:  [ 40 - 176 ] coincidecon todos los caracteres imprimibles del conjuntode caracteres ASCII, desde el octal 40 (espacio enblanco) hasta el octal 176 ( la tilde).
  14. 14. Especificar expresiones opcionales El operador signo de interrogación( ? )indica unelemento opcional de una expresión.Por lo tanto  ab?c Especificación de expresiones repetidas Las repeticiones de clases se indican con losoperadores asterisco ( * ) y el signo más ( + ). Porejemplo: a* 
  15. 15. Especificación de alternación y de agrupamiento El operador barra vertical ( | ) indica alternación. Por ejemplo: ( ab | cd )  Especificación de repetición de expresiones. Las llaves ( { y } ) especifican o bien repeticiones ( siéstas incluyen números) o definición de expansión (siincluyen un nombre). Por ejemplo:{dígito} 
  16. 16. MANEJO DE ÓRDENES FUENTES AMBIGUAS  El Lex puede manejar especificaciones ambiguas. Cuando más de una expresión puede coincidir con el input en curso, el Lex selecciona de la forma siguiente: -Se prefiere la coincidencia más larga. -De entre las órdenes que coinciden en el mismo número de caracteres, se prefiere la primera ordenes pecificada.

×