Todo sobre Analizadores Sintácticos: Funciones, Tipos y Herramientas

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 14,98 KB

1.- ¿Qué es un analizador sintáctico?
R=
Un analizador sintáctico (en inglés parser) es una de las partes de un compilador que transforma su entrada en un árbol de derivación. El análisis sintáctico convierte el texto de entrada en otras estructuras (comúnmente árboles), que son más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada.

2.- ¿Qué es y para qué sirve un parser?
R=
Un analizador sintáctico (Parser) es un programa que reconoce si una o varias cadenas de caracteres forman parte de un determinado lenguaje.

4.- ¿Para qué sirve un manejador de errores?
R= Para generar información de depuración sobre el estado del programa cuando se ha encontrado un error.

5.- ¿Tipos de errores que presenta el analizador sintáctico?
Errores léxicos, producidos al escribir mal un identificador, una palabra clave o un operador.
Errores sintácticos, por una expresión aritmética o paréntesis no equilibrados.
Errores semánticos, como un operador aplicado a un operando incompatible.
Errores lógicos, puede ser una llamada infinitamente recursiva.

6.- ¿Qué es Yacc y Bison?
*Bison es un programa generador de analizadores sintácticos de propósito general perteneciente al proyecto GNU, disponible para prácticamente todos los sistemas operativos. Se usa normalmente acompañado de Flex, aunque los analizadores léxicos se pueden también obtener de otras formas.

*YACC es un analizador sintáctico que nos permitirá averiguar si un fichero de entrada cualquiera respeta las reglas de una gramática concreta. Yacc está escrito en C y es portátil. La clase de especificaciones aceptada es una muy general: LALR(1), que son las gramáticas con las reglas de desambiguación.

7.- ¿Qué es una tabla de símbolos? R= Es una estructura de datos que usa el proceso de traducción de un lenguaje de programación, por un compilador o un intérprete, donde cada símbolo en el código fuente de un programa está asociado con información tal como la ubicación, el tipo de datos y el ámbito de cada variable, constante o procedimiento.

8.- ¿Para qué se utiliza la corrección de errores sintácticos?

9.- ¿Qué es un analizador ascendente? R= 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.

10.- ¿Qué es un analizador descendente? R= (Top-Down-Parser): Un analizador puede empezar con el símbolo inicial e intentar transformarlo en la entrada. Intuitivamente, esto sería ir dividiendo la entrada progresivamente en partes cada vez más pequeñas. De esta forma funcionan los analizadores LL, un ejemplo es el JavaCC.

11.- ¿Qué es un árbol de derivación?
R= Un árbol es un conjunto de puntos, llamados nodos, unidos por líneas, llamadas arcos. Un arco conecta dos nodos distintos. Para ser un árbol, un conjunto de nodos y arcos debe satisfacer ciertas propiedades:

12.- Características de un analizador sintáctico:
*Es una de las partes de un compilador que transforma su entrada en un árbol de derivación.
*Convierte el texto de entrada en otras estructuras (comúnmente árboles).
*Recibe los tokens y comprueba su ordenación correcta. Genera un árbol sintáctico.
Los tokens pueden ser específicos, como las palabras reservadas, separadores y operadores. No específicos como identificadores, constantes y etiquetas.
*Comprobar que los tokens forman una expresión válida, esto se hace usualmente usando una gramática libre de contexto que define recursivamente componentes que pueden aparecer en una expresión y el orden en que estos deben aparecer.
*Como su nombre lo indica, se encarga de revisar que los tokens estén ubicados y agrupados de acuerdo a la definición del lenguaje.
*Que los tokens pertenezcan a frases gramaticales válidas, que el compilador utiliza para sintetizar la salida.
*Por lo general, las frases gramaticales son representadas por estructuras jerárquicas, por medio de árboles de análisis sintáctico.
*En esta etapa se completa la tabla de símbolos con la dimensión de los identificadores y los atributos necesarios.

13.- Ejemplos de errores sintácticos
Imagen

14.- ¿Qué es un autómata?
R= Es un modelo matemático de un sistema que recibe una cadena constituida por símbolos de un alfabeto y determina si esa cadena pertenece al lenguaje que el autómata reconoce.

15.- ¿Tipos de recuperadores?


