Vous êtes sur la page 1sur 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

Tipo

INTEGE
R

Valor

Conteni
do

contine
nte

N args

Tipo
args

Paso
args

Mod
padre

null

null

Null

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.

Lista de exportadas
null

mod0
Lexema

Tipo

INTEGE
R

mod1

MODUL
E

Valor

Conteni
do

contine
nte

N args

Tipo
args

Paso
args

Mod
padre

null

null

Null

Null

Null

Null

Null

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.

Puntero a la
tabla de
simbolos de
mod1

BEGIN
a := c;
END mod0.

Lista de exportadas
null

mod0
Lexema

Tipo

Valor

Conteni
do

contine
nte

N args

Tipo
args

Paso
args

Mod
padre

INTEGE
R

Null

Null

null

Null

Null

Null

mod1

MODUL
E

Null

Null

Null

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);

Puntero a la
tabla de
simbolos de
mod0

BEGIN
b := 1 + c;
END p;
BEGIN
incrementar(c);
END mod1.

Puntero a la
tabla de
simbolos de
incrementar

BEGIN
a := c;

Lista de exportadas

END mod0.

{c}

mod1
Lexema

Tipo

Valor

Conteni
do

contine
nte

N args

Tipo
args

Paso
args

INTEGE
R

Null

Null

Null

Null

Null

INTEGE
R

Null

Null

Null

Null

Null

Increme
ntar

PROCE
DURE

Null

Null

{INTEG
ER}

{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

Puntero a la
tabla de
smbolos de
mod1

b := 1 + c;
END p;
BEGIN
incrementar(c);
END mod1.
BEGIN
a := c;

Lista de exportadas

END mod0.

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

Tipo

Valor

Conteni
do

INTEGE
R

Null

Null

contine
nte

N args

Tipo
args

Paso
args

Mod
padre

Null

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);

Puntero a la
tabla de
simbolos de
mod0

BEGIN
b := 1 + c;
END p;
BEGIN
incrementar(c);
END mod1.

Puntero a la
tabla de
simbolos de
incrementar

BEGIN
a := c;
END mod0.

Lista de exportadas

En esta linea el compilador pondria como


ambito actual el del mod0

{c}

mod1
Lexema

Tipo

Valor

Conteni
do

contine
nte

N args

Tipo
args

Paso
args

INTEGE
R

Null

Null

Null

Null

Null

INTEGE
R

Increme
ntar(c)

Null

Null

Null

Null

Increme
ntar

PROCE
DURE

Null

Null

{INTEG
ER}

{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);

Exportada del modulo 1

BEGIN
b := 1 + c;
END p;
BEGIN

Puntero a la
tabla de
simbolos de
mod1

incrementar(c);
END mod1.
BEGIN
a := c;
END mod0.

Lista de exportadas
null

mod0
Lexema

Tipo

Valor

Conteni
do

contine
nte

N args

Tipo
args

Paso
args

Mod
padre

INTEGE
R

Valor de
c

null

null

Null

Null

Null

mod1

MODUL
E

Null

Null

Null

Null

Null

INTEGE
R

Null

Null

Null

Null

Null

c(export
ado de
mod1)

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.

Vous aimerez peut-être aussi