Anda di halaman 1dari 37

Analizador Lxico, Sintctico, Semntico y Cdigo Intermedio = Compilador. Macrogrupo 1.

Grupo 1 Grupo 3 Grupo 4 Grupo 11

Analizador Lxico.
4 scanners:
2 implementados a mano (grupos 4 y 11) 1 implementado con Coco/R (grupo 3) 1 implementado con JFlex (grupo 1)

Se elige el scanner implementado con JFlex (Grupo 1).


Comodidad a la hora de cambiar cdigo. Fcil integracin con el SLK. Experiencias anteriores.

Analizador Lxico.
Tipos de tokens generados:
Palabras Reservadas Atributo: Puntero a la Tabla de Smbolos Ejemplos: FOR, IF, WITH Identificadores Atributo: Puntero a la Tabla de Smbolos Ejemplos: variable, nota, casa Operadores comparacin Atributo: Tipo Enumerado Ejemplos: <,<=,>,>=,!=,= Operador Asignacin Atributo: Nada Ejemplos: := Operador Unitario Atributo: Enumerado

Analizador Lxico.
Tipos de tokens generados:
Operadores Aditivos Atributo: Tipo Enumerado Ejemplos: +, Operadores Multiplicativos Atributo: Tipo Enumerado Ejemplos: *, / Nmero Entero (octal y hexadecimal) Atributo: Valor numrico Ejemplos: 1, 56 Nmero Real Atributo: Valor numrico Ejemplos: 1.2, 56.7893 EOF

Analizador Lxico.
Tipos de tokens generados:
Cadenas de caracteres Atributo: Puntero a la tabla de smbolos Ejemplos: "Hola mundo", "adios" Carcter (en octal) Atributo: Carcter Ejemplos: a, b, z, 3 Puntuacin Atributo: Tipo enumerado Ejemplos: ;, (, ] Funcin predefinida Atributo:Tipo enumerado Procedimiento predefinido Atributo:Tipo enumerado

Analizador Lxico.

Analizador Lxico.
Herramienta utilizada: JFlex.
JFlex es un generador de scanners para Java, implementado tambin en Java, que genera un analizador lxico de manera rpida y sencilla, independientemente de la plataforma que utilicemos a la hora de programar.

Recibe archivo .flex

Genera AFD.

Analizador Lxico.
Herramienta utilizada: JFlex. Se utilizan: - PATRONES - ESTADOS - FUNCIONES - Cdigo Java empotrado

Nuestro Archivo .flex

Diseo de la tabla de smbolos

Tabla hash por cada mbito con estructura de rbol

Diseo de la tabla de smbolos


MODULE mod0; VAR a : INTEGER; MODULE mod1 VAR b,c: INTEGER EXPORT c; PROCEDURE incrementar (VAR &c : INTEGER); BEGIN b := 1 + c; END p; BEGIN incrementar(c); END mod1. BEGIN a := c; END mod0.

Lista de exportadas null

mod0 Lexema a Tipo INTEGE R Valor Conteni do null contine nte null N args 0 Tipo args Null Paso args Null Mod padre Null

Diseo de la tabla de smbolos


MODULE mod0; VAR a : INTEGER; MODULE mod1 VAR b,c: INTEGER EXPORT c; PROCEDURE incrementar (VAR &c : INTEGER); BEGIN b := 1 + c; END p; BEGIN incrementar(c); END mod1. BEGIN a := c; END mod0.

Lista de exportadas null

mod0 Lexema a mod1 Tipo INTEGE R MODUL E Valor Conteni do null contine nte null Null N args 0 0 Tipo args Null Null Paso args Null Null Mod padre Null Null

Diseo de la tabla de smbolos


MODULE mod0; VAR a : INTEGER; MODULE mod1 VAR b,c: INTEGER EXPORT c; PROCEDURE incrementar (VAR &c : INTEGER); BEGIN b := 1 + c; END p; BEGIN incrementar(c); END mod1. BEGIN a := c; END mod0.

Puntero a la tabla de simbolos de mod1

Lista de exportadas null

mod0 Lexema a mod1 Tipo INTEGE R MODUL E Valor Null Conteni do Null Null contine nte null Null N args 0 0 Tipo args Null Null Paso args Null Null Mod padre Null Null

Diseo de la tabla de smbolos


MODULE mod0; VAR a : INTEGER; MODULE mod1 VAR b,c: INTEGER EXPORT c; PROCEDURE incrementar (VAR &c : INTEGER); BEGIN b := 1 + c; END p; BEGIN incrementar(c); END mod1. BEGIN a := c; END mod0.

Puntero a la tabla de simbolos de mod0

Puntero a la tabla de simbolos de incrementar

Lista de exportadas {c}

mod1 Lexema b c Increme ntar Tipo INTEGE R INTEGE R PROCE DURE Valor Null Null Null Conteni do Null Null contine nte Null Null Null N args 0 0 1 Tipo args Null Null {INTEG ER} Paso args Null Null {VALOR } Mod padre

