Generador Sintáctico
Manejo de Errores
Definición
Este debe informar del lugar exacto donde se encuentra el error en el programa fuente. Es muy común en los distintos compiladores de lenguajes de programación actuales que se informe de la línea donde se encuentra el error, así como que se facilite un apuntador a la posición del carácter donde comienza dicho error, es decir, el número de línea y carácter implicados. Si, detectando un error, existe una posibilidad factible de corrección, muchos compiladores ofrecen alternativas correctas al error encontrado, como por ejemplo mostrar mensajes de este tipo: “Falta punto y coma al final de la sentencia” o “Falta paréntesis derecho”.
Características
Los tipos de error más comunes que podemos encontrar a lo largo del proceso de análisis de un programa escrito en un determinado lenguaje de programación tenemos:
- Errores léxicos: Escribir mal un identificador, palabra clave u operador.
- Errores lógicos: Una llamada infinitamente recursiva.
- Errores semánticos: Un operador aplicado a un operando incompatible.
- Errores sintácticos: Una expresión aritmética con paréntesis no equilibrados.
Funcionamiento
Estrategias de recuperación de errores en analizadores sintácticos:
Estrategias de recuperación de errores en analizadores sintácticos.
método 1: corrección global Se fundamenta en que el compilador realice el número mínimo de cambios posibles al analizar una cadena de entrada incorrecta. Es decir, para una palabra X incorrecta, buscará otra palabra Y, usando árboles de análisis sintáctico, tal que el número de inserciones, modificaciones y borrados de componentes léxicos en dicho árbol sea mínimo.
método 2: modo Pánico Este método, al descubrir un error, va ignorando símbolos de entrada hasta encontrar uno que pertenezca a un subgrupo especial designado, denominado componentes léxicos de sincronización (como, por ejemplo, “end”, “;”, “(“, “)”…) cuya función está muy bien delimitada en el programa fuente.
método 3: nivel de frase Este método, al descubrir un error, intenta realizar una corrección local de la entrada restante (como, por ejemplo, sustituir un punto por un punto y coma, eliminar una coma sobrante o insertar un punto y coma faltante) para así poder continuar el análisis sintáctico.
Subtométodo 4: Producciones de error Este método es utilizado cuando se tiene una idea de los errores más comunes que pueden encontrarse en los programas fuente. Entonces se puede aumentar la GLC del lenguaje de programación con producciones de error, como parte del lenguaje. Así, utilizaremos esta nueva GLC con las producciones de error para la construcción del analizador sintáctico.
Aplicativos que realizan
Los objetivos que persigue un manejador de errores en el análisis sintáctico son, básicamente, los siguentes:
* Informar de los errores con claridad y exactitud.
* Recuperrarse de cada error con la suficiente rapidez como para detectar errores posteriores.
* No debe retrasar de forma significativa el procesamiento de programas correctos.
Los Leguajes de progrmacion como JAVA,C#,c,etc. Posee¨compiladores que son capaces de dectectar errores que facilitan al programador saber en que se confundió y como solucionar dicho problema.
Diseño de gramáticas.
Definición
La gramática que acepta el analizador sintáctico es una gramática de contexto
libre, puesto que no es fácil comprender gramáticas más complejas ni construir
automáticamente autómatas reducidos que reconozcan las sentencias que aceptan.
Recuérdese que una gramática G queda definida por una tupla de cuatro elementos (N,T, P, S): N = No terminales.
T = Terminales.
P = Reglas de Producción.
S = Axioma Inicial
Derivaciones
Una regla de producción puede considerarse como equivalente a una regla de reescritur, donde el no terminal de la izquierda es sustituido por la pseudocadena del lado derecho de la producción. Podemos considerar que una pseudocadena es cualquier secuencia de terminales y/o no terminales
Derivación por la izquierda: es aquella en la que la reescritura se realiza sobre el no terminal más a la izquierda de la pseudocadena de partida.
Derivación por la derecha: es aquella en la que la reescritura se realiza sobre
el no terminal más a la derecha de la pseudocadena de partida.
Ambigüedad: Una gramática es ambigua si derivando de forma diferente con el mismo tipo de derivación se llega al mismo resultado.
Tipo de Gramáticas:
Gramáticas LL(1):
Una gramática LL(1) es aquella en la que su tabla de chequeo de sintaxis no posee entradas múltiples, o sea, es suficiente con examinar sólo un símbolo a la entrada, para saber qué regla aplicar. Toda gramática reconocible mediante el método de los diagramas de Conway es LL(1).
Gramáticas LR(0):
La técnica se denomina análisis sintáctico LR(k); la “L” es por el examen de la entrada de izquierda a derecha (en inglés, left-to-right), la “R” por construir una derivación por la derecha (en inglés, rightmost derivation)
en orden inverso, y la k por el número de símbolos de entrada de examen por anticipado utilizados para tomar las decisiones del análisis sintáctico.
Definición
Es la fase del analizador que se encarga de chequear el texto de entrada en base a una
gramática dada. Y en caso de que el programa de entrada sea válido, suministra el árbol sintáctico que lo reconoce.
En teoría, se supone que la salida del analizador sintáctico es alguna representación del árbol sintáctico que reconoce la secuencia de tokens suministrada por el analizador léxico.
Funcionamiento
informar de los errores sintácticos de forma precisa y significativa.Ademas deberá estar dotado de un mecanismo de recuperación de erro es para continuar con el análisis.
Construir el árbol de análisis sintáctico que define la estructura jerárquica de un programa y obtener la serie de derivaciones para generar la cadena de componentes léxicos. El árbol sintáctico se utiliza como representación intermedia en la generación de código.
Comprobar si la cadena de componentes léxicos, proporcionada por el analizador léxico, puede ser generada por la gramática que define el lenguaje fuente(gramática libre o independiente del texto).
Características
En el modelo del compilador, el analizador sintáctico obtiene una cadena de componentes léxicos del analizador léxico, y comprueba si la cadena puede ser generada por la gramática del programa fuente.
El analizador actual maneja la gramática de los datos de entrada, realiza un análisis sintáctico de éstos y como regla general crea un árbol de sintaxis (árbol de análisis). Esto se puede utilizar para el procesamiento posterior de los datos, por ejemplo, la generación de código por un compilador o ejecutado por un intérprete (traductor). Por lo tanto, el analizador es el software que comprueba, procesa y reenvía las instrucciones del código fuente.
Para analizar un texto, los analizadores suelen utilizar un analizador léxico separado (llamado lexer), que descompone los datos de entrada en fichas (símbolos de entrada como palabras). Los Lexers son por lo general máquinas de finitas, que siguen la gramática regular y por lo tanto aseguran un desglose adecuado. Los tokens obtenidos de esta manera sirven como caracteres de entrada para el analizador sintáctico.
Aplicativos que realizan el analizados sintáctico
Las aplicaciones que intentan analizar la estructura sintáctica de un lenguaje se enfrentan al fenómeno de la ambigüedad, que se puede dar debido a fenómenos como:
redundancia en la definición de las reglas gramaticales y/o variedad de roles sintácticos que pueda tener una palabra; se
pueden generar así varias representaciones sintácticas para una misma oración. El analizador muestra los distintos árboles sintácticos que puedan ser generados como
consecuencia de la ambigüedad presente
La lectura de un lenguaje de programación es realizada por un analizador. Proporciona una estructura de datos al compilador, con la que se puede generar el código máquina o bytecode.
Se trata de un programa elaborado con Neobook para ayudar a realizar análisis sintácticos.
Hacer análisis sintácticos es una tarea escolar en el área de Lengua castellana y Literatura que muy a menudo genera ansiedad en muchos estudiantes.
GENERADORES DE ANALIZADORES SINTÁCTICOS
CONCEPTO
Es un programa informático que analiza una cadena de símbolos de acuerdo a las reglas de una gramática formal.Dentro de un compilador su función es transformar una entrada en un árbol de derivación.
TIPOS
ASCENDENTES
Consiste en construir el árbol sintáctico desde abajo hacia arriba.
Desde los tokens hacia el axioma inicial.
Disminuye el número de reglas mal aplicadas.
EJEMPLOS: YACC, BISON, AYACC, BYACC, PCYACC, LEMON, CUP
DESCENDENTES
Se construye el árbol de arriba hacia abajo.
Construcciones de derivaciones por la izquierda de una sentencia o enunciado.
Se utiliza más reglas.
Se utiliza más reglas.
Subtopic
GRAMÁTICA
Tipo de analizador
Descendente
LL (K)
Código Generado
C#
JAVA
Características
Soporte para depurar las gramáticas sin necesidad de generar el analizador
Genera código legible y comentado
Mensajes de error detallados durante el análisis
GOLD
Tipo de analizador
Ascendente
LALR(1)
Código Generado
Multilenguaje
Características
Incluye análisis léxico
El código fuente está disponible también en numerosos lenguajes.
Funcionamiento
El fichero xxxx.tab.c contiene las tablas del analizador y la función int yyparse(void).
yyparse() simula el analizador LALR(1)
Devolverá 0 si el análisis tuvo éxito y 1 si el análisis falló
Deberá de ser llamada desde el código del usuario.