Download - DISEÑO DE COMPILADORES I
-
8/3/2019 DISEO DE COMPILADORES I
1/21
Compiladores Lxico Sintctico- Grupo 3
1
DISEO DE COMPILADORES I
Trabajo Prctico N 1-2
Analizador Lxico y Sintctico
Ao de Cursada: 2011
Fecha de Entrega: 30/09/11
Grupo N: 03
Integrantes: Arguindegui, Juan Mara
Gonzlez, Hctor
Miner, Jernimo
E-Mails: [email protected]
mailto:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected] -
8/3/2019 DISEO DE COMPILADORES I
2/21
Compiladores Lxico Sintctico- Grupo 3
2
INDICE
Contenido
TEMAS ASIGNADOS .................................................................................................... 3INTRODUCCION ............................................................................................................ 4DECISIONES DE DISEO E IMPLEMENTACION - Lxico ...................................... 5DIAGRAMA TRANSICION DE ESTADOS .................................................................. 6DESCRIPCION DE CLASES Y METODOS IMPLEMENTADOS ............................ 10PROCESO DE CONSTRUCCION DEL SINTACTICO .............................................. 12CONSTRUCCION DE LA GRAMATICA .................................................................. 13PRUEBAS LEXICAS SINTACTICAS ......................................................................... 20CONCLUSION .............................................................................................................. 21
-
8/3/2019 DISEO DE COMPILADORES I
3/21
Compiladores Lxico Sintctico- Grupo 3
3
TEMAS ASIGNADOS
Parte I
Constante Doubl Sentencia de iteracin While do Comentario de varias lneas (* *) Cadenas para impresin
Parte II
Estructuras como tipo de datos Agregar el tipo de datos Integer para contemplar estructuras
-
8/3/2019 DISEO DE COMPILADORES I
4/21
Compiladores Lxico Sintctico- Grupo 3
4
INTRODUCCION
El anlisis lxico se encuentra en la primera de las etapas de procesamiento de un
compilador. Esta etapa divide el programa fuente en unidades llamadas tokens.
Un tokenes un conjunto de caracteres con un significado especfico. Este conjunto
de caracteres se denomina lexemao valor lxicodel token. Un token puede ser:
palabras reservadas, operadores, identificadores, constantes, etc. Se utilizan acciones
semnticas para distinguir identificadores de palabras reservadas, retornar errores
lxicos entre otras funciones.
El analizador lxico le entrega al analizador sintctico una tira de tokens formada
por una dupla (tipo de token y lexema), en el caso de que el tipo de token es nico no
se pasa su valor. Adems, reconoce errores y elimina caracteres blancos, tabs, saltos
de lnea, etc. Por otra parte, el analizador lxico genera entradas en la tabla de
smbolospara los identificadores y constantes que encuentra en el cdigo fuente y
devuelve al analizador sintctico el valor del token con una referencia a ese
identificador o constante.
La tabla de smbolos es una estructura de datos que contiene un registro para
cada uno de los identificadores y constantes que posee el programa fuente, contiene
atributos de cada smbolo.
En etapas posteriores al analizador lxico se completan los atributos de cada
smbolo, puede ser necesario generar nuevas entradas a la tabla de smbolos cuando
el mismo nombre se usa para identificar distintos elementos.
La segunda parte del Trabajo tiene por objeto indicar los detalles de diseo e
implementacin de un analizador sintctico.
Para esto se utiliz la herramienta Byacc provista por la ctedra que toma por
entrada una gramtica libre del contexto y retorna un parser implementado en cdigo
Java .La tarea realizada por el parser consiste en pedir tokens al analizador lxico y
verificar que se cumplan las reglas definidas por la gramtica (escritas en BNF),adems de ejecutar las acciones asociadas a dichas reglas.
Nuestro trabajo consisti en definir la gramtica y las acciones asociadas para un
lenguaje reducido provisto por la ctedra que sirvi como entrada al generador de
parser; adems debimos adaptar el analizador lxico transformndolo en una rutina
yylex().
-
8/3/2019 DISEO DE COMPILADORES I
5/21
Compiladores Lxico Sintctico- Grupo 3
5
DECISIONES DE DISEO E IMPLEMENTACION - Lxico
Se considera como error lxico a aquellos identificadores que superan los 12caracteres de largo. La opcin en este caso se trunca el identificador y se
informa por pantalla como warring.En el caso de los identificadores que se generan como parte de una estructura,se contempla la misma tcnica antes y despus del punto.
Las palabras reservadas se almacenan en una estructura independiente (Tablade Palabras Reservadas) a la Tabla de Smbolos. La razn de esta decisin esque de esta manera la bsqueda de palabras reservadas es ms eficiente.Para la implementacin de la Tabla de Palabras Reservadas se utilizo el tipovector propio de la librera estndar de java; dado que las palabras reservadasson fijas, por lo que pueden ser almacenadas en una estructura esttica.
La Tabla de Smbolos fue implementada utilizando el tipo de estructura dealmacenamiento dinmica, ya que el tamao de esta puede variar dependiendodel cdigo de entrada.
Se implementa una clase Smbolo
-
8/3/2019 DISEO DE COMPILADORES I
6/21
Compiladores Lxico Sintctico- Grupo 3
6
DIAGRAMA TRANSICION DE ESTADOS
Identificador
Constante
Asignacin
-
8/3/2019 DISEO DE COMPILADORES I
7/21
Compiladores Lxico Sintctico- Grupo 3
7
Comparaciones
Comentarios
Cadena
-
8/3/2019 DISEO DE COMPILADORES I
8/21
Compiladores Lxico Sintctico- Grupo 3
8
Caracteres Simples e Invlidos
Caracteres Especiales
MATRIZ DE PASAJE
MATRIZ DE FUNCIONES ASOCIADAS
-
8/3/2019 DISEO DE COMPILADORES I
9/21
Compiladores Lxico Sintctico- Grupo 3
9
Nomenclatura de funciones
A01 AccionAcumularA02 AccionRetornarSuma
A03 AccionRetornarRestaA04 AccionRetornarMultiplicacionA05 AccionRetornarDivisionA06 AccionRetornarParentesisCerradoA07 AccionRetornarLlaveAbiertaA08 AccionRetornarLlaveCerradaA09 AccionRetornarComaA10 AccionRetornarPuntoComaA11 AccionIgnorarA12 AccionErrorCaracterInvalidoA13 AccionRetornarEOF
A14 AccionRetornarIdentificadorA15 AccionErrorDoubleEnteroA16 AccionRetornarEnteroA17 AccionRetornarPuntoA18 AccionErrorDoubleExponenteA19 AccionErrorDoubleSignoExponenteA20 AccionErrorAsignacionA21 AccionRetornarAsignacionA22 AccionRetornarMenorA23 AccionRetornarMenorIgualA24 AccionRetornarMayorA25 AccionRetornarMayorIgualA26 AccionErrorIgualA27 AccionRetornarIgualA28 AccionErrorDistintoA29 AccionRetornarDistintoA30 AccionInicioComentarioA31 AccionRetornarParentesisAbiertoA32 AccionWarningComentarioA33 AccionRetornarCadenaA34 AccionErrorCadena
A35 AccionErrorDoublePuntoA36 AccionRetornarDoubleA37 AccionErrorDoubleExponente
-
8/3/2019 DISEO DE COMPILADORES I
10/21
Compiladores Lxico Sintctico- Grupo 3
10
DESCRIPCION DE CLASES Y METODOS IMPLEMENTADOS
Clase < Token >
Descripcin: Utilizada para representar todos los token detectados por el analizadorLxico. Est compuesta por Lexema y el nombre del token.Implementando los mtodos getters y setters de las variables de dicha clase.
Clase < Smbolo >
Descripcin: Utilizada para representar cada uno de los Smbolos de la consideradaTabla de Smbolos. Est compuesta por 3 variables, nombre, valor y contadores dereferencias. Este ltimo se utiliza para negativizar los valores segn reglasgramaticales.
Clase < TablaSimbolo >
Descripcin: Utilizada para incorporar/modificar/eliminar los smbolos detectados atravs de un Vector en su representacin.
Mtodos: agregarSimbolos (permite agregar smbolos una vez detectados por ellxico) y controlar para no repetir smbolos en el mismo y poder manejar el contadorde referencia a dicho smbolo.
- Contiene Smbolo ( para saber si el smbolo ya se encuentra en la tabla)- Eliminar (para eliminar un smbolo de la tabla)- Tratar doubl negativo ( normaliza el numero en el caso de los float, verifica si
ya se encuentra en la TS y tambin si entro por regla sintctica y es negativo lomodifica )
- Imprimir ( enva a la parte grafica el smbolo y as poder mostrarlo)
Clase
Descripcin: Utilizada para tener almacenadas en un vector las palabras reservadasconsideradas en nuestro analizador.
Mtodos: esPalabraReservada (para saber si es una palabra reservada o no)
Interface
Descripcin: Se utiliza para agrupar todas las acciones dependiendo del estado en quese encuentra y del carcter de entrada identificado.
-
8/3/2019 DISEO DE COMPILADORES I
11/21
Compiladores Lxico Sintctico- Grupo 3
11
Mtodo Abstracto: Run, ejecutar la accin determinada dependiendo de quin loimplemente
Clase
Descripcin: Se utiliza para almacenar la una accin determinado y para determinar elestado siguiente.
Mtodos: getters y setters para las variables contenidas, (Accin y prximo estado).
Clase
Descripcin: Es utilizada para almacenar para representar la transicin de estados y lamatriz de acciones asociadas al analizador.
Mtodo: agregar Celda, es por el cual se agregan todas las celdas al seteo inicial.
Clase
Descripcin: Es el encargado de decodificar las entradas de caracteres e indicar lacolumna y fila de la matriz que le corresponde segn la codificacin planteada.Tambin es el encargado de crear el token vacio para iniciar cada token hasta que ellxico nos devuelva uno valido.
Mtodos: ObtenerTokens es la crea el token inicial y retornar despus de aplicar lasfunciones correspondientes a las entradas de caracteres y a los estados por donde seva moviendo.
- Obtener columna- Preguntar por el valor del carcter
Clase
Descripcin: Es la representacin del archivo para con el programa, entregndole uno
por uno los caracteres al analizador lxicoNota de Implementacin: Por cada una de las acciones que se consideran en la matrizde acciones, se crearon las clases correspondiente extendiendo a la interfaz de accin
-
8/3/2019 DISEO DE COMPILADORES I
12/21
Compiladores Lxico Sintctico- Grupo 3
12
PROCESO DE CONSTRUCCION DEL SINTACTICO
La tarea inicial consisti en la adaptacin del analizador lxico de la entrega
anterior, ya que la herramienta byacc llama a una rutina yylex la cual retorna un
nmero entero correspondiente a cada token y nuestro analizador lxico retornaba el
tipo tokens (definido por nosotros). Para poder realizar dicha adaptacin definimos
una funcin comentada que toma como entrada un token y retorna una constante
entera que es lo que espera el parser, Dichas constantes son las que genera la
herramienta byacc al momento de procesar la gramtica.
Por otro lado, para devolver el puntero a la tabla de smbolos redefinimos el tipo de
la variable yylval como puntero al tipo smbolo (definido por nosotros).
Luego comenzamos a construir la gramtica y tratar de contemplar la mayor
cantidad de errores. (Se explica ms abajo en mayor detalle)
-
8/3/2019 DISEO DE COMPILADORES I
13/21
Compiladores Lxico Sintctico- Grupo 3
13
CONSTRUCCION DE LA GRAMATICA
Como primer punto definimos la lista de token que se iban a considerar y as
permitirle a byacc nos genere automticamente todos las constaste para facilitar la
comunicacin entre lxico y sintctico y sin tener que ver que numeracin ASCII le
corresponde a cada token.
Nota: en la definicin (abajo) de gramtica no se muestran los mensaje de error de
salida para hacerla ms legible, pero sin son consideradas en el apartado 8.
DEFINICION
%token PUNTO_COMA INTEGER DOUBLE ESTRUCTURA IDENTIFICADOR
COMA ASIG MAS MENOS MULT DIV NUMERO STRUCT LLAVE_ABRE
LLAVE_CIERRA BEGIN END PARENTESIS_ABRE PARENTESIS_CIERRA MENOR
MAYOR IGUAL MAYOR_IGUAL MENOR_IGUAL DISTINTO IF ELSE WHILE DO
PRINT CADENA
REGLAS
Programa: estructuras declaraciones ejecutables;
Nota = con esto limitamos al programa que primero obligamos a la construccin a
los tipos de datos, en nuestro caso estructuras. Y as poder controlar que cuando
definamos una variable tipiada ver que fue declarado el tipo, de lo contrario producira
un error.
Siguiendo esta la parte de declaraciones de variables.
Y por ltimo las ejecutables, que representan a las sentencias que fueronconsideradas.
Rama de estructuras
estructuras: /* estructura vacas*/ Nota = Se permite sin estructuras definidas
| estructuras estructura ;
estructura: STRUCT IDENTIFICADOR LLAVE_ABRE cuerpo_est LLAVE_CIERRAPUNTO_COMA
-
8/3/2019 DISEO DE COMPILADORES I
14/21
Compiladores Lxico Sintctico- Grupo 3
14
| STRUCT IDENTIFICADOR LLAVE_ABRE cuerpo_est LLAVE_CIERRA
| STRUCT IDENTIFICADOR cuerpo_est LLAVE_CIERRA PUNTO_COMA
| STRUCT IDENTIFICADOR LLAVE_ABRE cuerpo_est PUNTO_COMA
| STRUCT LLAVE_ABRE cuerpo_est PUNTO_COMA
| STRUCT error PUNTO_COMA
| STRUCT error
cuerpo_est: sen_est
| cuerpo_est sen_est;
sen_est: INTEGER IDENTIFICADOR PUNTO_COMA
| IDENTIFICADOR PUNTO_COMA
| error IDENTIFICADOR PUNTO_COMA
| INTEGER error PUNTO_COMA
| INTEGER IDENTIFICADOR error
;
Nota de las estructuras: te permite la construccin recursiva de estructuras, con la
posibilidad de no crear estructuras, a partir de definir la primer regla como vaca.
Como consideracin se puede decir que nuestra definicin correcta de una estructura
debe terminar en ; como cualquier tipo de sentenciaLuego se define el contenido de las sentencias internas de forma recursiva pero
obligando que al menos se defina una variable dentro de la estructura
Y por ltimo la declaracin real de la variable dentro de la estructura es del Tipo
INTEGER en todos los casos, como se nos pidi por enunciado y debe terminar en
punto y coma.
Ramas de declaraciones
declaraciones: /*declaracion vacas*/
| declaraciones declaracion ;
declaracion: tipo lista_variables PUNTO_COMA
| tipo lista_variables error
| tipo error PUNTO_COMA
| lista_variables PUNTO_COMA ;
tipo: INTEGER
-
8/3/2019 DISEO DE COMPILADORES I
15/21
Compiladores Lxico Sintctico- Grupo 3
15
| DOUBLE
| ESTRUCTURA
;
lista_variables: IDENTIFICADOR
| lista_variables COMA IDENTIFICADOR
| lista_variables IDENTIFICADOR ;
Notas de las declaraciones: permite la declaracin recursiva de declaraciones pero
permitiendo dejar en blanco la parte de declaraciones.
Una declararon debe terminar en punto y coma, pero debe tener un tipo que en
nuestro caso pueden ser INTEGER, DOUBLE y ESTRUCTURA (este ltimo nos
permitira poner validacin de que tenemos declarada la estructura a la hora de definir
variables de este tipo)
Adems de tipo nos permite definir la lista de variables.
Esta lista de variables, puede ser una nica variable
Ramas de ejecutables
ejecutables: sentencia
| ejecutables sentencia;
sentencia: asignacin
| seleccin
| iteracin
| impresin ;
asignacin: asign_izq ASIG expresin PUNTO_COMA
| ASIG expresin PUNTO_COMA
| ASIG expresin
| ASIG PUNTO_COMA
| asign_izq ASIG PUNTO_COMA
| asign_izq error
| asign_izq ASIG expresin error
| asign_izq ASIG error PUNTO_COMA| asign_izq ASIG error;
-
8/3/2019 DISEO DE COMPILADORES I
16/21
Compiladores Lxico Sintctico- Grupo 3
16
asign_izq: IDENTIFICADOR
| IDENTIFICADOR PUNTO IDENTIFICADOR;
expresin: expresin MS termino
| expresin MENOS termino
| termino
| expresin MAS error
| expresin MENOS error ;
termino: termino MULT factor
| termino DIV factor
| factor
| termino MULT error
| termino DIV error ;
factor: IDENTIFICADOR
| NUMERO
| MENOS NUMERO;
seleccin: IF condicin bloque ELSE bloque
| IF error
| IF condicin error ELSE bloque
| IF condicin bloque error
| IF condicin bloque ELSE ;
condicin: PARENTESIS_ABRE expresion_logica PARENTESIS_CIERRA
| PARENTESIS_ABRE expresion_logica| expresion_logica PARENTESIS_CIERRA
|expresion_logica
| PARENTESIS_ABRE error PARENTESIS_CIERRA ;
expresion_logica: expresin operador_logico expresin ;
operador_logico: MENOR
| MAYOR| IGUAL
-
8/3/2019 DISEO DE COMPILADORES I
17/21
Compiladores Lxico Sintctico- Grupo 3
17
|MAYOR_IGUAL
|MENOR_IGUAL
| DISTINTO;
Bloque: BEGIN ejecutables END
| BEGIN ejecutables error
| BEGIN error END
| ejecutables END
| ejecutables error ;
iteracin: WHILE condicin DO bloque
| WHILE error DO bloque
| WHILE condicin error bloque
| WHILE condicin DO error ;
impresin: PRINT PARENTESIS_ABRE CADENA PARENTESIS_CIERRA
PUNTO_COMA
| PRINT PARENTESIS_ABRE PARENTESIS_CIERRA PUNTO_COMA
| PRINT PARENTESIS_ABRE CADENA PARENTESIS_CIERRA
| PRINT PARENTESIS_ABRE CADENA PUNTO_COMA| PRINT CADENA PARENTESIS_CIERRA PUNTO_COMA
| PRINT error CADENA PARENTESIS_CIERRA PUNTO_COMA
| PRINT PARENTESIS_ABRE error PARENTESIS_CIERRA
PUNTO_COMA
| PRINT PARENTESIS_ABRE CADENA error PUNTO_COMA
| PRINT PARENTESIS_ABRE error
| PRINT PARENTESIS_ABRE IDENTIFICADOR error ;
Ramas de ejecutables
Permite la declaracin de las sentencias o lo que normalmente se llamara cuerpo del
programa, pero a diferencia de las sentencias anteriores declarativas y estructuras,
esto obliga a tener al menos una sentencia en el cuerpo.
El tipo de sentencia que se pueden declarar en el cuerpo son las asignaciones, la
seleccin, la iteracin y la impresin.
-
8/3/2019 DISEO DE COMPILADORES I
18/21
Compiladores Lxico Sintctico- Grupo 3
18
La asignacin permite reconocer del lado derecho una expresin aritmtica, tambin
se contemplan los errores cuando faltan el token de asignacin := o cuando no se
finaliza con ; o cuando no se obtiene del lado derecho una expresin aritmtica.
La definicin de la expresin aritmtica, comienza a definir la precedencia utilizada en
la definicin de la gramtica. Se puede ver que en la ltima definicin valida de la
expresin esta el termino.
Ac se deja declarada implcitamente la prioridad de operacin MS y MENOS con
respecto a DIV y POR, lo mismo pasa con el Token MENOS NMERO, que es el de
menor prioridad.
Tambin se podra haber definido en la parte superior de la gramtica explcitamente
con que precedencia se iba a trabajar pero se opto de esta manera por considerarlo
ms claro a la hora de interpretarla.
Con respecto a la sentencia seleccin como se detallo por la ctedra y para evitar
tener un shift reduce por parte del parse, se utiliza como valido la seleccin
completa, que es aquella que tiene tanto el bloque del IF como el del ELSE al menos
declarado, lo dems es considerado error sintctico.
Hay cosas para marcar fue considerar un tratamiento especial para con las sentencias
que finalicen en un bloque, es nuestro caso adems de las seleccin, tenemos la
iteracin. El problema se presentaba que no las podemos considerar que terminaran
en ; y dejar que el bloque lo determine en este caso.
METODOS AGREGADOS SOBRE LA GRAMATICA
Como parte de integrar la gramtica y el parser para con el lxico declarado en una
primera parte, se considera las siguientes declaraciones:
Como primer punto redefinimos el constructor de Parser para que este reconozca la
parte grafica con las estructura definidas.
Otras funciones generales son:
-
8/3/2019 DISEO DE COMPILADORES I
19/21
Compiladores Lxico Sintctico- Grupo 3
19
void mostrarError : nuestra propia funcin para el tratamiento de los errores
informndolos a nuestro entorno grafico. Se puede observar que el mtodo que nos
ofrece el Parser el yyerror, se deja si implementar.
void mostrarSentencia : Se usa para mostrar las sentencias que van detectando las
gramticas a partir del cdigo de entrada.
void tratarDoubleNegativo: Esta funcin es la encargada de comunicarse con la tabla
de smbolo para controlar y negativizar el valor que as fue declarado
void agregarEstructura: Esta funcin se encarga de cargar en una tabla de estructura
cuando se declara una, para en el momento que se haga la declaracin de una
variable de ese tipo, se pueda verificar la previa existencia del tipo utilizado.
Int decodificarToken: Es que en al reconocer el token, determina su valor constante
reconocido por el parser.
int yylex : Por ultimo redefinimos este mtodo, que es la declaracin formar del lxico
para el parser pero para nosotros representa un mtodo que se comunica con el lxico
declarado por nosotros en la primera esta, y segn lo que retornar utilizamos eldecodificar el token para que el sintctico lo reconozca como parte de su gramtica.
-
8/3/2019 DISEO DE COMPILADORES I
20/21
Compiladores Lxico Sintctico- Grupo 3
20
PRUEBAS LEXICAS SINTACTICAS
Consideraciones y forma de correr el programa
PRUEBAS Y
CONSIDERACIONES
Hacer Click sobre el archivo para ver
-
8/3/2019 DISEO DE COMPILADORES I
21/21
Compiladores Lxico Sintctico- Grupo 3
21
CONCLUSION
Pudimos ver que la implementacin de un autmata finito para el reconocimiento
de los tokens en el cdigo fuente por medio de dos matrices: la de transicin de
estados y la de acciones semnticas, es una buena decisin de diseo dado que la
misma es extensible y modificable. De haber utilizado condiciones anidadas o cases,
cualquier cambio o extensin del autmata resultara ms difcil de implementar.
Durante la etapa de diseo del autmata notamos que tendamos a considerar el
entorno de los diferentes tokens para su determinacin pero entendimos que esto no
deba hacerse ya que el reconocimiento de los mismos se basa en una gramtica
regular, la cual no es sensible al contexto.
Es importante hacer un buen diseo del autmata finito, haciendo posible de este
modo, poder reconocer e implementar las acciones semnticas necesarias para la
deteccin de tokens y errores lxicos
La utilizacin de la herramienta Byacc nos facilit mucho la tarea de desarrollo de
este analizador sintctico que de otra manera habra sido una tarea dificultosa.
Con respecto a la deteccin de errores pudimos ver que no es una tarea tan
sencilla como parece a simple vista, dado que tratar de mostrar errores en las ramas
ms bajas de la gramtica, o sea de mayor calidad, trae como consecuencia
numerosos conflictos gramaticales; por lo que muchas veces los mensajes que se
muestran no son tan precisos como se deseara. Otro aspecto indeseable en la
deteccin de errores es la ya mencionada absorcin de sentencias vlidas. Se debe
tambin tener en cuenta, como en todo anlisis sintctico de este tipo, que muchos de
los errores que se detectan no son tales, sino una mala interpretacin debido a erroresanteriores. A pesar de ello se pudieron tener en cuenta una cantidad considerable de
errores y emitir un mensaje de buena calidad.
Adems, aprendimos que el uso de auxiliares en la definicin de los no terminales,
como en el caso de las expresiones, no solo nos permiti dar precedencia de
operadores sino que se evitaron conflictos de ambigedad.