ANÁLISIS SINTÁCTICO
(Martínez López, F. (2015). Teoría, diseño e implementación de compiladores de Lenguajes. RA-MA Editorial. https://elibro.net/es/lc/uguayaquil/titulos/106460)
Concepto
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 valido, suministra el árbol sintactico que lo reconoce.
El analisis sintáctico es un analisis a nivel de sentencias y es mucho mas complejo que el analisis léxico
Funcionamiento
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
Se realizan durante la compilación del programa
Identificar cada tipo de instrucción y sus componentes
Aquellas que el compilador incorpora al programa traducido
Hacen referencia a aspectos que solo pueden ser conocidos en tiempos de ejecución
Ejemplos: Componentes de tipos, unicidad de etiquetas e identificadores
Validar las declaraciones de identificadores
En muchos lenguajes no se pueden usar una variable si no ha sido declarada con anterioridad
Informar de los errores sintácticos de forma precisa y significativa.
Completar la tabla de simbolos
Construir el árbol de análisis sintáctico que define la estructura jerárquica de un programa
Obtiene la serie de derivaciones para generar la cadena de componentes léxicos.
El árbol sintáctico se utilizará como representación intermedia en la generación de código.
Aplicativos
Los analizadores especiales de XML son responsables del análisis de los documentos XML y preparan la información contenida en ellos para su uso posterior.
Los analizadores de URI descomponen esquemas complejos tales como URLs en su estructura jerárquica.
Los motores de búsqueda como Google extraen (analizan) texto relevante para ellos de las páginas web descargadas con rastreadores. Se procesan y los datos analizados se pueden utilizar para la navegación.
MANEJO DE ERRORES
(Martínez López, F. (2015). Teoría, diseño e implementación de compiladores de Lenguajes. RA-MA Editorial. https://elibro.net/es/lc/uguayaquil/titulos/106460)
DEFINICIÓN
Es un modulo en la fase del compilador que recepta los errores encontrados en las distintas fases del analizador y muestra un mensaje con el error respectivo.
FUNCIONAMIENTO
Indicar los errores de forma clara y precisa
Aclarar el tipo de error y su localización.
Intercepta todos los errores para presentarlos en un mensaje al final de la compilación.
Recuperarse del error, para poder seguir examinando la entrada.
Existen MÉTODOS tales:
1. IGNORAR EL PROBLEMA
Consiste en ignorar el resto de la entrada hasta llegar a una condición de seguridad (";" o "END").
2. RECUPERACIÓN A NIVEL DE FRASE
Intenta recuperar el error una vez descubierto
3. CORRECCIÓN GLOBAL
Se da una vez culminada la secuencia completa de reconocimiento de tokens
Si existe un error que no puede reconocer, encuentra otra secuencia completa más parecida para que pueda reconocer.
4. PRODUCCIÓNES DE ERRORES
La gramática se aumenta con respecto a los errores más comunes.
No ralentizar significativamente la compilación.
Simplificar la estructura del compilador
Mejorar la respuesta ante los errores.
APLICATIVOS
Los diferentes lenguajes de programación (JAVA, C#, etc) posee compiladores que son capaces de detectar errores que facilitan al programador saber en que se confundió y como solucionar dicho problema.
Aplicado dentro del mismo campo, los lenguajes de programación tales como JAVA te señalan desde un principio los errores cometido a nivel semántico permitiendo corregir dichos errores antes de su compilación.
DISEÑO DE GRAMÁTICAS
(Martínez López, F. (2015). Teoría, diseño e implementación de compiladores de Lenguajes. RA-MA Editorial. https://elibro.net/es/lc/uguayaquil/titulos/106460)
GRÁMATICA DE CONTEXTO LIBRE
Una GLC viene dada por la cuádrupla (N,T,P,S)
NO TERMINALES (N)
TERMINALES (T)
REGLAS DE PRODUCCIÓN (P)
AXIOMA INICIAL (S)
DERIVACIONES
Concepto
Es la que considera una producción como una regla de reescritura donde el no terminal de la izquierda es sustituido por la cadena del lado derecho de la producción
Tipos
Derivación más a la izquierda.
Se sustituye en cada paso la variable más a la izquierda de la forma de frase.
Derivación más a la derecha
Se sustituye en cada paso la variable más a la derecha de la forma de frase.
Arboles de derivación
Cada nodo tiene una etiqueta que es un símbolo.
La raiz se etiqueta con S
Si un nodo tiene etiqueta E entonces es una hoja y es hijo único.
AMBIGÜEDAD
Definición
Una gramática es ambigua si el lenguaje que define contiene alguna cadena que tenga más de un árbol de derivación para esa gramática.
Eliminación de la ambigüedad
Agruparemos todos los operadores de igual precedencia en grupos y asociaremos a cada uno una regla, de forma que los que tengan menor precedencia aparezcan más cercanos al símbolo de inicio (precedencia en cascada).
TIPOS DE GRAMÁTICA
Gramática LL(1)
L: Significa que la entrada se lee de izquierda a derecha
L: Significa que las derivaciones en el árbol se hacen de izquierda a derecha
El (1) indica la cantidad de símbolos de entrada que se deben conocer antes del análisis.
Gramática LR (0)
La variable inicial no aparece a la derecha de ninguna producción.
GENERADORES DE ANALIZADORES SINTÁCTICOS
https://prezi.com/wh1nkcp-xdbj/69-generadores-de-analizadores-sintacticos/
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.
EJEMPLOS: JAVA CC, ANTLR, LLGen, COCO/R
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.