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.