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.
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,645 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
  • Be the first to comment

  • Be the first to like this

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>

×