“AÑO DEL BUEN SERVICIO AL CIUDADANO” FACULTAD DE INGENIERIA DE SISTEMAS E INFORMATICA UNIVERSIDAD NACIONAL NACIONAL DE SAN MARTIN
DOCENTE:
CURSO:
Ing. Victor A. Avila Tuesta
Compiladores
TEMA: Análisis
sintáctico descendente
INTEGRANTES: ● ● ● ● ●
Romelia Josefina Garcia Rios Eduardo Renne Arenas SantaMaria Jose Manuel Diaz Ayala Antony Will Solsol Soplin Elder Orlando Culqui Guzman
1. INTRODUCCIÓN
Este tema está dedicado al método de análisis sintáctico descendente que es un proceso dentro de la fase de análisis sintáctico de un compilador, se utilizan, por lo general, en los compiladores. Primero presentaremos los conceptos básicos, después las técnicas adecuadas para la implementación manual y, por último, los algoritmos que se han utilizado en las herramientas automatizadas.Debido a que los programas pueden contener errores sintácticos, hablaremos sobre las extensiones de los métodos de análisis sintáctico para recuperarse de los errores comunes. Por diseño, cada lenguaje de programación tiene reglas precisas, las cuales prescriben la estructura sintáctica de los programas bien formados. Por ejemplo, en C un programa está compuesto de funciones, una función de declaraciones e instrucciones, una instrucción de expresiones, y así sucesivamente.La sintaxis de las construcciones de un lenguaje de programación puede especificarse mediante gramáticas libres de contexto o la notación B N F (Forma de Backus-Naur). Las gramáticas ofrecen beneficios considerables, tanto para los diseñadores de lenguajes como para los escritores d e compiladores.
a. Reseña Histórica.
El formalismo de las gramáticas libres de contexto se originó con Chomsky, como parte de un estudio acerca del lenguaje natural. La idea también se utilizó en la descripción sintáctica de dos de los primeros lenguajes: Fortran por Backus y Algol 60 por Naur. El erudito Panini ideó una notación sintáctica equivalente para especificar las reglas de la gramática Sanskrit entre los años 400 a.C . y 200 a.C. Cantor y Floyd fueron los primeros que observaron el fenómeno de la ambigüedad. La Forma Normal de Chomsky proviene de la teoría de las gramáticas libres de contexto se resume en el análisis sintáctico de descenso recursivo fue el método preferido para los primeros compiladores, como , y los sistemas para escribir compiladores, como META y TMG. Lewis y Stearns introdujeron las gramáticas LL. Una de las primeras técnicas de análisis sintáctico , que se debe a Floyd , implica la precedencia de los operadores. Wirth y Weber generalizaron la idea para las partes del lenguaje que no involucran operadores. Estas técnicas se utilizan raras veces hoy en día, pero podemos verlas como líderes en una cadena de mejoras para el análisis sintáctico LR. Knuth introdujo los analizadores sintácticos LR , y las tablas de análisis sintáctico LR canónicas se originaron ahí. Este método no se consideró práctico, debido aquellas tablas de análisis sintáctico eran más grandes que las memorias principales de las computadoras típicas de esa época , hasta que Korenjak proporcionó un método para producir tablas de análisis sintáctico de un tamaño razonable para los lenguajes de programación comunes. De Remer desarrolló los métodos LALR y SLR que se usan en la actualidad. La construcción de las tablas de análisis sintáctico LR para las gramáticas ambiguas . El generador Yacc de Johnson demostró con mucha rapidez la habilidad práctica de generar analizadores sintácticos con un generador de analizadores sintácticos LALR para los compiladores de producción. El manual para el generador de analizadores sintácticos Yacc se encuentra en la versión de código-abierto, Bison . Hay un generador de analizadores sintácticos similar llamado CUP , el cual se basa en LALR y soporta acciones escritas en Java. Los generadores de analizadores sintácticos descendentes incluyen a Antlr, un generador de analizadores sintácticos de descenso recursivo que acepta acciones en C + + , Java o C # , y LLG en ,que es un generador basado en LL .
b. Planteamiento situacional.
De manera equivalente, podemos considerar el análisis sintáctico descendente como la búsqueda de una derivación por la izquierda para una cadena de entrada. En cada paso de un análisis sintáctico descendente, el problema clave es el de determinar la producción que debe aplicarse para un no terminal, por decir A . Una vez que se elige una producción A , el resto del proceso d e análisis sintáctico consiste en “relacionar” los símbolos terminales en el cuerpo de la producción con la cadena de entrada. Intenta construir un árbol de análisis sintáctico, empezando desde las hojas (la cadena) y ascendiendo hacia la raíz. Lo que es lo mismo que intentar obtener una reducción desde una cadena hasta llegar al axioma. ANÁLISIS SINTÁCTICO DESCENDENTE LL BASADO EN TABLA DE ANÁLISIS (TAS) Intenta construir un árbol de análisis sintáctico, empezando desde la raíz y descendiendo hacia las hojas.Lo que es lo mismo que intentar obtener una derivación por la izquierda para una cadena de entrada,comenzando desde la raíz y creando los nodos del árbol en orden previo. L: left to right t: lee la entrada de izquierda a derecha. L: left derivation: produce una derivación por la izquierda.
2. ANÁ LISIS SITUACIO NAL. Ventajas de utilizar un analizador sintáctico ● La gramática proporciona una especificación precisa, fácil de entender de un
lenguaje de programación. ● A partir de algunas clases de gramáticas se puede construir automáticamente un analizador eficiente que determine si un programa fuente está sintácticamente bien formado. ● Los lenguajes evolucionan con el tiempo, adquiriendo nuevas construcciones y realizando tareas adicionales. Estas nuevas construcciones se pueden añadir con más facilidad a un lenguaje cuando existe una aplicación basada en una descripción gramatical. ● Una gramática imparte una estructura a un lenguaje de programación útil para la traducción de un programa fuente a código objeto correcto y para la detección de errores. ● El proceso de construcción del analizador sintáctico puede revelar ambigüedades sintácticas y otras construcciones difíciles de analizar que podrían pasar sin ser detectadas en la fase inicial del diseño de un lenguaje y de su compilador.. Una implantación de un analizador sintáctico utilizando tabla requiere un trabajo de análisis. Primero tiene que eliminarse la recursión por la izquierda sifuera el caso. Luego tiene que hallarse los conjuntos PRIMERO y SIGUIENTE. Finalmente tiene que construirse la tabla de análisis sintáctico TAS.
●
3. UTILIZACIÓN DE FODA. DEBILIDADES: ● Problemas de indeterminismo cuando varias alternativas en una misma producción comparten el mismo prefijo. No sabríamos cuál elegir. Probaremos una y si se produce un error haríamos backtracking. Si queremos que el método sea determinista hay que evitarlas. ● Podemos deducir que la colección de analizadores sintácticos LR es más poderosa que la de los analizadores LL, puesto que existen lenguajes libre del contexto que no pueden ser analizados por un analizador sintáctico LL, aunque sí por un analizador LR ● Raras veces se necesita el rastreo hacia atrás para analizar las construcciones de un lenguaje de programación, por lo que los analizadores sintácticos con éste no se ven con frecuencia. Incluso para situaciones como el análisis sintáctico de un lenguaje natural, el rastreo hacia atrás no es muy eficiente, por lo cual se prefieren métodos tabulares como el algoritmo de programación dinámico. ● puede dar lugar a un aumento exponencial en el número de caminos a explorar.
FORTALEZA ● Los generadores de analizadores sintácticos descendentes incluyen a Antlr , un generador de analizadores sintácticos de descenso recursivo que acepta acciones en C++ , Java o C # , y LL Gen , que es un generador basado en LL (1). ● La recursividad a izquierdas da lugar a un bucle infinito de recursión ● Un conjunto de lenguajes de programación usaron/usan LL(1): LISP, PHYTON, JAVASCRIPT. ● LL(1) es sencillo: ○ Rapida implementacion con una tabla. ○ Es eficiente: parse en O(nf(G)). ○ Puede implementarse con Descendente Recursivo ■ una función para cada no terminal. ■ las funciones se llaman en base al token de lookahead
4. CONCLUSIONES. ●
●
●
Una gramática diseñada adecuadamente imparte una estructura a un lenguaje de programación útil para la traducción de programas fuente a código objeto correcto y para la detección de errores. Una gramática recursiva por la izquierda puede hacer que un analizador sintáctico de descenso recursivo, incluso uno con rastreo hacia atrás, entre en un ciclo infinito. Los tipos de errores que se pueden encontrar son por una expresión aritmética o paréntesis no equilibrados.
5. RECOMENDACIONES.
●
tomar en consideración que no sirve para todos los casos que uno quiere realizar.
●
utilizar el analizador según para situaciones que lo ameriten porque existen otros analizadores que poseen una mejor gama.
6. BIBLIOGRAFÍA
●
Compiladores(principios,técnicas y herramientas)2da edición
●
Wikipedia: analizador sintáctico
●
análisis sintáctico cap 3