Programa g Fuente
Analizador L i Lxico
Analizador Si i Sintctico
Tabla de Smbolos
ANLISIS LXICO
Leer los caracteres de la entrada Generar una secuencia de componentes lxicos (TOKENS) Eliminar comentarios, delimitadores (espacios, smbolos de puntacin, fin de lnea) Relacionar los mensajes de error con las lneas del programa fuente Introducir los identificadores en la tabla de smbolos
Diseo ms sencillo
Los smbolos que trata el scanner se describe con una gramtica ms simple que la del parser, gramtica regular Gran parte del tiempo de compilacin se consume en la lectura y exploracin de caracteres Se pueden tener varias versiones del scanner una para distintos cdigos (EBCDID, ASCII, ...), con el mismo parser Ejemplo; no puedo distinguir en FORTRAN hasta despus del 1
Mejora la eficiencia
Mejora la transportabilidad
DO 5 I=1.25 DO 5 I=1,25
Funciones Principales de AL
4
Formacin y entrega al parser de los tokens M Manejar el fichero f del programa f fuente Explorar los literales Listar el programa fuente Manejar las macros Controlar si es de formato libre o no
Libre:
Un token es un smbolo terminal de la gramtica del analizador sintctico Varias cadenas diferentes en la entrada pueden dar el mismo token a la salida Un token se describe mediante un patrn Un lexema es un conjunto de caracteres que concuerdan con el patrn de un token En la mayora de lenguajes son tokens:
Palabras
Existen una serie de palabras clave (reservadas) en muchos lenguajes que conviene introducir directamente en la tabla de smbolos: smbolos Tokens Lexemas
if id if x1,a,b > + := then 3 relacin op asign then
Atributos:
num
Los atributos de los identificadores se pueden guardar en la tabla de smbolos Los otros se pueden guardar en otra tabla o devolverlos junto al token
Descripcin del Patrn Const If < O <= o = o <> o >= o > [a-zA-z]+ [0-9]?\.[0-9]+ Cualquier carcter entre menos
Expresin Regular
[ [a-zA-Z][a-zA-Z0-9]* ][ ]
q0 q1 ... q1 q1 ... q1
q1
q1
q0 = > otro
<
q1
= >
q2 q3 q4
q5 q6 q9 = otro
otro q7 q8
Devuelve <rel,>=> Devuelve <rel,>>
Implementacin de un AL
10
Utilizando ensamblador
Programacin de un AL
11
Puntero actual (PA, current pointer): El ltimo carcter aceptado Puntero de bsqueda (PB, lookahead pointer): El ltimo carcter ledo GetChar: mueve el PB hacia delante y devuelve el siguiente carcter Fail: mueve el PB a donde est el PA Retract: mueve el PB un carcter hacia atrs Accept: mueve el PA a donde est el PB IsLetter(x):= x [A..Za..z] IsDigit(x):= x [0..9] IsDelimiter(x):= x [.,;<newline><eof>] InstallName(id): introduce un nombre en la tabla de smbolos
Funciones de lectura:
Predicados:
Acciones:
b q1 a d q5 q2 d c
L={dda$, abnca$|n>=0} q3 a q4 $ q6
a b c d $ 1 2 - - 5 2 - 2 3 - 3 4 - - - 4 - - - - 6 5 - - - 3 6 - - - - -
Para ahorrar memoria se guardan los elementos no nulos en una matriz VALOR de dos valores y con tantos elementos como posiciones no nulas de M Se crea otra tabla, PRIFIL, con el primer VALOR de cada lnea Nmero de elementos (no nulos) de VALOR para esa lnea
VALOR COL 1 2 3 4 5 6 7 2 5 2 3 4 6 3 1 4 2 3 1 5 4 1 2 3 4 5 6 PRIFIL 1 3 5 6 7 0 FIL 2 2 1 1 1 0 M(2,3)? PRIFIL(2)=3 FIL=2, esto significa que los elementos 3 y 4 de VALOR contienen las transiciones del estado 2, de los dos el que tiene valor COL=3 tiene una transicin a 3
Otra forma de programar un analizador lxico es creando una tabla hash con el autmata
a ... z A ... Z 0 ... ... 9 < = ...
q2 q6 ...
En cada iteracin, se lee un carcter de la entrada y se transita a un estado dependiendo de la tabla de transiciones Si el autmata es determinista, slo habr una transicin posible para cada smbolo de entrada y no hace falta retroceso
Autmata programado
17
Acciones Semnticas
19
El autmata no debe mostrar nicamente si o no Realmente realiza una Traduccin El explorador realiza comprobaciones en la tabla de smbolos Las acciones semnticas ms comunes son:
AADIR:
concatena caracteres p para construir smbolos LEECAR: lee caracteres de la entrada VER: Comprueba si un identificador est o no en la TdS ADD: Aade un identificador a la TdS
Tratamiento de errores
20
Acciones posibles
Nmero de caracteres de los identificadores Caracteres ilegales Otros (si el lenguaje no admite .5 en lugar de 0.5)... Borrar un carcter Insertar un carcter Reeemplazar un carcter Intercambiar dos caracteres
Programa con K errores: hacen falta K cambios para poder ser correcto No se suelen utilizar las acciones de correccin de errores por ser muy costosas
10
AL y Lenguajes de Programacin
21
El AL agrupa caracteres para formar tokens, por tanto es importante definir el delimitador Carcter que delimita el token sin pertenecer a l Otro concepto importante es el de palabra reservada El lenguaje prohbe el uso libre al programador de determinadas palabras que tienen un significado especfico y nico en el lenguaje Se pueden clasificar los lenguajes de programacin por el uso de los delimitadores y palabras reservadas: Delimitadores blancos con palabras reservadas
Caso ms sencillo de lenguaje (PASCAL, COBOL) PL/I El tipo ms difcil de lenguaje, aparecen ambigedades (FORTRAN)
Indeterminado
11