Diseo de la tabla de smbolos


MODULE mod0; VAR a : INTEGER; MODULE mod1 VAR b,c: INTEGER EXPORT c; PROCEDURE incrementar (VAR &c : INTEGER); BEGIN b := 1 + c; END p; BEGIN incrementar(c); END mod1. BEGIN a := c; END mod0.

Puntero a la tabla de smbolos de mod1


Lista de exportadas null

En esta linea el compilador pondria como ambito actual el del modulo 1 En esta linea el compilador buscaria la variable b en la tabla del modulo 1 para guardar el valor de 1 + c. incrementar Lexema c Tipo INTEGE R Valor Null Conteni do Null contine nte N args 0 Tipo args Null Paso args Null Mod padre Null

Diseo de la tabla de smbolos


MODULE mod0; VAR a : INTEGER; MODULE mod1 VAR b,c: INTEGER EXPORT c; PROCEDURE incrementar (VAR &c : INTEGER); BEGIN b := 1 + c; END p; BEGIN incrementar(c); END mod1. BEGIN a := c; END mod0.

Puntero a la tabla de simbolos de mod0

Puntero a la tabla de simbolos de incrementar

En esta linea el compilador pondria como ambito actual el del mod0

Lista de exportadas {c}

mod1 Lexema b c Increme ntar Tipo INTEGE R INTEGE R PROCE DURE Valor Null Increme ntar(c) Null Conteni do Null Null contine nte Null Null Null N args 0 0 1 Tipo args Null Null {INTEG ER} Paso args Null Null {VALOR } Mod padre

Diseo de la tabla de smbolos


MODULE mod0; VAR a : INTEGER; MODULE mod1 VAR b,c: INTEGER EXPORT c; PROCEDURE incrementar (VAR &c : INTEGER); BEGIN b := 1 + c; END p; BEGIN incrementar(c); END mod1. BEGIN a := c; END mod0.

Exportada del modulo 1

Puntero a la tabla de simbolos de mod1


mod0 Conteni do null Null contine nte null Null Null N args 0 0 0 Tipo args Null Null Null

Lista de exportadas null

Lexema a mod1 c

Tipo INTEGE R MODUL E INTEGE R

Valor Valor de c

Paso args Null Null Null

Mod padre Null Null Null

c(export ado de mod1)

Null

Interfaz de acceso de la T.S. (analizador lxico)


Inserta_Clave(String,Tipo_Token)
Token=(Tipo_Token,Atrib) El analizador lxico llamar a esta funcin para insertar nuevos identificadores

Busca_Clave(String)
Busca la cadena que se le pasa como parmetro en la tabla de smbolos

Interfaz de acceso de la T.S. (analizador sintctico y semntico)


^TS CreaTabla(^TS) :
Devuelve un puntero a la nueva tabla creada, y se le pasa como parmetro el puntero de la tabla padre

^TS CierraTabla(^TS):
Devuelve un puntero a la nueva tabla activa, que ser la que era continente de la del parmetro ^TS

Interfaz de acceso de la T.S. (analizador sintctico y semntico)


^TS Completa (Campo, Valor, String) :
Rellena campos de la tabla de smbolos con el valor pasado como parmetro.

Valor Consulta (Campo, String):


Devuelve el valor del identificador pasado como parmetro para el tipo de campo Campo.

Diagrama de clases

Analizador sintctico.
Especificacin y diseo del Parser. Analizador descendente predictivo tabular. Herramienta de generacin Slk. Sintaxis particular de slk muy prxima a la notacin EBNF. Se obtiene un cdigo que implementa el Parser.

Analizador sintctico.
Gramtica.
Factorizada y sin recursin por la izquierda, LL(1). Sigue unas reglas de notacin que ayudan al mejor entendimiento y legibilidad de la misma: -No terminales siguen el estilo de los identificadores de Java. Ejemplo: noTerminal, otroNoTerminal. -Los identificadores de los smbolos terminales aparecen con todas sus letras en maysculas Ejemplo: TERMINAL, OTROTERMINAL -Cada produccin debe ir en una nueva lnea. Las producciones con distinta parte izquierda deben estar separadas por al menos un salto de lnea. -El smbolo vaco se representa por _epsilon_

Analizador sintctico.
Herramientas consideradas y eleccin
Un analizador sintctico descendente predictivo tabular es ms eficiente debido a que no se apoya en la recursin. Se ha elegido la herramienta SLK ya que simplifica diseo e implementacin al comprobar que la gramtica es LL(1) y al generar la tabla de anlisis. Inconvenientes: - no tener control sobre el cdigo generado. SLK toma como entrada una gramtica LL(1) en formato EBNF. Genera clases con cdigo propio y otras que el usuario debe desarrollar, como SlkAction o SlkLog.

