Title: Presentaci
1Compiladores e intérpretes Análisis Léxico
II Profesor Eridan Otto
2Análisis Léxico II
- Implementación de un AL
- Tabla de símbolos
- Interfaz con el analizador sintáctico
- Tratamiento de errores
- Generador de Al
3Compiladores e intérpretes
Análisis léxicoII Implementación de un AL
- Implementación de autómatas finitos con Arreglo
- Reconociminto de una constante numérica
cualquiera - Const0-9(.0-9)?(e0-9)?, donde ?
Significa una o 0 veces. Ejemplos123.1,.212,2.123
e10,12e1,... - d 0..9
d
d
Return(const_entero)
0
2
.
e
.
3
d
d
5
6
e
1
d
4
d
Return(const_real_exp)
Return(const_real)
d
4Compiladores e intérpretes
Análisis léxicoII Implementación de un AL
- Implementación de autómatas finitos con Arreglo
- El arreglo queda definido por sus filas que
corresponden a los estados y sus columnas que
corresponden a la entrada,los guiones son estados
de error y deben dar un tratamiento de errores.
Además debe incluirse un arreglo con la acción,
indicando que el estado es final
entrada
estados finales accion 2
Return(const _entero) 4
Return(const _real) 6
Return(const real_exp)
estado actual
. d e 0 1 2 - 1 -
4 - 2 3 2 5 3 - 4 - 4
- 4 5 5 - 6 - 6 - 6
-
5Compiladores e intérpretes
Análisis léxicoII Implementación de un AL
- Implementación de autómatas finitos con Arreglo
PseudocódigoAcceso al próximo estado valorsig
uiente_estado- cGetchar()
finalfalse While( IsDigit(c) or c. or ce)
and NOT final do valorvalor c
Siguiente_estadotransicestado_actualc
cGetchar() if siguiente_estado- then
finaltrue else if siguiente estado
está en estados_finales then finaltrue
else estado_actualsuguiente_estado FinWhile
if siguiente_estado está en estados finales
then fail() else rertact()
tokende acuerdo a tabla de estados finales y
convanum(valor) Accept() Return(token)
6Compiladores e intérpretes
Análisis léxicoII Implementación de un AL
- Implementación de autómatas finitos con Tabla
compacta - Esencialmente es la misma idea de usar un arreglo
como función de transición. - Para ahorrar memoria se guardan los elementos no
nulos en una matriz VALOR de dos columnas y con
tantos elementos como posiciones no nulas del
arreglo original TRANSIC. - Se crea otro arreglo o tabla, PIRFIL, con el
primer valor de cada fila de VALOR y una segunda
columna con el número de elementos no nulos de
una fila
- valor col
- 0 1 0
- 2 1
- 4 1
- 3 0
- 2 1
- 5 2
- 4 1
- 4 1
- 5 2
- 6 1
- 6 1
- prifil fil
- 0 0 2
- 2 1
- 3 3
- 6 1
- 7 2
- 9 1
- 10 1
- Ejemplo
- Transic(2,1)
- Prifil(2)3
- Fil3, significa que los
- Elementos 3 ,4 ,5 de
- valor contienen las
- transiciones del estado 3
- El que tiene el valor
- col1 corresponde a 2.
7Compiladores e intérpretes
Análisis léxicoII Implementación de un AL
- Implementación de autómatas finitosprogramado
- Representa directamente con un programa el
autómata en cuestón
estado 0valor salir false
while not salir do car getchar()
case estado of 0 if car . then
estado1 else if IsDigit(car) then
estado2 else salirtrue 1 if
IsDigit(car) then estado4 else salirtrue
2 if car . then estado3 else
if car e then estado5 else if
IsDigit(car) then estado2 else salirtrue
..... if not
salir valorvalorcar endCase
endWhile if estado 2 or estado 4 or
estado 6 then rertact() tokende
acuerdo a tabla de estados finales y
convanum(valor) Accept()
Return(token) else fail()
8Compiladores e intérpretes
Análisis léxicoII Implementación de un AL
- Consideraciones
- El AL agrupa caracteres para formar tokens, por
lo tanto es importante definir el delimitador - Definición carácter que separa dos lexemas sin
pertenecer al patron de los tokens - Otro concepto importante es el de palabra
reservada - El lenguaje prohibe el uso libre al programador
de determinadas palabras que tienen un
significado específico y único en el lenguaje - Se pueden clasificar los lenguajes de
programación por el uso de los delimitadores y
palabras reservadas - Delimitadores blancos con palabras reservadas
- Caso más simple para un AL (C, PASCAL)
- Delimitadores blancos sin palabras reservadas
- Produce ambiguedades, EjPL/I
- Sentencia válidaIF THEN THEN THEN ELSE
- ELSE ELSE
THEN - Blancos se ignoran sin palabras reservadas
- Este es el caso más dificil. Aparecen
ambiguedadesEjFORTRAN
9Compiladores e intérpretes
Análisis léxicoII Implementación de un AL
- Acciones semánticas
- El AL no es sólo la implementación de un autómata
que identifica una cadena como válida o inválida. - Realmente realiza una traducción
(conceptualmenta hablando), frente a lexemas toma
ciertas acciones clasificándolos. - El scanner realiza comprobaciones en la tabla de
símbolos - Las acciones semánticas más comunes son
- AÑADIR concatena caracteres para construir
cadenas () - LEECAR lee caracteres de entrada (Getchar())
- VERcomprueba si un identificador está o no en la
tabla de símbolos - AGREGAañade un identificador a la tabla de
símbolos
10Compiladores e intérpretes
Análisis léxicoII Implementación de un AL
- Eliminación de comentarios
- Depende de la estructura de comentrios que se
defina, el autómata será diferente. La idea es
que una vez reconocido, el analizador no envíe
token a el parser y siga con la próxima cadena. - Ej comentarios en C / ...../ donde
representa cualquier carácter distinto de y /.
Aquí surge la posible detección de / como operador
/
Return(op)
1
2
0
/
3
Comentario, seguir explorando
6
4
11Compiladores e intérpretes
Análisis léxicoII Tabla de Símbolos
- Consideraciones
- Una función esencial es almacenar los
identificadores definidos en el programa fuente y
recopilar información acerca de varios atributos
de cada uno. - Los atributos proveen información de
- la cantidad de almacenamiento asignado al
identificador - su tipo
- su ámbito (área de validez dentro del programa)
- en caso de procedimientos o funciones, alcunas
cosas como el número y tipo de parámetros, el
método de pasada de cada parámetro
(Ejreferencia), el tipo retornado por la
función. - La tabla de símbolos es una estructura de datos
que contiene un registro para cada identificador. - El objetivo es poder acceder al registro de un
identificador rápidamente para almacenar o
recuperar datos. - El analizador léxico es el primer proceso que
hace uso de la tabla de símbolos.
12Compiladores e intérpretes
Análisis léxicoII Tabla de Símbolos
- Consideraciones
- Sin embargo muchos atributos del identificador no
pueden ser determinados durante esta fase. - Ej en PASCAL VAR i,desviacionREAL. El tipo REAL
no es conocido para el AL al agregar los
identificadores promedio y desviación. Sin
embargo en otras fases se van completando los
datos y utilizando la tabla. - Interfase con la tabla de símbolos
- El detalle de las dos funciones anteriores
- AGREGA(S,T) retorna el índice de la tabla de
símbolos donde se ha ubicado un nuevo
identificador cuyo lexema es S y T su Token - VER(S)retorna el índice de la entrada a la tabla
para S o 0 si no es encontrado. - Cuando un identificador es detectado en el
programa fuente por el AL - Comprueba (VER) si este ya existe
- Si no existe AGREGA el identificador a la tabla
de símbolos - Manejo de palabras reservadas
- Una forma simple de asegurarse de que no se usen
como identficadores es agregar todas las palabras
reservadas a la tabla de símbolos al iniciarce el
análisis léxico.
13Compiladores e intérpretes
Análisis léxicoII Tabla de Símbolos
- Implementación
- Estructura de datos
- Consieraciones de eficiencia espacial y temporal.
Una primera aproximación, que se refinará más
adelante tiene la siguiente estructura.
Arreglo tab_sym
atributos
indice
token
ptrlex
- Begin
- Const
- id
- id
B e g i n / C o n s t i d e s v i a c i o
n
/
/
/
Arreglo lexemas. Usa / seperador de strings,
eventualmente permite hahorrar espacio frente a
la alternativa de manejar los lexemas en la tábla
de símbolos con un largo fijo. Por otro lado la
estructura de los atributos quedará por ahora sin
definir.
14Compiladores e intérpretes
Análisis léxicoII Tabla de Símbolos
- Implementación
- Acceso a la tabla
- Como ya se ha visto las operaciones que reliza el
analizdor léxico sobre la tabla de símbolos son
de inserción y búsqueda de identificadores
(palabras reservadas). Estas operaciones deben
realizarce muy rápidamente, y su velocidad ,
idealmente debiera ser independiente del tabaño
del arreglo. - Uso de métodos de HASH (transformación de claves)
- La idea es asignar un valor al string del lexema
de manera que sirva de clave de acceso a la
tabla - Llaveh(lexema)
- Implementación
- Const TAM_HASH 997
- Function hash(sstring)integer
- Var clavelongintiinteger
- Begin
- clave0
- for i1 to largo(s) do clave clave
1000ORD(si) - hash(clave MOD TAM_HASH)
- End
15Compiladores e intérpretes
Análisis léxicoII Tabla de Símbolos
- Implementación
- Acceso a la tablaHashing
- Si se usa este método hay que cubrir el posible
problema de las colisiones. Estas se pueden
resolver con varios métodos de resolución, por
ejemplo - Encadenamiento directo consiste en construir una
lista enlazada a partir de la posición ocupada.
(Habría que ahregar un campo al registro para
fabricar la lista) - Es recomendable usar la función módulo para
asegurar una distribución uniforme entre
0,TAM_HASH. Se recomienda que el tamaño máximo
de la tabla sea un número primo para reducir la
posibilidad de colisiones. - Esta función debiera agregarse a VER y BUSCAR.
- Se pueden pensar otros esquemas alternativos,
(Estructura de datos) dependiendo del compilador
el lenguaje y su uso.
16Compiladores e intérpretes
Análisis léxicoII Interfaz con el analizador
sintáctico
- El analizador léxico es habitualmente una
función o método de la clase lexico, denominado
por ejemplo yylex(), llamado por el analizador
sintáctico. - El método o función yylex() toma el siguiente
lexema o token del programa fuente o del buffer y
devuelve al parser el tipo de componente léxico y
el atributo del token en una variable o registro
que puede llamarse yylval. Los atributos pueden
ser de distintos tipos según el componente léxico
reconocido - Los tipos de componentes léxicos o tokens se
definen por medio de constantes enteras
predefinidas o con un tipo enumerado para su
representación interna. - Ejemplo representación interna deTOKENS
implementados en C - define IDENTIFICADOR 300
- define CADENA 301
- define RELACION 302
- define IF 303
- .....
- Ejemplo representación interna deTOKENS
implementados en PASCAL - CONST IDENTIFICADOR 300
- CADENA 301
- RELACION 302
- IF
303
17Compiladores e intérpretes
Análisis léxicoII Interfaz con el analizador
sintáctico
- Ejemplo representación interna de yylval
implementado en C - extern union
-
- int tokenrec
- int pt_simbolo /indice a la tabla de
símbolos/ - int atributo_entero /caso en que el
atributo sea un número entero/ - int atributo_real / caso en que el atributo
sea un número real/ - char atr_string
- yylval
- Ejemplo de dunción analizador léxica que devuelve
la variable token con estructura de yylval
implementado en C - yylval yylex()
-
- yylval token
- .......
- Return(token)
-
- Las ideas de cómo implementar el código para
devolver un token correcto ya han sido vistas.
18Compiladores e intérpretes
Análisis léxicoII Tratamiento de errores
- Debe servir a otras fases que detectan la mayor
cantidad de errores manteniendo una variable, por
ejemplo yylineo, que indique la línea en curso.
Esta variable es usada por el módulo de
tratamiento de errores. - Los erores léxicos propiamente tales son escazos,
formalmente se producen si se introducen
caracteres no permitidos en el alfabeto de
entrada o cuando una expresión regular no es
reconocida. - Por ejemplo para el caso
- Then 3 x1 , hay un error, falta un if o
then es un identificador??? - Errores detectables
- Límite para número de caracteres de los
identificadores sobrepasado - Carácter ilegal
- Restricciones propias del lenguaje, por ejemplo
.5 no aceptado, si 0.5 - Falla en el reconocimiento 32. O identificador
1aab
19Compiladores e intérpretes
Análisis léxicoII Tratamiento de errores
- Se informa al módulo de errores y se sigue
procesando deteniéndose y avisando al usuario de
los errores - Acciones posibles
- Borrar un carácter
- Insertar un carácter
- Reemplazar un carácter
- Intercambiar caracteres
- Corrección automática es muy costosa
20Compiladores e intérpretes
Análisis léxicoII Generador de AL
- Se han desarrollado algunas herramientas para
construir analizadores léxicos a partir de
notaciones de propósito especial basadas en
expresiones regulares. - Como ejemplo se verá el lenguaje LEX y el
generador de AL PCLEX. Este lenguaje permite
expresar expresiones regulares y la acción a
tomar al encontrar cada una de ellas.
http//www.abxsoft.com/ se puede conseguir una
versión en demostración. - El programa fuente generado es la implementación
de un autómata finito reconocedor de los
componentes léxicos. Habitualmente genera código
C. - Es posible que se requiera alguna modificación a
el código, luego se compila y el analizador
lexico se transforma en un ejecutable. - Interactúa con el parser de la siguiente forma
cuando es activado, por el parser, el analizador
léxico genera una función llamada yylex, que una
vez llamada comienza a leer la entrada, carácter
a carácter, hasta que la cadena concuerde con
alguna expresión regular, entonces se ejecuta la
acción correspondiente, si es un token devuelve
el control al parser junto con la información del
mismo en yylval, en otros casos realiza labores
propias del AL y sigue procesando.
21Compiladores e intérpretes
Análisis léxicoII Generador de AL
- Especificaciones generalesun archivo de entrada
en lex se compone de tres secciones - codigo c en la cabecera
- Declaraciones o definiciones
-
- Reglas o acciones
-
- Procedimientos auxiliares del usuario
- En la primera sección generalmente se definirá
- nombre expresión regular que lo reconoce
- Lex siempre toma el lexema más largo que
concuerda con la expresión - En caso de conflicto asigna el nombre definido
primero. Es por eso que las palabras se definen
antes que el identificador. - Ejemplo de caracteres especiales en lex
- indica clases de caracteres. abc es
equivalente a(abc). - rango - ?una o ninguna vez. 0 mas veces lo que lo
precede. una o más veces lo que lo precede.
. representa cualquier carácter exepto retorno
de carro - ()agrupación
22Compiladores e intérpretes
Análisis léxicoII Generador de AL
- La segunda sección es la principal y
generalmente se definirá - expresión acción
- Expresión es una expresión regular o un nombre
definido en la sección anterior. En este último
caso deberá ir entre llaves. - Acción Es un fragmento de programa en C, que
indica la acción a tomar por el analizador
léxico, cuando reconoce el patrón situado a su
izquierda. - Hay una serie de funciones y variables propias de
lex que están disponibles en la parte de
acciones. - La tercera sección corresponde a procedimientos
auxiliares, formada exclusívamente de código C. - Ejemplo simple permite contar cuantas veces
aparece la palabra casa en un archivo. - int cont0
-
- casa cont
- .\n
-
- Void main() yylex() printf(casa aparace d
veces,cont)
23Compiladores e intérpretes
Análisis léxicoII Generador de AL
- Podría usarse para reconocer como analizador
léxico - delimitador \n\t
- blancos delimitador
- letra a-zA-Z
- digito 0-9
- id letra(letradigito)
- numero digito(.digito
)?(E-digito)? -
- blancos
- if return(IF)
- then return(THEN)
- while return(WHILE)
- .... .......
- id yylval.pt_simbolo
Installname(yytext)... return(yylval)
numero yylval.atributo_real yytext...
return(yylval) - gt
yyval.tokenRELACIONyylval.atr_stringltreturn
(yylval -
- Definicion de funciones usadas arriba