Análisis Sintáctico<br />Capítulo 6<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />1<br />
Introducción<br />El analizador sintáctico:<br />Objetivo: agrupar los tokens suministrados por el scanner para reconocer ...
Análisis Sintáctico<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />3<br />La estructura jerárqui...
Análisis Sintáctico<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />4<br />Árbol de parsing<br />...
Gramáticas. Definiciones<br />Hemos visto cómo la aplicación de producciones genera las frases del lenguaje.<br />Para com...
Consideraciones a Tomar en Cuenta<br />Restricciones a las posibles formas de las producciones.<br />Las Gramáticas de los...
Pasos<br />Creación de árboles sintácticos.<br />Como en el caso del análisis léxico.<br />Derivación por derecha ó izquie...
Estrategias para Analizadores Sintácticos<br />El analizador sintáctico debe verificar si la entrada corresponde a alguna ...
Estrategias para Analizadores Sintácticos<br />A distintos tipos de analizadores se les da nombres en función a varios ele...
Propiedades Deseables de un Analizador Sintáctico<br />Eficiente.<br />En general, se buscarán polinomiales en el tamaño d...
Ejemplo de Análisis Descendente<br />Para utilizar un analizador sintáctico descendente, se construirá un:<br />Analizador...
Analizadores Sintácticos<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />12<br />Un analizador si...
13<br />Materia: Compiladores<br />Docente: Ing. Carlos J. Archondo O.<br />Analizador Léxico<br />(scanner)<br />Creación...
Upcoming SlideShare
Loading in...5
×

Cap6

2,214

Published on

Published in: Education, Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,214
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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 />

×