Download Descargar
Document related concepts
no text concepts found
Transcript
INSTITUTO TECNOLÓGICO DE TEPIC Lenguajes y Autómatas I Grupo 5A 8:00-9:00 AM M. D. O. H. Sonia Alvarado Mares “Manual técnico análisis léxico” Integrantes: Bueno Rojas Mariela 12400247 Especiano Parada Ernesto Antonio 12400260 Lamas Bernal César Ricardo 12400276 Tepic, Nayarit a 03 de mayo de 2016 Contenido Introducción..................................................................................................................................... 3 Análisis léxico ................................................................................................................................. 3 Herramientas de software ........................................................................................................ 3 Lenguaje de desarrollo del compilador: Java ................................................................ 3 JFLEX ........................................................................................................................................ 4 Tablas de símbolos .................................................................................................................... 5 Tablas Estáticas...................................................................................................................... 5 Tabla dinámica ........................................................................................................................ 7 Expresiones regulares .............................................................................................................. 8 Manejador de errores .............................................................................................................. 14 Introducción El presente manual técnico tiene como finalidad proporcionar al lector la lógica con la que se ha desarrollado el compilador del lenguaje G+. De esta manera, se presenta una guía práctica y confiable basada en la normalización y estandarización de los procedimientos y criterios para la elaboración de este compilador. Este manual no pretende ser un curso de aprendizaje para el entorno de desarrollo, sino documentar el diseño y la aplicación del compilador en general. En esta primera del manual parte describiremos la implementación del análisis léxico, las herramientas utilizadas y cómo fueron empleadas. Análisis léxico Antes de mencionar como se implementó el análisis léxico, cabe mencionar que el compilador se diseñó y programó en el entorno de desarrollo Netbeans, bajo el lenguaje Java utilizando el jdk versión 8.0.1. El análisis léxico por tanto está programado en lenguaje Java y se utilizó la herramienta JFlex para generarlo. En las siguientes secciones se explicará a detalle cómo se utilizó y que otros recursos se usaron para esta etapa de análisis. Herramientas de software Lenguaje de desarrollo del compilador: Java Como lenguaje para desarrollo del compilador G+ se eligió Java ya que cuenta con una gran flexibilidad para la creación de software y no es solamente un lenguaje de programación, si un conjunto de tecnologías basadas en el mismo lenguaje. A continuación, se describen otras ventajas de Java, que fueron también incentivo para decidirnos por este lenguaje: Facilidad de lectura de código, hace que sea más fácil de entender que otros lenguajes. Brinda una gran variedad de herramientas, que facilita las tareas al programador. Multiplataforma por lo que se puede ejecutar la aplicación en cualquier SO, basta con tener la máquina virtual de Java. Cuenta con una alta comunidad de usuarios que brindan mucha información en sitios web, foros y manuales. El compilador y los entornos de desarrollo son gratuitos. JFLEX Para generar el analizador léxico se eligió la herramienta JFlex que es un generador de léxico analizador para el lenguaje de programación Java, escrito en Java. Dicha herramienta toma como entrada una especificación de un conjunto de expresiones regulares y acciones correspondientes. Genera un programa (un analizador léxico) que lee la entrada, compara la entrada en contra de las expresiones regulares en el archivo de especificaciones, y se ejecuta la acción correspondiente si una expresión regular coincide. Los analizadores Léxicos JFlex se basan en autómatas finitos deterministas (DFA). Cuando se meta compila el documento flex genera un autómata finito no determinista, lo convierte a un determinista y finalmente lo minimiza. El formato de un documento flex es el siguiente: Área de código, importaciones y paquete %% Área de opciones y declaraciones %% Área de reglas La primera de estas áreas se encuentra destinada a la importación de los paquetes que se vayan a utilizar en las acciones regulares situadas al lado de cada patrón en la zona de reglas. Aquí también puede indicarse una cláusula package para los ficheros .java generados por el meta-analizador. En general, cualquier cosa que se escriba en esta área se trasladará tal cual al fichero .java generado por JFlex., por lo que también sirve para escribir clases completas e interfaces. El área de opciones y declaraciones permite indicar a JFlex una serie de opciones para adaptar el fichero .java resultante de la meta-compilación y que será el que implemente nuestro analizador lexicográfico en Java. También permite asociar un identificador de usuario a los patrones más utilizados en el área de reglas. En el área de reglas se definen los patrones de los lexemas que se quieren buscar a la entrada, y al lado de tales expresiones regulares. Tablas de símbolos Tablas Estáticas Tabla estática de palabras reservadas Tabla estática que contiene todas las palabras reservadas dentro del lenguaje G+. Esta incluye la palabra, acompañada de su categoría. La categoría nos permite identificar a qué grupo pertenece la palabra, además de apoyar a todas las etapas de compilación y hacer búsquedas más eficientes. LEXEMA ABSTACTION AFFABILITY ARRAYSTRING APPREHENSION ANXIETY BOOLEAN BUILD CARETOSTANDARDS DARE DOMINANCE ELSE CATEGORIA FEAT FEAT DAT_STR FEAT FEAT DAT_TYP FUNC FEAT FEAT FEAT CON_STR FALSE FEATURES GENERATEGROUP GETFEATURES GROUP HARDNESS IF INDEPENDENCE INT LIVELINESS LOOP MAIN MAX MIN NEW NODE OPENNESSTOCHANG E PERFECTIONISM PRINTGRAPH PRINTLN PRIVACY READFEATVAL READSTRING REASONING SELFCONTROL SELFSUFFICIENCY SENSIVILITY SOCIABILITY STABILITY STRESS STRING SURVEILLANCE TRUE BOOL DAT_STR OUT_STR FUNC GROUP FEAT CON_STR FEAT FAT_TYP FEAT CON_STR FUNC MAX MIN NEW DAT_STR FEAT FEAT OUT_STR OUT_STR FEAT IN_STR IN_STR FEAT FEAT FEAT FEAT FEAT FEA FEAT DAT_TYP FEAT BOOL Para implementar esta tabla estática creamos una estructura de datos que consiste en un arreglo dinámico bidimensional. Tabla de símbolos estática de operadores Tabla estática que contiene todos los operadores lógicos, aritméticos y relacionales del lenguaje G+. Esta tabla contiene los signos con los que se identifica cada operador y contiene la categoría a la que pertenece. El apartado de categoría nos permite identificar el tipo de operador al que pertenece ya sea lógico,aritmético o relacional. LEXEMA + = () == < > <= >= != && | CATEGORÍA ARIT_OP ASSIG_OP PUNC_SIGN REL_OP REL_OP REL_OP REL_OP REL_OP REL_OP LOG_OP LOG_OP Para implementar esta tabla estática creamos una estructura de datos que consiste en un arreglo dinámico bidimensional. Tabla estática de signos de puntuación Tabla estática que contiene todos los signos de puntuación del lenguaje G+. Esta tabla contiene los signos con los que se identifica cada signo de puntuación y contiene la categoría a la que pertenece. El apartado de categoría nos permite identificar el tipo de signo que es, ya sea COMMA, POINT, EOS, PUNC_ASIG. LEXEMA , . ; “ CATEGORÍA COMMA POINT EOS PUNC_ASIG Para implementar esta tabla estática creamos una estructura de datos que consiste en un arreglo dinámico bidimensional. Tabla dinámica Para almacenar los identificadores obtenidos por el analizador léxico del programa .gp se utiliza una tabla dinámica. En dicha tabla se recupera la información de cada identificador,lo cual incluye: Número: es una clave entera que identifica al identificador. Identificador: es la cadena del identificador tal cual. Tipo: es el tipo de dato del identificador. Valor: es el valor asignado a ese identificador en el programa .gp. Renglón: es el número de renglón en el que se encuentra el identificador en el programa .gp. Columna: es el número de columna en la que se encuentra el identificador en el programa .gp. A continuación, se muestra una representación gráfica de la tabla de símbolos de identificadores. NÚMERO IDENTIFICADOR TIPO VALOR RENGLÓN COLUMNA Para la creación de la tabla de símbolos dinámica se utilizó la estructura de datos “hash table”, en el lenguaje Java existe una librería para implementar una Hash Table la cual lleva el mismo nombre, y fue la que utilizamos para programar nuestra tabla. Expresiones regulares Como ya se mencionó anteriormente, se utilizó la herramienta JFlex para generar el analizador léxico. En el programa Flex se utilizaron expresiones regulares tanto en el área de opciones y declaraciones como en el área de reglas. En el área de opciones y declaraciones se especificaron algunos patrones mediante expresiones regulares, ya que de esta forma es más fácil formar expresiones regulares más complejas que se mandan llamar en el área de reglas y que JFlex utiliza para encontrar los tokens. Estas declaraciones de patrones también pueden ser llamadas definiciones regulares. A continuación, se muestran las expresiones y definiciones regulares utilizadas para validar cada cadena a encontrar en el lenguaje: Palabras reservadas Para validar las palabras reservadas se pusieron las palabras tal cual delimitadas entre comillas dobles. Ejemplo: “INT” “NODE” “”IF” … “GROUP” De manera que cuando se encuentran cadenas con ese patrón se recupera el token, cuyo componente léxico es “RES_WORD” (palabra reservada). Las palabras reservadas son: ABSTRACTION, ANXIETY, AFFABILITY, BOOLEAN, DOMINANCE, GETFEATURES, ELSE, ARRAYSTRING, BUILD, FALSE, APPREHENSION, CARETOSTANDARDS, FEATURES, GETSIMILITUDE, GROUP, DARE, GENERATEGROUP, HARDNESS, IF, INDEPENDENCE, INT, LIVELINESS, LOOP, MAIN, MAX, MIN, NEW, NODE, OPENNESSTOCHANGE, PRINTLN, PRIVACY, SELFCONTROL, PERFECTIONISM, READFEATVAL, SELFSUFFICIENCY, PRINTGRAPH, READSTRING, REASONING, SENSITIVITY, SOCIABILITY, STABILITY, STRESS, STRING, SURVEILLANCE, TRUE. Comentarios de una línea Para validar los comentarios de una línea se utilizan las siguientes definiciones regulares: COMENT="--"({ALPHANUMERIC}|{BLANK})+|"--" Donde: ALPHANUMERIC={LET}|{DIG} BLANK=[ ] LET=[A-Z] DIG=[0-9] COMENTS="--"([¨*+"[""]"{}'´·!-&¡Ñ\¿?"<"">"¡#$%&/()=°¬"|"\^]|[09]|Ä|Ë|Ï|Ö|Ü|[A-Z]|Á|É|Í|Ó|Ú|Ý|{BLANK})+ Donde: BLANK=[ ] Los comentarios de una línea son ignorados por el analizador. Comentarios de varias líneas Para validar los comentarios de varias líneas se utiliza la siguiente expresión regular: COMENTARIOS= "/*"~"*/" Los comentarios de varias líneas son ignorados por el analizador. Cadenas Para validar las cadenas se utilizó la siguiente definición regular: STRING=("\"" ({LET}|{NUM}|{BLANK})* "\"") Donde: LET=[A-Z] NUM=({DIG})+ BLANK=[ ] Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “STRING” (palabra reservada). Espacio en blanco, tabuladores, retorno de carro y salto de línea. Se utilizó la siguiente expresión regular para encontrar cadenas que tuvieran un espacio en blanco, o un tabulador, o un retorno de carro o un salto de línea: IGNORE=[ \t\r\n] Estas cadenas son ignoradas por el analizador. Identificadores Para validar identificadores se utilizó la siguiente definición regular: ID={LET}({ALPHANUMERIC})* Donde: LET=[A-Z] DIG=[0-9] ALPHANUMERIC={LET}|{DIG} Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “ID” (palabra reservada) y desde otra clase lo tomamos e insertamos en la tabla de símbolos. Números enteros Para validar los números enteros (único tipo de número en nuestro lenguaje) se utilizó la siguiente definición regular: NUM=({DIG})+ Donde: DIG=[0-9] Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “INT” (palabra reservada). Operadores relacionales Para validar los operadores relacionales se especificaron tal cual, encerrados entre comillas dobles, de la siguiente manera: “==” “<=” “>=” “<” “>” “!=” Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “REL_OP” (palabra reservada). Operador aritmético Para validar el operador aritmético se especificó tal cual, encerrado entre comillas dobles, de la siguiente manera: “+” Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “ARIT_OP” (palabra reservada). Operador de asignación Para validar el operador de asignación se especificó tal cual, encerrado entre comillas dobles, de la siguiente manera: “=” Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “ASSIG_OP” (palabra reservada). Signos de agrupación Para validar los signos de agrupación se especificaron tal cual, encerrados entre comillas dobles, de la siguiente manera: “(” “)” “{” “}” Excepto los corchetes, que se especifican de la siguiente forma: \[ \] Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “PUNC_SIGN” (palabra reservada). Operadores lógicos Para validar los operadores lógicos se especificaron tal cual, encerrados entre comillas dobles, de la siguiente manera: “&&” “|” Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “LOG_OP” (palabra reservada). Signos de puntuación Para validar los signos de puntuación se especificaron tal cual, encerrados entre comillas dobles, de la siguiente manera: “;” “.” “,” Cuando se encuentran cadenas con este patrón se recupera el token, cuyo componente léxico es “PUNC_SIGN” (palabra reservada). Cadenas no válidas Para validar cadenas que no son válidas se utilizaron las siguientes expresiones: [^] NO={NUM}{ID} Donde: NUM=({DIG})+ ID={LET}({ALPHANUMERIC})* ALPHANUMERIC={LET}|{DIG} LET=[A-Z] DIG=[0-9] Cuando se encuentran cadenas con este patrón se recupera la cadena, número de línea, columna y tipo de error y se inserta en el manejador de errores, el cual se encarga a su vez de desplegar el mensaje de error. Manejador de errores El manejador de errores en Gcompiler se implementó con una estructura de datos basada en un arreglo dinámico de dos dimensiones. La primera dimensión del arreglo consta de un tipo de datos error en donde se almacena la información concerniente al error, como el tipo, cadena, línea y columna. La segunda dimensión del arreglo guarda cada uno de los errores. El manejador de errores además cuenta con métodos para recuperar los errores y desplegarlos.