Análisis Sintactico
Definición
Es aquel que obtiene una cadena de tokens del analizador lexicográfico y verifica que esta cadena puede ser generada por la gramática del lenguaje fuente. Como resultado de este proceso se genera, de una forma explícita o implícita, un Árbol de análisis
Principales Funciones
• Recibir los componentes léxicos y producir como salida una representación
del árbol sintáctico que reconoce la entrada de acuerdo a la gramática
especificada.
• Interactuar con la Tabla de Símbolos. Una estructura que mantiene todos
los símbolos presentes en la entrada.
• Chequear que los tipos de datos están asignados correctamente para evitar
la pérdida de información o los errores semánticos.
• Generar un Código Intermedio, ya sea para una máquina virtual o real, que
permita la ejecución o interpretación de la entrada.
• Informar de los errores encontrados en la entrada.
Aplicativos que lo usan
Bison es una herramienta generadora de analisis sintactico de proposito general se suele usar generalmente acompañado de Flex.
Flex es un generador de analizador léxico rápido. Es una herramienta para generar programas que realizan una coincidencia de patrones en el texto. Hay muchas aplicaciones para Flex, incluida la escritura de compiladores junto con GNU Bison. Flex es una implementación gratuita del conocido programa Lex. Cuenta con un modo de compatibilidad Lex y también proporciona varias características nuevas, como condiciones de arranque exclusivas.
Manejo de Errores
Si un compilador tuviera que procesar sólo programas correctos, su diseño e implantación se simplificarían mucho. Pero los programadores a menudo escriben programas incorrectos, y un buen compilador debería ayudar al programador a identificar y localizar errores.
Es sorprendente que aunque los errores sean tan frecuentes, pocos lenguajes han sido diseñados teniendo en cuenta el manejo de errores.
La mayoría de las especificaciones de los lenguajes de programación no describen cómo debe responder un compilador a los errores; la respuesta se deja al diseñador del compilador.
Considerar desde el principio el manejo de errores puede simplificar la estructura de un compilador y mejorar su respuesta a los errores.
Considerar desde el principio el manejo de errores puede simplificar la estructura de un compilador y mejorar su respuesta a los errores.
Una razón es que muchos errores son de naturaleza sintáctica o se manifiestan cuando la cadena de componentes léxicos que proviene del analizador léxico desobedece las reglas gramaticales que definen al lenguaje de programación.
La detección exacta de la presencia de errores semánticos y lógicos en el momento de la compilación es mucho más dificil.
El manejo de errores en un analizador sintáctico tiene objetivos que son simples de declarar,
pero difíciles de llevar a cabo:
• Reportar la presencia de errores con claridad y precisión.
• Recuperarse de cada error lo bastante rápido como para poder detectar los errores siguientes.
• Agregar una sobrecarga mínima al procesamiento de los programas correctos.
Estrategias para recuperarse de los errores
-El método más simple es que el analizador sintáctico termine con un mensaje de error informativo cuando detecte el primer error.
-Si los errores se apilan, es mejor para el compilador desistir después de exceder cierto límite de errores, que producir una molesta avalancha de errores “falsos”.
Estrategias para recuperarse de los errores
_Recuperación en modo de pánico
Con este método, al describir un error el analizador sintáctico descarta los símbolos de entrada,uno a la vez, hasta encontrar un conjunto designado de tokens de sincronización.
_Recuperación a nivel de frase
Al descubrir un error, un analizador sintáctico puede realizar una corrección local sobre la entrada restante; es decir, puede sustituir un prefijo de la entrada restante por alguna cadena que le permita continuar.
_Producciones de errores
Al anticipar los errores comunes que podríamos encontrar, podemos aumentar la gramática para el lenguaje, con producciones que generen las construcciones erróneas.
_Corrección global
Lo ideal sería que un compilador hiciera la menor cantidad de cambios en el procesamiento de una cadena de entrada incorrecta.
Generador de Análisis Sintactico (GDANL)
DEFINICIÓN: Es un software especializado que guarda todos los conceptos del análisis sintáctico y lo aplica a proyectos de la vida real, cada analizador sintáctico puede variar ligeramente de acuerdo a las especificaciones del fabricante.
Tipos
GDANL de izquierda a derecha (LALR) es una herramienta de software que lee una gramática BNF y crea un analizador LALR que es capaz de analizar archivos escritos en el lenguaje informático definido por la gramática BNF. Los analizadores sintácticos LALR son deseables porque son muy rápidos y pequeños en comparación con otros tipos de analizadores sintácticos.
GDANL GLR (GLR significa "LR generalizado", donde L significa "de izquierda a derecha" y R significa "más a la derecha (derivación)") es una extensión de un algoritmo de analizador LR para manejar gramáticas ambiguas y no deterministas .
GDANL Simple SLR es un tipo de analizador sintáctico LR con pequeñas tablas de análisis sintáctico y un algoritmo generador de analizador sintáctico relativamente simple.
Análizador Sintactico Yacc
Programa que toma como su entrada una especificación de la sintaxis de un lenguaje en alguna forma, y produce como su salida un procedimiento de análisis sintáctico para ese lenguaje.
Caracteristicas
-Se puede integrar con Lex dejando a éste el análisis léxico. -La precedencia se puede definir al margen de la gramática, manteniendo ésta más simple.
-Conjuntamente con Memphis se puede construir un árbol sintáctico como salida del analizador.
Gramatica
Codigo generado: C#, Java.
Características adicionales:
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).
Código generado: Multilenguaje (Java, C#, ANSI C, Delphi, Python, VB, VB .NET, VC++, wxWidgets, todos los lenguajes .NET, todos los lenguajes ActiveX)
Características adicionales:
Incluye análisis léxico.
El código fuente está disponible también en numerosos lenguajes.
Funcionamiento
Su principal función es analizar la secuencia de componentes léxicos de la entrada para verificar que cumplen con las reglas gramaticales especificadas.
Esta interacción se aplica bajo un esquema donde el analizador léxico es una subrutina del analizador sintáctico. Recibida la orden “obtén el siguiente componente léxico” del analizador sintáctico, el analizador léxico lee los caracteres de entrada hasta que pueda identificar el siguiente componente léxico.
Caracteristicas
• La división entre análisis léxico y análisis sintáctico es, hasta cierto punto, arbitraria. •Las construcciones lexicográficas no necesitan recursividad mientras que las construcciones sintácticas sí que suelen hacerlo.
Enlace al video y el ejercicio del generador
Aquí se encuentra: -El ejercicio del generador -Word de una explicacion breve del ejercico -El video de 10min y su link de youtube
DISEÑO DE GRAMATICAS
Una gramática libre de contexto tiene cuatro componentes:
1. Un conjunto de símbolos terminales, a los que algunas veces se les conoce como “tokens”.
Los terminales son los símbolos elementales del lenguaje definido por la gramática.
2. Un conjunto de no terminales, a las que algunas veces se les conoce como “variables
sintácticas”. Cada no terminal representa un conjunto de cadenas o terminales, de una forma que describiremos más adelante.
3. Un conjunto de producciones, en donde cada producción consiste en un no terminal, llamada encabezado o lado izquierdo de la producción, una flecha y una secuencia de terminales y no terminales, llamada cuerpo o lado derecho de la producción.
4. Una designación de una de los no terminales como el símbolo inicial.
Para especificar las gramáticas presentamos sus producciones, en donde primero se listan
las producciones para el símbolo inicial. Suponemos que los dígitos, los signos como < y <=,
y las cadenas en negritas como while son terminales.
Escritura de una Gramática
Las gramáticas son capaces de describir la mayoría, pero no todas, de las sintaxis de los lenguajes de programación.
Expresiones regulares, o gramáticas independientes del contexto
Toda construcción que se pueda describir mediante una expresión regular también se puede describir por medio de una gramática. Por ejemplo, la expresión regular (a|b)*abb y la gramática
A0 -> αA0 | bA0 | αA1
A1 -> bA2
A2-> bA3
A3-> Є
Supresión de la ambigüedad
A veces, una gramática ambigua se puede reescribir para eliminar la ambigüedad. Como ejemplo, se eliminará la ambigüedad de la siguiente gramática con "else ambiguo”
prop ->if expr then prop
| if expr then prop else prop (1)
| otra
Aquí, otra representa cualquier otra proposición. De acuerdo con esta gramática la proposición condicional compuesta
if E1 then S1 else if E2 then S2 else S3