Análisis Sintáctico Determinar si una cadena puede ser generada Leonel Morales Díaz [email_address] Copyright 2008 by Leon...
Analizador sintáctico <ul><li>¿Es posible construír el árbol? </li></ul><ul><li>Métodos: </li></ul><ul><ul><li>Descendente...
Analizador descendente <ul><li>Algoritmo </li></ul><ul><ul><li>Seleccione una producción y construya los hijos </li></ul><...
Ejemplo <ul><li>Gramática de tipos en Pascal </li></ul><ul><li>Tipo  ->  Simple  | ^id | </li></ul><ul><li>array [  Simple...
array [ núm puntopunto núm] of integer Analizar sintácticamente
Descendente (símbolo inicial) <ul><li>Function Tipo() </li></ul><ul><li>Resu = Simple() </li></ul><ul><li>If Not Resu Then...
Descendente (nodo) <ul><li>Function Simple() </li></ul><ul><li>Resu = Match(“integer”) </li></ul><ul><li>If Not Resu Then ...
Match() - parea() <ul><li>Function Match(Valor) </li></ul><ul><li>Tmp = GetNextToken() </li></ul><ul><li>If Tmp = Valor Th...
Match() simplificado <ul><li>Function Match(Valor) </li></ul><ul><li>Match = GetNextToken() = Valor </li></ul><ul><li>End ...
GetNextToken() <ul><li>Inteligente </li></ul><ul><ul><li>Reconoce separadores: </li></ul></ul><ul><ul><ul><li>Espacio, fin...
Recursión Izquierda Problema para análisis sintáctico
Gramática infijo <ul><li>Expr -> Expr + Término </li></ul><ul><li>Expr -> Expr - Término </li></ul><ul><li>Expr -> Término...
Análisis descendente <ul><li>Function Expr() </li></ul><ul><li>Resu = Expr() And Match(“+”) And Término() </li></ul><ul><l...
Recursión izquierda <ul><li>Ojo: no se puede cambiar la gramática </li></ul><ul><li>Gramática iguales si árboles iguales <...
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>...
Gramática infijo corregida <ul><li>Expr -> Término Resto </li></ul><ul><li>Resto -> + Expr | - Expr | nil </li></ul><ul><l...
Proyecto 1 <ul><li>Gramática de nombres y direcciones de email </li></ul><ul><li>Reglas semánticas </li></ul><ul><li>Recon...
Upcoming SlideShare
Loading in …5
×

Analisis Sintactico

5,631 views

Published on

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.

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
5,631
On SlideShare
0
From Embeds
0
Number of Embeds
68
Actions
Shares
0
Downloads
78
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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>

×