Categorieën: Alle - análisis - generador - árbol - funcionamiento

door ITG ITG 4 jaren geleden

701

Análisis Sintactico

El análisis sintáctico se centra en la verificación de cadenas de tokens generadas por un analizador léxico, asegurando que estas cadenas puedan ser producidas por la gramática del lenguaje fuente.

Análisis Sintactico

Análisis Sintactico

DISEÑO DE GRAMATICAS

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
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-> Є
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.
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.
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.

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
https://drive.google.com/drive/folders/1TobN64bITA73F8L1JuThitJZEnoI8lrU
• 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.

Funcionamiento

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.
Su principal función es analizar la secuencia de componentes léxicos de la entrada para verificar que cumplen con las reglas gramaticales especificadas.

Generador de Análisis Sintactico (GDANL)

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.
Análizador Sintactico Yacc
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.

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.

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.
Tipos
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.
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 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.
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.

Manejo de Errores

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.
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”.
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.
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.
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.
Considerar desde el principio el manejo de errores puede simplificar la estructura de un compilador y mejorar su respuesta a los 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.
Es sorprendente que aunque los errores sean tan frecuentes, pocos lenguajes han sido diseñados teniendo en cuenta el 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.

Aplicativos que lo usan

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.
Bison es una herramienta generadora de analisis sintactico de proposito general se suele usar generalmente acompañado de Flex.

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.

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