Sunday, August 27, 2017

Proyecto Analisis Semantico para Java (Flex-Bison)




Proyecto de Autómatas y Compiladores





Introducción:
El programa a presentar tiene el conjunto de diferentes tipos de análisis visto en todo el curso de Autómatas y Compiladores; para esto se debe tener en cuenta ciertos conocimientos sobre lo que es un compilador que sera el encargado de traducir el lenguaje que ingresemos, cada tipo de análisis que se hace Código fuente que el compilador interpreta gracias maquina virtual y la maquina destino que cada una posee entre otros conceptos que irán acompañados con un ejemplo en C ++ el cual es trabajado con, Flex y Bison, que son dos herramientas para el análisis léxico y sintáctico respectivamente. 

Compilador:

La memoria posee un programa que se encarga en traducir el Código Fuente de un lenguaje respectivo que se ingrese y transformarlo a un Código Objeto. Puede ser código binario o código maquina, para esto se traduce cada instrucción que se aya ingresado y después enviarla a la memoria RAM para almacenarla en forma de una secuencia.
Habido ejecutado el compilador se puede repetir el proceso cuantas veces se desea aunque en caso se presente un problema se tendrá que corregir el código fuente y volverse a compilar.


Modelos de la Compilación:

Existen dos partes dentro de la compilación:


  • Análisis:
Esta se encarga en dividir al programa fuente en sus elementos que lo componen y crea un representa intermedia del programa fuente que permite al compilador tener acceso a diferentes lenguajes fuentes, esta conformado por el análisis Léxico, Sintáctico y Semántico ademas que con esta se podrá conocer las operaciones que en lenguaje fuente va a realizar y armar el árbol Sintáctico ( un tipo de estructura jerárquica).   


  • Síntesis:
Esta parte muestra las salidos de nuestro código que se ingreso como lenguaje objeto, para esta parte se necesita mas técnicas para las fases de generación de código intermedio, generador de código objeto y optimizan de código por temas de direccionamiento de memoria entre otros.

Representación de etapas del compilador y sub-partes

Análisis Léxico o Lineal (Scanner): 

Es la primera fase del compilador donde descompone y lee carácter por carácter para después agruparlos de forma que tengan un significado y sigan una secuencias especifica para los componentes léxicos ( tokens ), poder identificarlos y clasificaros para poder pasarlos a la siguiente fase que es el analizador sintáctico; en caso que identifique un error se daría por un símbolo que no se encuentre en el lenguaje o en un componente léxico.

Funciones del A. Léxico:
  • Leer carácter por carácter de la cadena de entrada
  • Manejar el archivo fuente (abrirlo, leer sus caracteres y cerrarlo)
  • Eliminar comentarios y espacios en blanco (espacios, tabuladores y fin de línea)
  • Relacionar los mensajes de error con las líneas del programa fuente
  • Introducir los identificadores en la tabla de símbolos
  • Reconocer los identificadores, palabras clave, constantes 
  • Contabilizar el número de líneas y columnas para emitir mensajes de error


Análisis Sintáctico o Jerárquico (Parser):

Esta parte lleva el control de los procesos y las sub-rutinas de los elementos restantes del compilador.
Los caracteres o componentes léxicos o tokens recibidos por A. Léxico se agrupan en frases gramaticales de forma que tomen un significado para ser interpretados y generar un árbol sintáctico.
Con esto podemos garantizar que solo sentencias que pertenezcan al lenguaje fuente serán procesadas ademas que mostraría los errores en caso que hubiesen.


Función del A. Sintáctico:

  • Recopilar información de distintos componentes léxicos o tokens y reunirlos en una tabla de símbolos para un aproxima utilización en el generador de código.
  • Encontrar un árbol sintáctico o derivación que contenga la cadena analizada ademas que esta debe estar dentro del axioma de la gramática y una sucesión de ordenadas de símbolos.

Manejo de Errores:

Los compiladores presentan diferentes tipos de manejo de errores como léxico, sintáctico, semántico o lógico por lo cual en este caso sintáctico se considera el mas complicado desde la creación del compilador. Gracias a esto para tener un manejado de errores sintáctico se tiene 3 puntos específicos: 


  • Indicar los errores de forma clara y precisa 
  • Aclarar el tipo de error y su localización
  • Recuperarse del error para seguir examinando la entrada
  • No ralentizar la compilación
Para tener un buen manejo de los errores es preciso saber el tipo de gramática que se acepta un analizador sintáctico debido que ayuda a localizar errores de mayor dificultad como la ambigüedad.
Esta gramática depende de la Jerarquía de Chomsky que consta de diferentes tipos de gramática y la propone como una cuádrupla G(N, T, P, S) ademas de incluir a las derivaciones las cuales se encargaran en representar a los arboles sintácticos.

N=No Terminales
T=Terminales
P=Reglas de producción
S=Axioma Inicial

Arboles Sintácticos:

Es la representación gráfica de las derivaciones para llegar a una respuesta especifica


Un árbol sintáctico es una representación compacta del árbol de análisis sintáctico en el que los operadores aparecen como nodos interiores y los operando de un operador son los hijos del nodo para ese operador.