Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Compiladores e Intérpretes
Análisis LéxicoSebastian Gottifredi
Universidad Nacional del Sur
Departamento de Ciencias e Ingeniería de la Computación
2019
1
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Esquema General del Análisis Léxico
2
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Esquema General del Análisis Léxico
• El programa fuente es una cadena de caracteres
• Tenemos que reconocer si esa cadena pertenece al
lenguaje utilizando las reglas de sintaxis del lenguaje
• Las reglas de sintaxis se expresan en términos de
“palabras”
3
if(id1>10)
var= “hola”;
else
print “chau”;
//fin
TEXT:if(id1>10)var=_“hola”;elseprint_“chau”;//fin
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
if ( id > num ) id = String ; else print String ;
Esquema General del Análisis Léxico
• El Analizador Léxico es el encargado de leer “directamente” el texto del programa fuente
• Busca construir esas palabras o subcadenasagrupando caracteres
• Elimina blancos, separadores y comentarios
• Informa de Errores Léxicos
4
Analizador
Léxico
if(id1>10)var=_“hola”;elseprint_“chau”;//fin
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
• El Analizador Léxico funciona por demanda!
• El analizador sintáctico irá solicitándole palabras
Esquema General del Análisis Léxico
5
if(id1>10)var=_“hola”;elseprint_“chau”;//fin
if(id
NEXT!
Analizador
Sintáctico
Analizador
Léxico
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Esquema General del Análisis Léxico
• En esta etapa también se detectan los errores léxicos
• Estos errores se producen, por ejemplo, cuando:
• Aparece un caracter extraño que no es una “palabra” del lenguaje
(por ejemplo: el carácter ⌂ en un código java)
• Cuando una de las “palabras” del lenguaje está mal formada (por
ejemplo en Pascal 123ab es un número o identificador mal formado)
• Se detecta un comentario multi-línea sin cerrar
6
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Tokens
7
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Tokens
• Las “palabras o subcadenas” agrupadas por el
analizador léxico son llamadas Lexemas
• Son clasificadas en Tokens
• Los Tokens caracterizan subcadenas con un rol dentro
del lenguaje de programación
• Ejemplos de Tokens:
• Enteros, Strings, Identificadores, palabra clave IF, Igual, etc..
8
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Tokens
• Algunos tokens identifican conjuntos de subcadenas
• Por ejemplo:
• Token Identificador: subcadena que empiezan con una letra y
sigue con una sequencia de letras y/o dígitos
• Ejemplos de Lexemas: id1 var myvar amigo a1244
• Token String: subcadena que comienza con “, sigue con una
secuencia de caracteres, y termina con ”
• Ejemplos de Lexemas: “hola” “me#@!!&” “id1”
9
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Tokens
• Otros Tokens son identificados por una única subcadena
• Por ejemplo:
• Token Igual: subcadena con el caracter =
• Token Mayor o Igual: subcadena con los carácteres >=
• Token Palabra Clave IF: subcadena con los caracteres if
10
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Tokens
• La salida del analizador léxico ante un pedido del
analizador sintáctico es un token.
• El token retornado está acompañado por el lexema
caracterizado por ese token.
• El lexema es un atributo del token retornado!
11
if(id1>10)var=_“hola”;else
if(id
NEXT!
Analizador
Sintáctico
Analizador
Léxico
Lexema: id1
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Tokens
• Los espacios, tabs, enters (blancos) y comentarios NO
son tokens!
• Como los blancos y comentarios no son tokens, no
son retornados por el analizador léxico!
12
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Especificando Tokens –Expresiones Regulares
13
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Especificando Tokens – Expresiones Regulares
• Para implementar el analizador léxico de un lenguaje de
programación tenemos que identificar sus tokens
• Describir los lexemas que los caracterizan, es decir, dar una
especificación para los tokens del lenguaje
• El formalismo usual para esta tarea son los Lenguajes
Regulares
• ¿Por qué estos lenguajes?
14
Son lenguajes formales menos
complejos, más simples y más eficientes
capaces identificar los lexemas.
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Especificando Tokens – Expresiones Regulares
• Los lenguajes regulares se notan con expresiones regulares (ER):
• Dado un alfabeto una expresión regular r puede ser:
• Un caracter c de
• la cadena vacía
• Dadas dos expresiones regulares r1 y r2 en se puede construir como:
• r1r2 (secuencia)
• r1|r2 (opción)
• r1* (clausura: 0 o mas repeticiones de r1)
• r1+ (clausura positiva: 1 o mas repeticiones de r1)
• Se puede usar paréntesis para indicar agrupamiento o precedencia
15
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Especificando Tokens – Expresiones Regulares
• El conjunto de cadenas o lenguaje que genera con una
expresión regular r se denota L(r),
• Por ejemplo, si r3 = a(b|c) tenemos que L(r3) = {ab, ac}
• ¿Qué representa rd = (0|1|2|3|4|5|6|7|8|9)?¿Cómo es L(rd)?
• ¿Cómo es la expresión regular re para un entero? y ¿L(re)?
• ¿Cómo sería la de un identificador?
• ¿La de mayor?¿La de mayor o igual?
16
Por simplicidad usamos [0..9], [a..z] y
[A..Z] para caracterizar dígitos, letras
minúsculas y letras mayúsculas
respectivamente. Tambien usamos
Letra = [a..z]|[A..Z] para caracterizar
cualquier letra
Pizarrón!
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Reconociendo Tokens –Autómatas Finitos
17
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Reconociendo Tokens – Autómatas Finitos
• Los Autómatas Finitos (AF) reconocen cadenas de los
lenguajes regulares
• Un autómata finito esta formalmente caracterizado por:
• Alfabeto
• Conjunto de estados E
• Función de transición de estados T: E x → E
• Estado inicial I
• Conjunto de estados finalizadores F E
18
Estado
Estado Inicial
Estado Aceptador
Transiciónc
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Reconociendo Tokens – Autómatas Finitos
• El AF va aplicando transiciones a medida que consume los
caracteres de la cadena de entrada
• Partiendo del estado inicial, si el autómata puede consumir
toda la toda la cadena y queda en un estado finalizador acepta
la cadena sino rechaza la cadena
19
abba
aabb
abbaa
abba
aabb
abbaa
e0 e1 e2a
b a
a
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Reconociendo Tokens – Autómatas Finitos
• Dada una ER podemos construir un AF que reconoce el lenguaje generado por esa expresión
• ¿Cómo sería el autómata para reconocer X? donde X es:
• El operador mayor
• El operador mayor o igual
• Palabra clave else
• Enteros
• Identificadores
20
Pizarrón!
Compiladores e Intérpretes 2019
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementado Analizadores Léxicos
21
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Para implementar el Analizador Léxico vamos a usar los AF
que reconocen las ER asociadas a cada token del lenguaje
• ¿Cómo lo implementamos?
• Recibe y va leyendo el programa fuente
• Funciona por demanda
• Ante un pedido, reconoce un token y lo retorna
• Al retornar un token puede no haber terminado de procesar el
programa fuente
22
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Ante un pedido el Analizador Léxico debería poder reconocer
cualquier token válido
23
el Analizador Léxico se
basará en un AF que se
construye uniendo
adecuadamente los AFs
de cada ER
e0digito digito
e1Entero
e0letra letra o
digito
e1Id
e0 e1 e2> =Mayor
o Igual
e0 e1>
Mayor
Pizarrón!
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Hay tokens que comparten prefijos
24
Mayor
o Iguale0 e1 e2
> =
e0 e1>
Mayor
… > …No
determinista!
e0 e3 e4> =
e5>
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Hay tokens que comparten prefijos
25
e0 e1 e2> =
e0 e1>
e0 e3 e4> =Mayor
o Igual
Mayor
… > …
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Los estados terminadores deben retornar el token
reconocido (con su lexema)
26
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
Next
Token!
…>=5…
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Los estados terminadores deben retornar el token
reconocido (con su lexema)
27
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…>=5…
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Los estados terminadores deben retornar el token
reconocido (con su lexema)
28
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…>=5…
op>=
Lexema: >=
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• La cadena de entrada puede contener más de un token
29
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…>=5…
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…>=5…
Next
Token!
Al iniciar el
reconocimiento
de un token
debe estar en el
estado inicial
Next
Token!
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Reconocer el token más grande posible
30
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…543>=
Next
Token!
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Reconocer el token más grande posible
32
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…543>=
Estoy en un estado
terminador… pero
tengo que seguir
armando el token!
Aún no hay que
retornar nada!
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Reconocer el token más grande posible
33
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…543>=
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando Analizadores Léxicos
• Reconocer el token más grande posible
34
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…543>=
int
Lexema: 543
Termino porque mirando el
caracter (sin consumirlo)
no puedo seguir armando
el lexema del token
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando el Analizador Léxico
• Los blancos y comentarios no son tokens
• Aun así el Analizador Léxico debe ser capaz de procesarlos, ya que:
• Se pueden usar como separadores entre tokens (ids, números, etc)
• Para ignorarlos hay que consumirlos
• Pueden tener errores! (solo en comentarios)
• El autómata debería tener transiciones para realizar estas tareas
35
¿Cómo consumirían los
espacios, tabs y enters?
Pizarrón!
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando el Analizador Léxico
• ¿Cómo detectamos un error léxico?
36
Analizador Léxico
digitoe1
e0letra
e2
e3 e4> =
letra o
digito
…~…
Estando en un estado no
terminador y el caracter
actual no se corresponde
con ninguna transición
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando el Analizador Léxico
•Estrategias para codificar el autómata
• Subprogramas x Estado
• Swtich/Case
• Tabla
• Herramientas Automáticas
37
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando el Analizador Léxico
• Subprogramas: para cada estado ei, creamos una función ei():
38
Si caracterActual = c1
Agregar caracterActual a lexemaActual
Consumir caracter
retornar el resultado de e1()
…
Sino Si caracterActual = cn
Agregar caracterActual a lexemaActual
Consumir caracter
retornar el resultado de ek()
Sino
ERROR!
e1
ei
ek
NextToken():
lexemaActual = vacio
retornar el resultado de e0()
Pizarrón!
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando el Analizador Léxico
• Subprogramas: para cada estado ej, creamos una función ej():
39
Si caracterActual = c1
Agregar caracterActual a lexemaActual
Consumir caracter
retornar el resultado de e1()
…
Sino Si caracterActual = cn
Agregar caracterActual a lexemaActual
Consumir caracter
retornar el resultado de em()
Sino
retornar token asociado a ej
e1
ej
em
Pizarrón!
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando el Analizador Léxico
• Switch/Case: la función nextToken captura todos los estados
40
Loop
switch (estado):
case ei:
Si caracterActual = c1
Agregar caracterActual a lexemaActual
Consumir carácter
estado = ej
break
…
Sino
Si ei es aceptador retornar token de ei
Sino ERROR!
case ej: …
…
end loop
ej
ei
ek
Compiladores e Intérpretes 2017
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
Implementando el Analizador Léxico
• En general implementar las palabras claves del lenguaje
utilizando sus AF es problemático porque:
• Requiere muchos estados (casi uno por letra de la palabra clave)
• Hay que fusionar esos estados entre sí y con los de identificadores
• En la mayoría de los lenguajes las palabras clave son
prácticamente identificadores “especiales”…
41
Cuando armamos un token
identificador controlamos si
no es una palabra clave en
una tabla de palabras clave!
¿Cómo podemos
aprovechar esto?