Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Analisis Lexico

1,686 views

Published on

Se presenta el análisis léxico en el contexto del análisis sintáctico y como el uso de expresiones regulares permite reducir el tamaño de los árboles de análisis sintáctico.

Published in: Education
  • Be the first to comment

  • Be the first to like this

Analisis Lexico

  1. 1. Análisis Léxico Arboles de Análisis Sintáctico Leonel Morales Díaz [email_address] Copyright 2008 by Leonel Morales Díaz – Ingeniería Simple. Derechos reservados Disponible en: http://www.ingenieriasimple.com/compiladores
  2. 2. Problema <ul><li>Construya un programa While </li></ul><ul><li>Que calcule la raíz cuadrada </li></ul><ul><li>De B y la ponga en x </li></ul><ul><li>Se puede convertir en macro </li></ul>
  3. 3. Primer Intento <ul><li>{ y := B; </li></ul><ul><li>w := B; </li></ul><ul><li>x := 0; </li></ul><ul><li>While w <> 0 do { </li></ul><ul><li>x++; </li></ul><ul><li>v := x*x; </li></ul><ul><li>w := y – v </li></ul><ul><li>}} </li></ul><ul><li>Funciona bien si la raíz es exacta (9, 16, etc.) </li></ul><ul><li>¿Raíz de 10? </li></ul>
  4. 4. Segundo Intento <ul><li>{ y := B; </li></ul><ul><li>w := B; </li></ul><ul><li>x := 0; </li></ul><ul><li>While w <> 0 do { </li></ul><ul><li>x++; </li></ul><ul><li>v := x*x; </li></ul><ul><li>w := y – v </li></ul><ul><li>}; </li></ul><ul><li>x--} </li></ul><ul><li>Funciona bien si la raíz NO es exacta (8, 12, etc.) </li></ul><ul><li>¿Raíz de 9? </li></ul>
  5. 5. Tercer Intento <ul><li>{ y := B; w := B; </li></ul><ul><li>x := 0; v := 0; </li></ul><ul><li>While w <> 0 do { </li></ul><ul><li>x++; </li></ul><ul><li>v := x*x; </li></ul><ul><li>w := y – v </li></ul><ul><li>}; </li></ul><ul><li>w := v – y; </li></ul><ul><li>While w <> 0 do { </li></ul><ul><li>x--; </li></ul><ul><li>w := 0; </li></ul><ul><li>}} </li></ul><ul><li>¿Funciona? </li></ul><ul><li>¿Raíz de 9? ¿Raíz de 5? </li></ul>
  6. 6. Analizar Léxico <ul><li>Arbol de Análisis Sintáctico </li></ul><ul><ul><li>x++ </li></ul></ul>Programa Instrucción Variable x ++
  7. 7. Analizar Léxico <ul><li>Arboles de Análisis Sintáctico </li></ul><ul><ul><li>Raíz = símbolo inicial </li></ul></ul><ul><ul><li>Cada hoja = componente léxico </li></ul></ul><ul><ul><ul><li>O nil (cadena vacía) </li></ul></ul></ul><ul><ul><li>Nodo intermedio = un no terminal </li></ul></ul><ul><ul><li>Si A es nodo: </li></ul></ul><ul><ul><ul><li>A -> X1 X2 X3...Xn es una producción </li></ul></ul></ul><ul><ul><ul><li>X1 X2 X3...Xn son hijos de A </li></ul></ul></ul>
  8. 8. Analizar Léxico <ul><li>Cadena válida -> árbol sintáctico </li></ul><ul><li>¿Si no hay árbol sintáctico? </li></ul><ul><ul><li>Error Léxico </li></ul></ul><ul><li>Lenguaje generado por una gramática </li></ul><ul><ul><li>Conjunto de cadenas </li></ul></ul><ul><ul><li>Que pueden generarse por árboles sintácticos </li></ul></ul><ul><li>OJO: Hay gramáticas ambiguas </li></ul>
  9. 9. Gramáticas Ambiguas <ul><li>prop -> id := expr </li></ul><ul><li>| if expr then prop </li></ul><ul><li>| if expr then prop else prop </li></ul><ul><li>| while expr do prop </li></ul><ul><li>| begin props_opc end </li></ul><ul><li>props_opc -> lista_props | nil </li></ul><ul><li>lista_props -> lista_props ; prop | prop </li></ul>
  10. 10. Volviendo al Problema... <ul><li>{ y := B; w := B; </li></ul><ul><li>x := 0; v := 0; </li></ul><ul><li>While w <> 0 do { </li></ul><ul><li>x++; </li></ul><ul><li>v := x*x; </li></ul><ul><li>w := y – v </li></ul><ul><li>}; </li></ul><ul><li>w := v – y; </li></ul><ul><li>While w <> 0 do { </li></ul><ul><li>x--; </li></ul><ul><li>w := 0; </li></ul><ul><li>}} </li></ul><ul><li>Hay que sustituír los macros </li></ul><ul><li>Trabajo del preprocesador </li></ul>
  11. 11. Analizar Léxico <ul><li>{ y := B; w := B; </li></ul><ul><li>x := 0; v := 0; </li></ul><ul><li>While w <> 0 do { </li></ul><ul><li>x++; </li></ul><ul><li>v := x*x; </li></ul><ul><li>w := y – v </li></ul><ul><li>}; </li></ul><ul><li>w := v – y; </li></ul><ul><li>While w <> 0 do { </li></ul><ul><li>x--; </li></ul><ul><li>w := 0; </li></ul><ul><li>}} </li></ul>Programa { Rutina }
  12. 12. Analizar Léxico <ul><li>{ While w <> 0 do x++; </li></ul><ul><li>w++; </li></ul><ul><li>} </li></ul><ul><li>{ While w <> 0 do x++ </li></ul><ul><li>w++; </li></ul><ul><li>} </li></ul>Programa { Rutina }

×