Procesadores de lenguajes Proyecto: Generador Lenguaje M
Enviado por Práctica Distribuidos • 30 de Noviembre de 2017 • Trabajo • 4.457 Palabras (18 Páginas) • 244 Visitas
PROCESADORES DE LENGUAJES
Proyecto: Generador Lenguaje M | |
Palabras clave: Matlab, Gramática, Análisis Léxico, Análisis Semántico, Recuperación de errores, Generación de código, Análisis Sintáctico |
Objetivo general.
Realizar un proyecto integrador de los temas vistos en clase, aplicando la teoría de procesadores de lenguajes.
Diseñar y codificar una solución, utilizando un enfoque orientado a objetos, para las diferentes fases de la compilación, partiendo de la especificación de una gramática independiente del contexto incluyendo acciones semánticas, léxicas y sintácticas.
Introducción
El objetivo del proyecto es implementar un programa que, a partir de un código propio, generar un código equivalente en el lenguaje “m” y guardarlo en un archivo con la extensión correspondiente. El archivo generado es capaz de ejecutarse directamente en MATLAB.
El programa se limita a generar un archivo.m de los comandos especificados por nuestro lenguaje:
Las matrices pueden ser declaradas de la siguiente forma, especificando su dimensión:
A = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]; // Se construye con los elementos
Las operaciones deben de tener la forma:
A = operación (M0, … , Mn); // Se crea la matriz resultante de una operación de matrices
Se pueden modificar o acceder a elementos de las matrices de la siguiente manera
A[2,4] = 5; // modificar elemento en fila 2 renglón 4, iniciando desde 0 como en lenguaje C
Se podrán incluir las funciones de control: if-else, for y while.
Se podrán llamar funciones predefinidas de Computer Vision.
Además de operaciones con matrices, se podrán hacer operaciones con números enteros y flotantes y guardarlos en variables para poder ser utilizadas posteriormente.
Se podrá hacer la definición de funciones, las cuales contarán con los inputs (parámetros) y outputs (return).
El programa no ejecutará las operaciones, solo realizará el análisis de los comandos de entrada y los traducirá a lenguaje M, el cual podrá ser ejecutado en Matlab.
Diagrama:
[pic 1]
Análisis léxico
Lista de Tokens con sus expresiones regulares:
- IN: "in"
- OUT: "out"
- FUNC: "func"
- WHILE: "while"
- FOR: "for"
- UNTIL: "until"
- ELSE_IF: "else if"
- ELSE: "else"
- IF: "if"
- RESERVED_TOKEN: “{“ | “}” | “[“ | “]” | “==” | “=” | “,” | “(“ | “)” | “;” | “<=” | “<” | “>=” | “>” | “!=” | “!” | “-” | “*” | “/” | “+” | “'”
- STRING: "'".*"'"
- NUMBER: 0 | "-"?[0-9][0-9]*("."[0-9][0-9]*)?
- ID: [A-Za-z_][A-Za-z_0-9]*
- ERROR: .
- Se ignora cualquier espacio o termino de línea con: [\r|\n|\r\n] | [ \t\f]
Nota: La clase Error actua con cualquier caracter/cadena ajena al lenguaje.
Ejemplos:
Análisis sintáctico:
Método:
Para el análisis sintáctico se utilizó el método de análisis ascendente visto en clase:
[pic 2]
Es un algoritmo con 4 acciones:
Goto, Reduce, Shift y Accept.
Lo primero que se realizó fue estructurar el cómo recibiríamos la entrada en un archivo de texto, ya que la entrada sería la gramática, los no terminales, los terminales, las clases de tokens, la tabla SLR1 y las entradas a comprobar. Decidimos hacer esto en donde cada una de los puntos anteriores estarían separados por una línea de uno o más ‘#’. Cada una de los puntos estarían separados por un ‘enter’, por ejemplo, para la gramática, cada producción estaría en cada línea (S → A, S → B, etc.) Cada no terminal, estaría separado por ‘enter’ de igual forma (en una línea el no terminal S, en otra A, etc.); así sucesivamente con todas las entradas. Luego se definió que cada línea de las entradas que contuvieran más de un elemento, por ejemplo, las clases de tokens o la tabla SLR1, cada uno de estos elementos estaría separado por comas ‘,’ sin espacios. En este caso, la tabla SLR estaría compuesta por el número de estado, seguido de una “,”, la columna de la tabla, seguido de una “,”, una letra que corresponde a la acción a realizar (s = shift, r = reduce, g = goto, a = aceptar), seguido de una “,” y el estado al que le corresponde dicha acción.
Una vez definido todo esto, se realizó a mano el desarrollo de las actividades correspondientes a la práctica para poder pasarlo al archivo txt.
Lo que se hace en la implementación Java es primero leer el archivo txt, cada vez que nos encontramos con uno o más ‘#’ se hace el llenado de una estructura de datos correspondiente a la entrada (tokens, no terminales, etc.). Para identificar las entradas que contenían más de un elemento (como la tabla SLR1) se realiza un Split de las comas (“,”) encontradas en la línea para poder asignarla a su parte correspondiente.
...