Analisis Lexico

1,673 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
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,673
On SlideShare
0
From Embeds
0
Number of Embeds
62
Actions
Shares
0
Downloads
45
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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 }

×