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.

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.