SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
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.
Interfaces de Usuarios, Interacción Humano-Computador y Lenguajes de Programación
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.
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.
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.
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.
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.
array [ núm puntopunto núm] of integer Analizar sintácticamente
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.
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.
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.
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.
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.
Recursión Izquierda Problema para análisis sintáctico
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.
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.
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>