16.- ¿En qué consiste la recuperación de error por parser?
Uno de los aspectos más importantes en el desarrollo de parsers CUP es el soporte de la recuperación de errores sintácticos. CUP utiliza los mismos mecanismos de recuperación que YACC. En particular, soporta un símbolo especial de error, denotado simplemente como error, que juega el rol de un no terminal especial que, en lugar de ser definido por producciones, reconoce una secuencia de entrada errónea.
El símbolo error solo aparece si el error de sintaxis se detecta. Si se detecta un error de sintaxis, el parser intenta reemplazar alguna porción del stream de tokens de entrada con error y luego continuar el parsing. Por ejemplo, en presencia de producciones tales como :

stmt ::= expr SEMI | while_stmt SEMI | if_stmt SEMI | ... | error SEMI ;
indica que si ninguna de las producciones normales para stmt pueden ser reconocidas en la entrada, entonces debería declararse un error, y la recuperación debería llevarse a cabo ignorando los tokens erróneos (lo cual es equivalente a reconocer y reemplazarlos con error) sobre un punto en el que el parser pueda continuar con un punto y coma (y el contexto adicional que "legalmente" sigue a una sentencia). Se considera que un error se ha recobrado si y solo si un número suficiente de tokens anteriores al símbolo error pueden ser parseados exitosamente. (El número de tokens requerido es determinado por el método del parser error_sync_size() y por defecto es 3).
Específicamente, el parser primero busca en el tope del stack el estado más cercano que tiene una transición de salida para error. Esto, generalmente corresponde para trabajar desde producciones que representan constructores más detallados (tales como una clase específica de sentencias) sobre las producciones que representan constructores más generales o englobadores, tales como la producción general para todas las sentencias o una producción que representa una sección de declaraciones en su totalidad, hasta arribar a un lugar en el que se provea una producción de recuperación del error. Una vez que el parser haya alcanzado una configuración que tiene una recuperación de error inmediata (desapilando del stack el primero de tales estados), el parser comienza por ignorar los tokens para encontrar un punto en el que el parsing pueda continuar.

Luego de descartar cada token, el parser intenta parsear a la cabeza de la entrada (sin ejecutar ninguna de las acciones semánticas incluidas). Si el parser puede parsear exitosamente pasado el número de tokens requerido, la entrada es retrocedida sobre el punto de recuperación y el proceso de parsing se reanuda normalmente, ejecutando todas las acciones. Si el parsing no puede continuar lo suficientemente lejos, entonces se descarta otro token y el parser nuevamente intenta parsear a la cabeza. Si se llega al final de la entrada sin lograr una recuperación exitosa (o no pudo encontrarse un estado de recuperación del error en el stack, para comenzar), entonces la recuperación del error falla.

17.- ¿Principales funciones de un manejador de errores?
*Comprobar si el programa es sintácticamente correcto.
*Generar las estructuras de datos (árboles sintácticos u otras estructuras) que representan el programa y sirven para el analizador semántico y el generador de código.
*En el caso de compilación dirigida por sintaxis -- llamar al analizador semántico y al generador de código.

18.- ¿Menciona algunas herramientas que provee Yacc?

19.- ¿Objetivo del análisis sintáctico?
Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su localización.
Recuperarse del error, para poder seguir examinando la entrada.
No ralentizar significativamente la compilación.

20.- ¿Menciona el diagrama de parser?

21.- ¿Funciones del administrador de la tabla de símbolos?
R= La tabla de símbolos registra información acerca de cada nombre de símbolo en un programa. Históricamente, los nombres se llamaron símbolos, más que de una tabla de nombres. Una tabla de símbolos es una estructura de datos que contiene un registro por cada identificador. El registro incluye los campos para los atributos del identificador. El administrador de la tabla de símbolos se encarga de manejar los accesos a la tabla de símbolos, en cada una de las etapas de compilación de un programa.
22.- ¿Componentes de una tabla de símbolos?

23.- ¿Por qué utilizar un analizador sintáctico?

24.- ¿De qué trata la corrección global de errores?


25.- ¿Funciones de Yacc y Bison?


26.- ¿Explique el diagrama de sintaxis?

27.- ¿Qué es una gramática libre de contexto? R= Los lenguajes libres del contexto son aquellos que pueden ser reconocidos por un autómata de pila determinístico o no determinístico.

Entradas relacionadas: