Successfully reported this slideshow.

Analisis Sintactico

0

Share

Upcoming SlideShare
A Sintactico Descendente
A Sintactico Descendente
Loading in …3
×
1 of 17
1 of 17

Analisis Sintactico

0

Share

Download to read offline

Explica en qué consiste el análisis sintáctico. Fundamentalmente es determinar si existe un árbol de análisis sintáctico construído a partir de la cadena de entrada.

Explica en qué consiste el análisis sintáctico. Fundamentalmente es determinar si existe un árbol de análisis sintáctico construído a partir de la cadena de entrada.

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

Analisis Sintactico

  1. 1. Análisis Sintáctico Determinar si una cadena puede ser generada 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. Analizador sintáctico <ul><li>¿Es posible construír el árbol? </li></ul><ul><li>Métodos: </li></ul><ul><ul><li>Descendente </li></ul></ul><ul><ul><ul><li>De la raíz a las hojas </li></ul></ul></ul><ul><ul><ul><li>Popular y eficiente </li></ul></ul></ul><ul><ul><li>Ascendente </li></ul></ul><ul><ul><ul><li>De las hojas a la raíz </li></ul></ul></ul><ul><ul><ul><li>Más gramáticas </li></ul></ul></ul>
  3. 3. Analizador descendente <ul><li>Algoritmo </li></ul><ul><ul><li>Seleccione una producción y construya los hijos </li></ul></ul><ul><ul><li>Encuentre el siguiente nodo (no terminal) </li></ul></ul><ul><ul><li>Si hay otro nodo aplicar recursivamente </li></ul></ul><ul><ul><li>Si no hay más nodos </li></ul></ul><ul><ul><ul><li>Si la cadena coincide entonces ACEPTAR </li></ul></ul></ul><ul><ul><ul><li>Si no coincide, probar recursivamente </li></ul></ul></ul>
  4. 4. Ejemplo <ul><li>Gramática de tipos en Pascal </li></ul><ul><li>Tipo -> Simple | ^id | </li></ul><ul><li>array [ Simple ] of Tipo </li></ul><ul><li>Simple -> integer | char | </li></ul><ul><li>núm puntopunto núm </li></ul>
  5. 5. array [ núm puntopunto núm] of integer Analizar sintácticamente
  6. 6. Descendente (símbolo inicial) <ul><li>Function Tipo() </li></ul><ul><li>Resu = Simple() </li></ul><ul><li>If Not Resu Then </li></ul><ul><li>Resu = Match(“^”) And Match(“id”) </li></ul><ul><li>If Not Resu Then </li></ul><ul><li>Resu = Match(“Array”) And Match(“[”) </li></ul><ul><li>And Simple() And Match(“]”) </li></ul><ul><li>And Match(“of”) And Tipo() </li></ul><ul><li>End </li></ul><ul><li>End </li></ul><ul><li>Tipo = Resu </li></ul><ul><li>End Function </li></ul>
  7. 7. Descendente (nodo) <ul><li>Function Simple() </li></ul><ul><li>Resu = Match(“integer”) </li></ul><ul><li>If Not Resu Then </li></ul><ul><li>Resu = Match(“char”) </li></ul><ul><li>If Not Resu Then </li></ul><ul><li>Resu = Match(“núm”) </li></ul><ul><li>And Match(“puntopunto”) </li></ul><ul><li>And Match(“núm”) </li></ul><ul><li>End </li></ul><ul><li>End </li></ul><ul><li>Simple = Resu </li></ul><ul><li>End Function </li></ul>
  8. 8. Match() - parea() <ul><li>Function Match(Valor) </li></ul><ul><li>Tmp = GetNextToken() </li></ul><ul><li>If Tmp = Valor Then </li></ul><ul><li>Match = True </li></ul><ul><li>/* Avanzar posición en entrada */ </li></ul><ul><li>Else </li></ul><ul><li>Match = False </li></ul><ul><li>End If </li></ul><ul><li>End Function </li></ul>
  9. 9. Match() simplificado <ul><li>Function Match(Valor) </li></ul><ul><li>Match = GetNextToken() = Valor </li></ul><ul><li>End Function </li></ul><ul><li>Ojo: queda pendiente avanzar la entrada </li></ul>
  10. 10. GetNextToken() <ul><li>Inteligente </li></ul><ul><ul><li>Reconoce separadores: </li></ul></ul><ul><ul><ul><li>Espacio, fin de línea, tabuladores, etc. </li></ul></ul></ul><ul><ul><li>Token especiales: >,>=,<,<= </li></ul></ul><ul><ul><li>Palabras clave: While de WhileFlag </li></ul></ul>
  11. 11. Recursión Izquierda Problema para análisis sintáctico
  12. 12. Gramática infijo <ul><li>Expr -> Expr + Término </li></ul><ul><li>Expr -> Expr - Término </li></ul><ul><li>Expr -> Término </li></ul><ul><li>Término -> 0 </li></ul><ul><li>Término -> 1 </li></ul><ul><li>Término -> 2 </li></ul><ul><li>.... </li></ul><ul><li>Término -> 9 </li></ul>Recursión izquierda
  13. 13. Análisis descendente <ul><li>Function Expr() </li></ul><ul><li>Resu = Expr() And Match(“+”) And Término() </li></ul><ul><li>If Not Resu Then </li></ul><ul><li> Resu = Expr() And Match(“-”) And Término() </li></ul><ul><li>If Not Resu Then </li></ul><ul><li>Resu = Término() </li></ul><ul><li>End </li></ul><ul><li>End </li></ul><ul><li>Expr = Resu </li></ul><ul><li>End Function </li></ul>
  14. 14. Recursión izquierda <ul><li>Ojo: no se puede cambiar la gramática </li></ul><ul><li>Gramática iguales si árboles iguales </li></ul><ul><li>NT -> NT t1 | t2 </li></ul><ul><ul><li>NT: No Terminal </li></ul></ul><ul><ul><li>t1, t2: terminales </li></ul></ul><ul><li>Expr -> Expr + Término </li></ul>
  15. 15. Corrección de recursión izquierda <ul><li>NT -> NT t1 | t2 </li></ul><ul><ul><li>t2 t1 t1 t1 ... t1 </li></ul></ul><ul><ul><li>t2 t1* </li></ul></ul><ul><li>NT -> t2 R </li></ul><ul><li>R -> t1 R | nil </li></ul><ul><ul><li>t2 t1 t1 t1 ... t1 </li></ul></ul><ul><ul><li>t2 t1* </li></ul></ul>
  16. 16. Gramática infijo corregida <ul><li>Expr -> Término Resto </li></ul><ul><li>Resto -> + Expr | - Expr | nil </li></ul><ul><li>Término -> 0 </li></ul><ul><li>Término -> 1 </li></ul><ul><li>Término -> 2 </li></ul><ul><li>.... </li></ul><ul><li>Término -> 9 </li></ul>
  17. 17. Proyecto 1 <ul><li>Gramática de nombres y direcciones de email </li></ul><ul><li>Reglas semánticas </li></ul><ul><li>Reconocedor-extractor de emails mejorado </li></ul><ul><ul><li>GetNextToken() </li></ul></ul><ul><ul><li>Match() </li></ul></ul><ul><ul><li>Análizador descendente </li></ul></ul>

×