Analizador sintctico.
Clases generadas por SLK.
SlkParser: Clase principal del analizador. SlkConstants: traduccin de los smbolos de la gramtica. SlkToken: Clase proporcionada por el usuario, nexo de unin entre el analizador sintctico y el analizador lxico. SlkError: un mtodo por cada tipo de error sintctico: Mismatch, No Entry, Input left. SlkString: transformar los cdigos que utiliza el parser en sus descripciones. SlkAction: acciones semnticas. SlkLog: trace, trace_production, trace_action.

Diseo del Gestor de Errores


Construccin del Gestor de Errores Diseo e Interfaces del Gestor de Errores Diagrama de clases

Construccin del Gestor de Errores


Se pueden encontrar errores en cada fase de las que consta el compilador.
Detectar el primer error producido y pararse. Poder continuar la compilacin y permitir la deteccin de ms errores en el programa fuente.

Construccin del Gestor de Errores


La fase de anlisis lxico detecta errores producidos por los caracteres restantes de la entrada que no forman ningn componente lxico del lenguaje. Los errores donde la cadena de componenetes lxicos violan las reglas de estructura (sintaxis) del lenguaje son determinados por la fase del anlisis sintctico. Durante el anlisis semntico el compilador intenta detectar construcciones que aunque tengan la estructura sintctica correcta, no tengan significado para la operacin implicada.

Diseo e interfaces del Gestor de Errores


El diseo del Gestor de Errores se hace pensando en la futura integracin con el resto de los mdulos del compilador. Lograr la mxima cohesin y el mnimo acoplamiento posible. Reducir la complejidad. Mayor flexibilidad frente a cambios o modificaciones. Encapsulamiento del tipo de error mostrado al usuario. Los mdulos que utilicen el Gestor de errores slo debern preocuparse por utilizar el tipo de manejador adecuado.

Diagrama de clases

Analizador semntico.
Especificacin y diseo del analizador semntico.
- Fase donde relacionamos la informacin que calculamos con el significado del programa. - Determinar la informacin que no puede ser descrita por las GIC. - Asociamos la informacin a las construcciones del lenguaje de programacin proporcionando atributos a los smbolos de la gramtica. - Los valores de los atributos se calculan mediante reglas semnticas asociadas a las producciones gramaticales. - Completar la informacin de los smbolos que tenemos en la TS.

Analizador semntico.
- Se distinguien dos tipos de anlisis semntico: - Esttico - Comprobacin de tipos - Comprobaciones asociadas al flujo del control - Comprobaciones de unicidad - Comprobaciones relativas a nombres - Dinmico - Recorreremos en un determinado orden y calcularemos en cada nodo la informacin semntica necesaria. (1 sola pasada) Evaluacin de los atributos mediante mtodos basados en reglas.

- Como resultado: rbol sintctico anotado.

Analizador semntico.
Herramientas utilizadas
- No ha sido necesaria considerar otras. - SLK. Se ha elegido la herramienta SLK ya que fue la utilizada para el anlisis sintctico, de modo que la salida de esta fase se convierte en la entrada de la fase del anlisis semntico. Inconvenientes: - No tener control sobre el cdigo generado. SLK toma como entrada una gramtica LL(1) en formato EBNF. Las clases que debemos implementar para esta fase es la SLKAction, adems de otras propias.

Analizador semntico.
Clases generadas por SLK.
SlkAction: contiene todos los mtodos que determinan la accin a realizar en cada caso segn su anlisis semntico (80). Nodo: estructura que contiene toda la informacin recogida en cada accin semntica. PilaNodos: pila para almacenar los nodos con la informacin que se completa en cada accin semntica. TipoSemantico: clase enumerado que contiene todos los tipos semnticos considerados. As, como la utilizacin de la propia TS y el GE.

Analizador semntico.

Relaciones mas importantes entre el semntico y el sintctico. Se omiten las relaciones con la TS y el GE.

Generacin de cdigo intermedio.


Especificacin y diseo
- El generador de cdigo ensamblador se ha implementado como
complemento al resto de actividades sintcticas dentro de las acciones semnticas ofrecidas por la herramienta SLK. - La generacin es empotrada, por tanto, con la diferenciacin de que ha sido implementada una nueva clase, Generador, que ser la que genere el cdigo propiamente dicho y presente una interfaz amigable dentro de las acciones definidas previamente. - La generacin de cdigo se produce en las acciones semnticas que proceda, obteniendo un fichero de salida con los resultados.

Generacin de cdigo intermedio.


Herramientas utilizadas
- Uno de los propuestos en clase - ENS2001. - Integra la funcin de Ensamblador, de un subconjunto de
instrucciones del estndar IEEE 694. - Tiene un Simulador, ya que es capaz de ejecutar programas ensamblados para dicha implementacin particular del estndar.

Generacin de cdigo intermedio.

Anda mungkin juga menyukai