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.

Cap6

2,550 views

Published on

Published in: Education, Technology

Cap6

  1. 1. Análisis Sintáctico<br />Capítulo 6<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />1<br />
  2. 2. Introducción<br />El analizador sintáctico:<br />Objetivo: agrupar los tokens suministrados por el scanner para reconocer “frases”.<br />Determinar si es sintácticamente correcto.<br />Establecer la estructura subyacente.<br />La sintaxis se suele especificar formalmente mediante una GLC.<br />El parser recibe tokens y los agrupa de acuerdo a producciones especificadas por la GLC.<br />El parser detecta errores sintácticos.<br />2<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  3. 3. Análisis Sintáctico<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />3<br />La estructura jerárquica de un programa es representada por reglas que constituyen una gramática.<br />Las reglas se representan por medio de producciones.<br />Cada producción define un símbolo no terminal en función de símbolos terminales o tokens, y otros símbolos no terminales. <br />Existe una producción que define al no terminal programa.<br />sent sel<br />sent asig<br />selIFcondTHENsentELSEsent<br />condexpcompexp<br />comp< | > | <= | >= | == | <><br />asigID := exp<br />expexp + term<br />expexp-term<br />expterm <br />termtermfact <br />termterm/fact<br />termfact <br />factID<br />factCTE<br />Gramática<br />
  4. 4. Análisis Sintáctico<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />4<br />Árbol de parsing<br /><ul><li>Tasa := Base + Recargo / 100ID := ID + ID / CTE</li></ul>Lista de reglas: 17 16 13 17 16 18 15 11 10 <br />Usualmente, la estructura gramatical que el Análisis Sintáctico detecta en el código fuente es representada por un árbol de parsing.<br />El árbol de parsingdemuestra como la secuencia de tokens de entrada puede ser derivada a partir de las reglas de una gramática. <br />
  5. 5. Gramáticas. Definiciones<br />Hemos visto cómo la aplicación de producciones genera las frases del lenguaje.<br />Para compiladores, el proceso es en sentido contrario:<br />Dado un string:<br />¿Pertenece al lenguaje?<br />¿Cuáles son las producciones aplicadas para derivarlo del símbolo inicial?<br />•Este proceso lo lleva a cabo el analizador sintáctico (“parser”)<br />5<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  6. 6. Consideraciones a Tomar en Cuenta<br />Restricciones a las posibles formas de las producciones.<br />Las Gramáticas de los lenguajes a considerar (según la clasificación de Chomsky):<br />Tipo 0: libres.<br />Tipo 1: dependientes del contexto.<br />Tipo 2: libres de contexto.<br />Tipo 3: regulares.<br />Cada gramática de un tipo es también del tipo anterior.<br />Cuanto menos restrictiva es una gramática, más complejo es su análisis.<br />Las más sencillas son las de Tipo 3, que pueden ser reconocidas por autómatas de estados finitos.<br />6<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  7. 7. Pasos<br />Creación de árboles sintácticos.<br />Como en el caso del análisis léxico.<br />Derivación por derecha ó izquierda.<br />Tomar en cuenta el problema de la ambigüedad en las expresiones.<br />Produce indeterminismo.<br />Es importante eliminarla, cuando se pueda.<br />Transformación de gramáticas.<br />Convertir la gramática fuente a leng. Intermedio.<br />Comparación de las gramáticas.<br />Hacer “algunos” tests para ver resultados.<br />Comparar la equivalencia con una gramática “correcta”.<br />No existe un algoritmo general para GLC.<br />7<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  8. 8. Estrategias para Analizadores Sintácticos<br />El analizador sintáctico debe verificar si la entrada corresponde a alguna derivación.<br />Primera aproximación: “a lo bestia”.<br />Generar todas las derivaciones posibles.<br />Comprobar si la entrada corresponde con alguna de ellas.<br />Inviable, incluso para gramáticas muy sencillas.<br />Son necesarias estrategias más “astutas”.<br />Las estrategias son de dos categorías:<br />Análisis DESCENDENTE(Top-Down).<br />Construye el árbol desde la raíz hasta llegar a las hojas.<br />Análisis ASCENDENTE(Bottom-Up).<br />Construye el árbol desde las hojas hacia la raíz.<br />8<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  9. 9. Estrategias para Analizadores Sintácticos<br />A distintos tipos de analizadores se les da nombres en función a varios elementos:<br />Lectura de tokens (izda. a dcha., viceversa).<br />Método de derivación (izda. o dcha.).<br />Número de tokens de pre-análisis (look-ahead).<br />Las más comunes:<br />9<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  10. 10. Propiedades Deseables de un Analizador Sintáctico<br />Eficiente.<br />En general, se buscarán polinomiales en el tamaño del programa a reconocer.<br />Determinar la acción reconociendo unos pocos tokens de entrada.<br />Como máximo, un número preestablecido.<br />En la práctica, suele ser más.<br />No necesitar “marcha atrás”(backtracking).<br />Evitar decisiones.<br />Las acciones semánticas son difíciles de deshacer.<br />No ocupar mucha memoria.<br />Actualmente, esto no es tan importante.<br />10<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  11. 11. Ejemplo de Análisis Descendente<br />Para utilizar un analizador sintáctico descendente, se construirá un:<br />Analizador sintáctico descendente recursivo.<br />Ideas básicas del método:<br />Construir un conjunto de procedimientos (recursivos si necesario).<br />Uno por cada no terminal de la gramática.<br />Cada procedimiento:<br />Determina la producción a aplicar.<br />Invoca los procedimientos correspondientes.<br />Detecta error o pasa al siguiente token<br />La secuencia de invocaciones a los procedimientos define implícitamente el árbol de sintaxis.<br />11<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />
  12. 12. Analizadores Sintácticos<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />12<br />Un analizador sintáctico predictivo es un analizador sintáctico descendente recursivo que NO necesita marcha atrás.<br />Condición exigible a una gramática para que sea posible:<br />Que en todo momento, a partir del siguiente token de entrada, sea posible determinar qué regla aplicar.<br />Esto es posible cuando (una de dos):<br />Ningún no terminal tiene alternativas en su parte derecha.<br />Gramáticas poco interesantes.<br />No terminales con alternativas que empiecen por distintos símbolos.<br />Aunque hay más casos en que también es posible.<br />El hecho de que haya reglas recursivas hace que el analizador predictivo implementado directamente sea recursivo.<br />Sin embargo, la recursividad se puede evitar mediante el uso explícito de una pila.<br />Un analizador predictivo sabe, a partir del símbolo que está analizando y el siguiente símbolo de entrada, qué regla aplicar.<br />Predictivos<br />No Predictivos<br />
  13. 13. 13<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />Analizador Léxico<br />(scanner)<br />Creación de árboles sintácticos<br />Derivación:<br /><ul><li>Programa:
  14. 14. Top down
  15. 15. Bottom-up
  16. 16. Líneas
  17. 17. Derecha
  18. 18. Izquierda</li></ul>Transformación de gramáticas<br />Comparación<br />Predictivos<br />No predictivos<br />pasos<br />del<br />análisis<br /><ul><li>Gramática
  19. 19. Reglas representadas por producciones
  20. 20. Árbol de parsing
  21. 21. Derivación de la secuencia de tokens</li></ul>Cada producción define un símbolo no terminal en función de símbolos terminales ó tokens (etc.)<br />análisis sintáctico<br />gramáticas a considerar<br />objetivo<br />El parser es un reconocedor de frases:<br /><ul><li>Sintácticamente correctas
  22. 22. Establece estructura subyacente
  23. 23. Tipo 0: libres
  24. 24. Tipo 1: dependientes del contexto
  25. 25. Tipo 2: libres del contexto
  26. 26. Tipo 3: regulares</li></ul>clasificación de Chomsky<br />El analizador sintáctico opera intrínsecamente con:<br /><ul><li>Analizador Léxico
  27. 27. Analizador Semántico</li></ul>2y 3 pueden ser reconocidos por autómatas finitos<br />

×