You are on page 1of 28

Compiladores Tema 3 Anlisis Lexicogrfico Scanners

Compiladores (02/05/2012 19:52)

- 4.1 -

Scanner

Programa fuente (secuencia de caracteres)

Scanner
(autmata finito determinista o especfico)

Secuencia de smbolos Smbolo


Categora sintctica:
nmero, identificador, if, suma, abrir parntesis

Atributos:
valor, nombre, string.

Compiladores (02/05/2012 19:52)

- 4.2 -

Ejemplos de Smbolos

Identificador:

Forma: una letra seguida de letras o nmeros. Ej. a, b1, c3D Atributo nombre: string con la secuencia de caracteres que forma el identificador en maysculas. Ej. A, B1, C3D Forma: secuencia de dgitos 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 numrico. Precisin: entero o real. Forma: ; Forma: if, If, IF, iF Forma: carcter EOF de C.

Nmero:

Punto y Coma:

Palabra clave if: Fin de fichero:

Compiladores (02/05/2012 19:52)

- 4.3 -

Separacin en Smbolos Los comentarios, saltos de lnea, espacios y tabs no forman parte de la secuencia de smbolos. Al definir los smbolos se ha de considerar como se separan.
Entre dos smbolos se encuentra cararcteres separadores (espacios, tabs, comentarios, etc.) Siempre se intenta leer el smbolo ms largo

Ejemplos:
if ( a > 10 ) bc = 30 * - 4 if ( a >= 10 ) bc = 30 * - 4 int * * a ; zz /* comentario */ + dd

Compiladores (02/05/2012 19:52)

- 4.4 -

Especificacin

Smbolos: identificador, abrir parntesis, string, etc. Forma:


Expresiones regulares para cada categora sintctica.

Atributos:
Algoritmo para el clculo de cada atributo a partir de la secuencia de caracteres del smbolo.

Separadores: espacios, comentarios, salto de lnea, tab,


etc.

Forma:
Expresin regular que especifica las secuencias de caracteres que separan los smbolos.

Otros: errores, final de fichero, salto de lnea, etc.

Compiladores (02/05/2012 19:52)

- 4.5 -

Expresiones Regulares

es una expresin regular que representa el conjunto vaco. l es una expresin regular que representa el conjunto con un nico elemento que es la secuencia vaca un string s es una expresin 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).

Compiladores (02/05/2012 19:52)

- 4.6 -

Expresiones Regulares
Operadores

AB Concatenacin {ab| aA y bB} A|B unin {x| xA xB} A* repeticin l|A|AA|AAA... A+ repeticin de uno o ms A|AA|AAA... An repeticin de n veces. (A-B) resta {x| xA y xB}

Compiladores (02/05/2012 19:52)

- 4.7 -

Ejemplos de Expresiones Regulares dgito d=0|1|2|3|4|5|6|7|8|9 entero_sin_signo=d+ entero=(+|-|l)d+ real=d+.d+(l|e(+|-|l) d+) letra l=a|...|z|A...|Z identificador=l(l|d)* string=(V-)*

Compiladores (02/05/2012 19:52)

- 4.8 -

Scanner implementado a mano

El scanner es un procedimiento que lee un smbolo del programa fuente


Entrada: caracteres de un istream
istream *IScan; // Stream de entrada

Salida: smbolo en variable global


enum Categoria { SNumero,SIdentificador,SString, Sif... }; Categoria ScanCat; // Categorita sintctica double ScanEntero; // Valor numrico double ScanReal; // Valor numrico bool ScanEsEntero; // Tipo de nmero string ScanString; // String del smbolo

Condiciones que cumple el scanner


Lee caracteres hasta conseguir leer un smbolo En caso de duda lee el smbolo ms largo Al salir del scanner, el ltimo carcter ledo pertenece al smbolo. Si se ha ledo alguno ms se devuelve a la entrada
Compiladores (02/05/2012 19:52) - 4.9 -

