Title: Compiladores
1Compiladores
- Tema 3
- Análisis Lexicográfico
- Scanners
2Scanner
Programa fuente (secuencia de caracteres)
Scanner (autómata finito determinista o
específico)
Secuencia de símbolos
Símbolo
Categoría sintáctica número, identificador,
if, suma, abrir paréntesis Atributos valor,
nombre, string.
3Ejemplos de Símbolos
- Identificador
- Forma una letra seguida de letras o números. Ej.
a, b1, c3D - Atributo nombre string con la secuencia de
caracteres que forma el identificador en
mayúsculas. Ej. A, B1, C3D - Número
- Forma secuencia de dígitos que puede empezar con
el signo menos y puede contener un punto. Ej. 10,
-3, 15.4, -54.276, .10 - Atributo valor double con el valor numérico.
- Precisión entero o real.
- Punto y Coma
- Forma
- Palabra clave if
- Forma if, If, IF, iF
- Fin de fichero
- Forma carácter EOF de C.
4Separación en Símbolos
- Los comentarios, saltos de línea, espacios y tabs
no forman parte de la secuencia de símbolos. - Al definir los símbolos se ha de considerar como
se separan. - Entre dos símbolos se encuentra cararcteres
separadores (espacios, tabs, comentarios, etc.) - Siempre se intenta leer el símbolo más largo
- Ejemplos
- if ( a gt 10 ) bc 30 - 4
- if ( a gt 10 ) bc 30 - 4
- int a
- zz / comentario / dd
5Especificación
- Símbolos identificador, abrir paréntesis,
string, etc. - Forma
- Expresiones regulares para cada categoría
sintáctica. - Atributos
- Algoritmo para el cálculo de cada atributo a
partir de la secuencia de caracteres del símbolo. - Separadores espacios, comentarios, salto de
línea, tab, etc. - Forma
- Expresión regular que especifica las secuencias
de caracteres que separan los símbolos. - Otros errores, final de fichero, salto de línea,
etc.
6Expresiones Regulares
- Æ es una expresión regular que representa el
conjunto vacío. - l es una expresión regular que representa el
conjunto con un único elemento que es la
secuencia vacía - un string s es una expresión regular que
representa un conjunto que solo contiene s. Para
evitar confusiones, los metacaracteres que
contenga s van entre comillas (,-,...). - V es el conjunto de todos los caracteres
(vocabulario).
7Expresiones RegularesOperadores
- AB Concatenación
- ab aÎA y bÎB
- AB unión x xÎA ó xÎB
- A repetición lAAAAAA...
- A repetición de uno o más AAAAAA...
- An repetición de n veces.
- (A-B) resta x xÎA y xÏB
8Ejemplos de Expresiones Regulares
- dígito d0123456789
- entero_sin_signod
- entero(-l)d
- reald.d(le(-l) d)
- letra la...zA...Z
- identificadorl(ld)
- string(V-)
9Scanner implementado a mano
- El scanner es un procedimiento que lee un símbolo
del programa fuente - Entrada caracteres de un istream
- istream IScan // Stream de entrada
- Salida símbolo en variable global
- enum Categoria
- SNumero,SIdentificador,SString, Sif...
-
- Categoria ScanCat // Categorita sintáctica
- double ScanEntero // Valor numérico
- double ScanReal // Valor numérico
- bool ScanEsEntero // Tipo de número
- string ScanString // String del símbolo
- Condiciones que cumple el scanner
- Lee caracteres hasta conseguir leer un símbolo
- En caso de duda lee el símbolo más largo
- Al salir del scanner, el último carácter leído
pertenece al símbolo. Si se ha leído alguno más
se devuelve a la entrada
10Scanner en C
- void Scanner()
-
- int c
- for ()
- cIScan-gtget()
- switch (c)
- // Separadores
- case '\r'
- case '\n'
- case '\t'
- case ' '
- break
- default
- if ((cgt'a' clt'z') (cgt'A'
clt'Z') (c'_')) - ScanIdentificador(c)
- return
-
- else
11Scanner de Identificadores en C
- void ScanIdentificador(int c)
-
- char buf256
- int i
- for (i0 (cgt'a' clt'z')
- (cgt'A' clt'Z')
- (c'_')
- (cgt'0' clt'9'))
- if (igt254)
- throw CVException(Identificador
demasiado largo") -
- bufic
- cIScan-gtget()
-
- bufi'\0'
- ScanCatSIdentificador
- ScanStringbuf
- IScan-gtputback(c)
12Autómatas Finitos
- Autómata finito determinista (K,T,M,S,Z)
- K conjunto finito de estados.
- T conjunto de terminales (símbolos/caracteres de
entrada). - MKTK función de transición.
- SÎK estado inicial.
- ZÍK conjunto de estados finales.
- Autómata finito no determinista (K,T,M,S,Z)
- MKTP(K) función de transición.
13Representación de los Autómatas Finitos
Transición
1
Estado
Estado final
Estado inicial
1
1
d
a
b
c
1
2
3
4
Acepta las secuencias abc(dc) Ej. abc, abcdc,
abcdcdc, abcdcdc...
14Paso de Expresión Regular a AFND
Exp. a
a
Exp. l
l
Exp. AB
AFND de A
l
l
AFND de B
l
l
15Paso de Expresión Regular a AFND
Exp. AB
l
AFND de A
l
l
AFND de B
16Paso de Expresión Regular a AFND
l
Exp. A
l
l
AFND de A
l
17Ejemplo del Paso de Exp. Regular a AFND
Expresión abac
l
l
AFND ab
AFND ac
l
l
Expresión ab
l
AFND a
l
l
AFND b
Expresión ac
18Ejemplo del Paso de Exp. Regular a AFND
Expresión ac
l
AFND a
l
l
AFND c
a
Expresión a
b
Expresión b
l
l
Expresión c
AFND c
c
l
Expresión c
19Ejemplo del Paso de Exp. Regular a AFND
b
Expresión abac
3
a
2
AFND
1
a
4
c
- Problema
- Un a AFND puede seguir más de un camino durante
su interpretación. - Solución
- Pasar de AFND a AFD.
20Paso de AFND a AFD
- El conjunto de estados del nuevo AFD es el
conjunto de las partes del conjunto de estados
del AFND. - El estado inicial del AFD es el mismo que el del
AFND. - Un estado del AFD es final si contiene algún
estado final del AFND.
21Cálculo del Conjunto de Transiciones
- Poner el estado inicial en el conjunto de estados
K del AFD. El conjunto de transiciones MÆ. - Repetir hasta que K y M no varíen
- Para cada estado de K y carácter de entrada
aplicar las transiciones posibles del AFND y
acumular en K y M el nuevo estado y la nueva
transición.
22Ejemplo del Paso de AFND a AFD
b
Expresión abac
3
a
2
AFND
1
a
4
c
Tabla de Transiciones AFD
I S F 1 a 2,4 2,4 b 3 2,4 c 4 4 c 4
b
3
a
2,4
AFD
1
c
4
c
23Implementación de un AFD
- Variable de estado S.
- Tabla de transiciones T dado un estado y un
carácter de entrada específica el nuevo o error. - Algoritmo
- Sestado inicial.
- Repetir
- Cleer_caracter()
- si TSCerror entonces salir del bucle
- STSC
- si S no es final error
24Ejemplo de Tabla de Transiciones
b
3
a
2
1
c
4
c
Tabla de Transiciones
a b c 1 2 Err Err 2 Err 3 4 3 Err Err Err 4 Err E
rr 4
25Scanner Basado en AFD
- Un AFD no es un scanner. Falta
- Poder leer una secuencia de símbolos y
separadores - Diferenciar las categorías sintácticas de los
símbolos
26Consideraciones Prácticas
- Las palabras reservadas se pueden considerar como
identificadores para evitar crear un AFD
demasiado grande (2n estados del AFND). - Hay que marcar el final del código fuente. Este
indicador pertenecerá al alfabeto. - Los símbolos tienen atributos que hay que
calcular.
27Consideraciones Prácticas
- Los estados finales del AFD se han de marcar con
el símbolo que reconocen. - Como hay que reconoce más de un símbolo puede ser
necesario tener que leer varios caracteres hacia
delante. - La creación de un scanner se puede hacer
directamente sin considerar los autómatas finitos.
28Errores Lexicográficos
- Tener un símbolo de error que se pasa al parser.
- Señalar el error e ignorarlo.
- Tratamiento específico.
- Falta información para corregir los errores
lexicográficos.