Scanner en C++
void Scanner() { int c; for (;;) { c=IScan->get(); switch (c) { // Separadores case '\r': case '\n': case '\t': case ' ': break; default: if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c=='_')) { ScanIdentificador(c); return; } else { COut << "No se tratar el caracter " << (char) c << endl; } } } }

Compiladores (02/05/2012 19:52)

- 4.10 -

Scanner de Identificadores en C++


void ScanIdentificador(int c) { char buf[256]; int i; for (i=0; (c>='a' && c<='z') || (c>='A' && c<='Z') || (c=='_') || (c>='0' && c<='9');) { if (i>254) { throw CVException(Identificador demasiado largo"); } buf[i++]=c; c=IScan->get(); } buf[i]='\0'; ScanCat=SIdentificador; ScanString=buf; IScan->putback(c); }

Compiladores (02/05/2012 19:52)

- 4.11 -

Autmatas Finitos
Autmata finito determinista (K,T,M,S,Z)
K conjunto finito de estados. T conjunto de terminales (smbolos/caracteres de entrada). M:KTK funcin de transicin. SK estado inicial. ZK conjunto de estados finales.

Autmata finito no determinista (K,T,M,S,Z)


M:KTP(K) funcin de transicin.

Compiladores (02/05/2012 19:52)

- 4.12 -

Representacin de los Autmatas Finitos

Estado 1 Estado inicial

Transicin 1 Estado final

a 1 2

b 3

c 4

Acepta las secuencias: abc(dc)*


Ej. abc, abcdc, abcdcdc, abcdcdc...

Compiladores (02/05/2012 19:52)

- 4.13 -

Paso de Expresin Regular a AFND

Exp. a

Exp. l

Exp. A|B l
AFND de A

AFND de B

Compiladores (02/05/2012 19:52)

- 4.14 -

Paso de Expresin Regular a AFND

Exp. AB l
AFND de A

AFND de B

Compiladores (02/05/2012 19:52)

- 4.15 -

Paso de Expresin Regular a AFND

Exp. A*

AFND de A

Compiladores (02/05/2012 19:52)

- 4.16 -

Ejemplo del Paso de Exp. Regular a AFND

Expresin: ab|ac* l AFND: ab l

AFND: ac*

Expresin: ab l AFND: a

l
l AFND: b

Compiladores (02/05/2012 19:52)

Expresin: ac*

- 4.17 -

Ejemplo del Paso de Exp. Regular a AFND

Expresin: ac*

l
AFND: a l l AFND: c* Expresin: a Expresin: b a b l AFND: c

l
Expresin: c*

Expresin: c
Compiladores (02/05/2012 19:52)

l
- 4.18 -

Ejemplo del Paso de Exp. Regular a AFND

Expresin: ab|ac* AFND


1

a a

c Problema:
Un a AFND puede seguir ms de un camino durante su interpretacin.

Solucin:
Pasar de AFND a AFD.

Compiladores (02/05/2012 19:52)

- 4.19 -

Paso 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 algn estado final del AFND.

Compiladores (02/05/2012 19:52)

- 4.20 -

Clculo 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 varen:
Para cada estado de K y carcter de entrada aplicar las transiciones posibles del AFND y acumular en K y M el nuevo estado y la nueva transicin.

Compiladores (02/05/2012 19:52)

- 4.21 -

Ejemplo del Paso de AFND a AFD

Expresin: ab|ac* AFND


1

a a

Tabla de Transiciones AFD

I 1 2,4 2,4 4

S a b c c
AFD

F 2,4 3 4 4 a
1 2,4

c
Compiladores (02/05/2012 19:52) - 4.22 -

Implementacin de un AFD

Variable de estado S. Tabla de transiciones T: dado un estado y un


carcter de entrada especfica el nuevo o error.

Algoritmo:
S=estado inicial. Repetir
C=leer_caracter() si T[S][C]==error entonces salir del bucle S=T[S][C]

si S no es final error

Compiladores (02/05/2012 19:52)

- 4.23 -

Ejemplo de Tabla de Transiciones

a
1 2

c Tabla de Transiciones a 2 Err Err Err b Err 3 Err Err c Err 4 Err 4

1 2 3 4

Compiladores (02/05/2012 19:52)

- 4.24 -

Scanner Basado en AFD Un AFD no es un scanner. Falta


Poder leer una secuencia de smbolos y separadores Diferenciar las categoras sintcticas de los smbolos

Compiladores (02/05/2012 19:52)

- 4.25 -

Consideraciones Prcticas 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 cdigo fuente. Este indicador pertenecer al alfabeto. Los smbolos tienen atributos que hay que calcular.

Compiladores (02/05/2012 19:52)

- 4.26 -

Consideraciones Prcticas

Los estados finales del AFD se han de marcar con el smbolo que reconocen. Como hay que reconoce ms de un smbolo puede ser necesario tener que leer varios caracteres hacia delante. La creacin de un scanner se puede hacer directamente sin considerar los autmatas finitos.

Compiladores (02/05/2012 19:52)

- 4.27 -

Errores Lexicogrficos Tener un smbolo de error que se pasa al parser. Sealar el error e ignorarlo. Tratamiento especfico. Falta informacin para corregir los errores lexicogrficos.

Compiladores (02/05/2012 19:52)

- 4.28 -

You might also like