Você está na página 1de 66

Leccin 2: Anlisis lxico 1) El papel de un analizador lxico (scanner) 2) Tokens, lexemas y patrones lxicos 3) Expresiones regulares

Su utilidad en compilacin Definicin Ejemplos Notaciones Aceptacin de un string por un AF

4) Autmatas finitos
Generalidades Grafo de transiciones asociado a un AF
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-

5) Conversin de una expresin regular en un AFN 6) Transformacin de un AFN en un AFD 7) Minimizacin de un AFD 8) Una introduccin breve a la implementacin de analizadores lxicos

El papel del analizador lxico La funcin primordial es agrupar caracteres de la entrada en tokens Estos tokens son suministrados (bajo demanda) al analizador sintctico
programa fuente tabla de smbolos analizador lxico (scanner) tokens ..... analizador sintctico (parser)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

El papel del analizador lxico Pero, adems


procesar directivas al compilador introducir informacin preliminar en la tabla de smbolos (se ver) eliminar separadores innecesarios (cuando no lo ha hecho un preprocesador) sustituir macros formatear y listar el fuente

A, veces cuando el lenguaje es sintcticamente complejo, dos fases:


fase de examen fase de anlisis (propiamente dicho)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

El papel del analizador lxico Los tokens se pasan como valores simples Algunos tokens requieren algo ms que su propia identificacin:
constantes: su valor identificadores: el string operadores relacionales: su identificacin .....

Por lo tanto, el scanner debe realizar, a veces, una doble funcin:


identificar el token evaluar el token

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

El papel del analizador lxico


especificacin implementacin
5

Esquema de procesamiento

{lexemas}

{v0,resultado,..}

token e.r.
letra(letra|digito)* (ID,v0)

AFN AFD AFD mnimo

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

Tokens, lexemas y patrones lxicos Algunas definiciones:


token

nombre que se da a cada componente lxico


lexema

secuencia de caracteres de la entrada que corresponden a un token


patrn

forma compacta de describir conjuntos de lexemas

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

Tokens, lexemas y patrones lxicos Adems


un token se corresponde con un patrn un token se puede corresponder con muchos lexemas

Ejemplo: Identificadores
token IDENTIFICADOR letra lexemas posicin v_0
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta7

patrn dgito

letra _

Tokens, lexemas y patrones lxicos Tokens ms habituales:


palabras reservadas identificadores operadores constantes smbolos de puntuacin: smbolos especiales:

; , ()[]

Pero, a la vez que el propio token, el scanner puede (debe) devolver ms informacin
si es un token CONSTANTE, su valor si es un identificador, el string correspondiente si es un smbolo de puntuacin, cul

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

Tokens, lexemas y patrones lxicos Esta informacin, se devuelve mediante atributos Pero an puede hacer algo ms:
puede detectar algunos (pocos) errores sintcticos no hay concordancia con ningn patrn puede llevar a cabo algunas recuperaciones de errores filtrado de caracters extraos completar algn patrn reemplazar algn carcter

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

El papel del analizador lxico Proceso de construccin (con ayuda de herramientas)


{e.r.}

Generador de A.L. (lex, flex, ...)

c1...cn$

A.L.

tktk-1...t1 IkIk-1...I1
ci:carcter ti:token Ii:informacin asociada a ti
10

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

El papel del analizador lxico Qu pinta tiene un scanner?


un conjunto de funciones una para cada smbolo a reconocer estas funciones son controladas/invocadas por una funcin que: selecciona, en funcin de los caracteres de entrada, qu funcin invocar

Pero puede ser complicado:


necesidad de recorrer varios caracteres antes de decidir el tipo de token pre-anlisis look-ahead Ejemplo: reconocido < en C, puede corresponder a MENOR < MENOR_O_IGUAL <= SHIFT_LEFT << IF vs. IFNI

Opcionalmente, tambin mediante tablas

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

11

Expresiones regulares El scanner necesita una especificacin de qu lexemas corresponden a un token Ejemplo:
0.1 y 10.01 son lexemas que se corresponden al token que represente un nmero real Corresponden tambin .1 y 10. ?

Objetivos:
notacin formal para hacer corresponder tokens y lexemas (e.r.) construir scanners (fcil)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

12

Expresiones regulares Por otra parte:


todos los scanners hacen algo muy parecido por lo tanto, casi todos se construyen de la misma manera Se puede automatizar el proceso de construccin de scanners? Es decir, dada la especificacin formal de la correspondencia entre tokens y lexemas,

Se Se puede puede obtener obtener un un scanner scanner apretando apretando un un botn? botn?
Respuesta: generadores de analizadores lxicos (LEX, FLEX, ScanGen, ...)

Usaremos:
expresiones regulares autmatas finitos (D no D?)
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta13

Expresiones regulares. Definiciones


alfabeto

conjunto finito de smbolos


ejemplo

{0,1}, letras y dgitos,.


cadena

secuencia finita de elementos del alfabeto


ejemplo

0010, estadoInicial, v_0,...

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

14

Expresiones regulares. Definiciones


longitud de una cadena

nmero de elementos del alfabeto que la componen


ejemplos

|hola| |123456|

= 4 = 6 = 0 (cadena vaca)

lenguaje

dado un alfabeto, cualquier conjunto de cadenas formadas con dicho alfabeto


ejemplo

Siendo S={0,1} {0,01,011,0111,01111,...}


Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta15

Expresiones regulares. Definiciones Algo sobre cadenas:


concatenacin c1=hola, c2=Colega c1c2=holaColega

e es el neutro, tando a derecha como a izquierda: ec = ce = c

c0=e, c1=c, c2=cc, c3=ccc,.... terminologa prefijo, sufijo subcadena subsecuencia

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

16

Expresiones regulares. Definiciones Operadores sobre lenguajes:


Sean L,M dos lenguajes
unin de lenguajes

L M = {c|c L c M}
concatenacin de lenguajes

L M = {st|s L y t M}
cerradura de Kleene cerradura positiva

L* =

i=0

Li

L+ =

i=1

Li

CERO o MAS concatenaciones

UNA o MAS concatenaciones

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

17

Expresiones regulares. Definiciones Para un token dado, los lexemas correspondientes los expresaremos mediante expresiones regulares Expresin regular: forma compacta para definir un lenguaje regular
tambin llamado conjunto regular
lenguaje regular

El generado a partir de una expresin regular Una expresin regular r:


ser definida a partir del lenguaje L(r) que genera operadores sobre expresiones regulares mediante operadores sobre lenguajes
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta18

Expresiones regulares. Definiciones Sea S un alfabeto


expresin regular 1)

es la expresin regular cuyo lenguaje es L(e)={e}

2) Si aS, a es la expresin regular cuyo lenguaje es L(a)={a} a <> a 3)Sean r,s exp. reg. con lenguajes L(r) y L(s) (r)|(s) es la exp. reg. cuyo lenguaje es L(r) L(s) (r)(s) es la exp. reg. cuyo lenguaje es L(r)L(s) (r)* es la exp. reg. cuyo lenguaje es (L(r))* (r) es la exp. reg. cuyo lenguaje es L(r)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

19

Expresiones regulares. Definiciones Importante:


3.4) da la posibilidad de uso de parntesis para establecer prioridades

Util, usar prioridades:


prioridad operador * concatenacin | asociatividad izda. izda. izda.

expresiones regulares equivalentes

Generan el mismo lenguaje


Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta20

Expresiones regulares. Ejemplos Ejemplo 1: Sea S={a,b}


r ab a|b a* ab* (ab|c)*d L(r) {ab} {a,b} {e,a,aa,aaa,aaaa,...} {a,ab,ab,abbb,...} {d,abd,cd,abcd,ababcd,...}

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

21

Expresiones regulares. Ejemplos Ejemplo 2: Sea S={0,1}


00 (00)
el string 00

(1|10)* (0|1)*

y todos los strings que empiezan con

1 y no tienen dos 0 consecutivos, y

todos los strings con 0 ms 1 0

(0|1)*00(0|1)* (0|e)(1|10)* (0|1)*011


Compiladores I. C.P.S. Universidad de Zaragoza

todos los strings con al menos 2 0 consecutivos todos los strings que no tengan dos 0 consecutivos todos los strings que acaban en 011
-J.Ezpeleta22

Expresiones regulares. Notaciones Convenios de notacin tiles:


N.1) Si r representa L(r)

(r)+ representa L(r)+


Se cumple que: r* = e|r+ r+ = rr* N.2) Si r representa L(r)

una ms veces r - misma prioridad que * - misma asociatividad que *

(r)? representa {e} L(r)


Se cumple que r? = r|e
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-

0 1 vez

23

Expresiones regulares. Notaciones


N.3) bautismo de expr. reg. ser de ayuda dar nombre a determinadas exp. reg. para poder hacer referencia a ellas posteriormente usaremos la siguiente sintaxis

digito

0|1|2|3|4|5|6|7|8|9

signo +|-| e constanteEntera signo digito digito*


Notar que es lo mismo que

digito 0|1|2|3|4|5|6|7|8|9 signo +|-| e constanteEntera signo digito+


Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta24

Expresiones regulares. Notaciones


N.4) Formas abreviadas [....] expresa eleccin en un conjunto de elementos del alfabeto

[aeiou]
- expresa subrango

@ @

a|e|i|o|u

[0-9]
Ejemplos:

0|1|2|3|4|5|6|7|8|9

constanteEntera [+-]?[0-9]+ identPascal [a-zA-Z][_0-9a-zA-Z]*

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

25

Expresiones regulares. Notaciones A veces es interesante representar expr. reg. en forma de diagramas Ejemplo: (ab|c)*d
a c d b

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

26

Autmatas Finitos. Generalidades Ya sabemos expresar los lexemas correspondientes a los tokens Necesitamos implementar el analizador lxico Esquema para su implementacin
Estamos aqu! expresin expresin regular regular AFN AFN AFD AFD mnimo mnimo AFD AFD

A.L.

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

27

Autmatas Finitos. Generalidades Los autmatas finitos pueden ser utilizados para reconocer los lenguajes expresados mediante exprexiones regulares Un autmata finito (AF) es una mquina abstracta que reconoce strings correspondientes a un conjunto regular Tambin se denominan reconocedores Misin de un AF:
reconocer si un string de entrada respeta las reglas determinadas por una expresin regular

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

28

Autmatas Finitos. Definiciones


Autmata Finito No Determinista

Un 1) 2) 3)

AFN es una 5-tupla (S,S,d,s0,F) donde: S : conjunto de estados S : conjunto de smbolos de entrada d : funcin de transicin

d : S x S P(S) 4) s0 S : estado inicial 5) F S : conjunto de estados finales


(o de aceptacin) Es posible que

eS

!!
-J.Ezpeleta-

d : S

x S

P(S) !!
N.D.!
29

Compiladores I. C.P.S. Universidad de Zaragoza

Autmatas Finitos. Grafo de transiciones

Notacin grfica:
s s1 a s0 s2 un estado transitar de s1 a s2 cuando se reconozca a s0 es el estado inicial

> s0
f f

+
f

f es un estado final (de aceptacin)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

30

Autmatas Finitos. Grafo de transiciones

AFN como grafo de transiciones


c 1
inicio

5 a d c 4

d 3 3

6 6

b 2

1) S ={1,2,3,4,5,6} 2) S ={a,b,c,d} 3) d(1,c)={1} d(1,d)={3} d(1,a)={2,5} d(2,b)={1} d(2,e)={4} 4) s0 = 1 5) F = {3,6} d(4,c)={1} d(5,b)={6}

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

31

Autmatas Finitos. Aceptacin Cmo funciona un AFN? Dado un string, debe determinar si lo acepta o no
aceptacin de un string por un AFN

El string c1c2...cn es aceptado por un AFN cuando existe, en el grafo de transiciones, un camino s0 s1 s2 ... sm-1 sm de manera que sm es un estado final (de aceptacin)
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta32

c1

c2

cn

Autmatas Finitos. Aceptacin Ejemplo:


Aceptara el autmata abcd? Y acd?

c
inicio

1 b 2 a

d 3 3

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

33

Autmatas Finitos Deterministas Un Autmata Finito Determinista (AFD) es un caso particular de AFN
Autmata Finito Determinista

Un AFD es un AFN tal que: 1) e no etiqueta ningn arco 2) d : S x S S Es decir:


toda transicin exige un smbolo distinto de e desde un estado, no hay dos arcos etiquetados con el mismo smbolo

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

34

Autmatas Finitos Deterministas Simular un AFD es muy sencillo y eficiente En lo que sigue:
dada una e.r., generar el AFN Convertir el AFN en un AFD y minimizarlo Implementar el AFD

Func simulaAFD(x,A) dev (acep:booleano) /* Pre: x es la cadena a aceptar A=(S,S,d,s0,F) es el AFD Post:acep = x es aceptado por A */ Variables sAct:estado {ERROR};i:entero Principio <i,sAct>:=<1,s0> Mq sAct<>ERROR i<=length(x) sAct:=mueve(A,sAct,x[i]) /*nico*/ i:=i+1 Complejidad? FMq acep:=(sActF) Fin

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

35

Conversin de una expresin regular a AFN

Objetivo: dada una expresin regular, generar un AFD que la reconozca Mtodo: construccin de Thompson (Bell Labs.)
AF para

e
S1

inicio

S2

AF para a S inicio S1 a S2

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

36

Conversin de una expresin regular a AFN AF para la expresin regular R1R2 R1 inicio

R2

AF para la expresin regular R1|R2 inicio S1

e e
Ri

R1 R2

e e

S2 S2

AFN para Ri
37

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

Conversin de una e.r. en un AFN AF para la expresin regular R*

inicio

S1

e
R

S2 S2

AF para un conjunto de ER inicio

e e e

S1 S2 S3

e e e

R1 R2 R3

e e

e
S

....
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-

e
38

Conversin de una expresin regular a AFN

Ejemplo: proceso de construccin para (ab|c)*d


inicio (ab|c)*

e e
4

2 2 d

e
inicio 3

ab|c

2 2

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

39

Conversin de una e. r. en un AFN inicio 3 ab 6 c

e e
7 8

2 2

e e

e
b 12

9 inicio 3

e
11

10

e
5

e
8

2 2

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

40

Transformacin de un AFN en un AFD Generar un AFN a partir de una e.r. es sencillo Implementar un AFD es ms sencillo y eficiente que implementar un AFN Por lo tanto, es interesante saber generar, a partir de un AFN, un AFD equivalente El mtodo se basa en la idea de e-clausura (ver [HoUl 79])

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

41

Transformacin de un AFN en un AFD La idea bsica es que un estado del AFD agrupa un conjunto de estados del AFN Ejemplo:
1 AFN inicio a 3 1,2 inicio AFD

2 a 4

5 5

b a

a b b a b 5 5

3,4,5 3,4,5 a

4,5 4,5

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

42

Transformacin de un AFN en un AFD Sea A=(S,S,d,s0,F)un AFN e-clausura de sS Conjunto de estados de N alcanzables desde s usando transiciones e e-clausura de T S

sT

clausurae(s)

mueve(T,c) Conjunto de estados a los que se puede llegar desde algn estado de de T mediante la transicin c
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta43

Transformacin de un AFN en un AFD Algoritmo para simular un AFN Func simulaAFN(x,A) dev (acep:booleano) /* Pre: x es la cadena a aceptar A=(S,S,d,s0,F) es el AFN Post:acep = x es aceptado por A */ Variables T:conjunto(estados {ERROR}) i:entero Principio <i,T>:=<1,clausurae({s0})> Mq T<>{ERROR} i<=length(x) T:=clausurae(mueve(A,T,x[i])) i:=i+1 FMq acep:=(T F<>) Fin
-J.Ezpeleta44

Compiladores I. C.P.S. Universidad de Zaragoza

Minimizacin de AFD Algunas cuestiones:


Como es lgico, cuantos ms estados tiene un AF, ms memoria es necesaria El nmero de estados del AFD se puede/debe minimizar (ver [HoUl 79]) inicialmente, dos estados:
uno con los de aceptacin otro con los dems

sucesivas particiones de estados globales que no concuerdan con algn sucesor para un smbolo de entrada El AFD mnimo equivalente es nico

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

45

Minimizacin de AFD Ejemplo:


1 a d 2 5 b b c 3,6 b 3 6 c c 4 4 7 7

1,2,3 5,6 1,2 5 1 a d


Compiladores I. C.P.S. Universidad de Zaragoza

4,7 4,7 c 4,7 4,7 3,6 c 4,7 4,7

2,5

-J.Ezpeleta-

46

Transformacin de un AFN en un AFD


Complejidad calculada:

espacio AFN AFN AFD AFD

tiempo

O(|r|) O(2|r|)

O(|r|x|x|) O(|x|)

r: expresin regular x: string a reconocer A destacar: AFN son mejores en espacio


tener en cuenta que en su AFD, cada estado del AFN se puede almacenar varias veces

AFD son mejores en cuanto a velocidad de reconocimiento

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

47

Transformacin de un AFN en un AFD

3 conv. curso 95/96

Ejercicio 1 (3 ptos.): Los identificadores para un determinado lenguaje de programacin se definen de acuerdo con la siguiente descripcin: Un identificador puede empezar con una letra o un "underscore" (carcter "_"), debe estar seguido por 0 ms letras, dgitos o underscores, pero con las restricciones siguientes: 1) No pueden aparecer dos underscores seguidos 2) Un identificador no puede terminar con un underscore. Adems, no hay ninguna limitacin en cuanto a la longitud de los identificadores. 1.1) (1.5 ptos.) Dibujar el Autmata Finito Determinista que corresponde a los identificadores descritos anteriormente. Para etiquetar los arcos, en lugar de utilizar caracteres simples utilizar las siguientes clases de caracteres: letra [a-zA-Z] digito [0-9] und "_"

1.2) (1.5 ptos.) Dar una expresin regular correspondiente a los identificadores descritos anteriormente
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta48

Transformacin de un AFN en un AFD

2 conv. curso 96/97

Ejercicio 3 (0.75 ptos.): El libro "Pascal: User Manual and Report" de K. Jensen y N. Wirth, que establece la especificacin ISO Pascal Standard, define un comentario del lenguaje como (slo vamos a considerar comentarios vlidos aqullos que empiezan por "(*" y terminan por "*)"): "(*" seguido de cualquier secuencia de 0 ms caracteres que no contenga "*)", y terminado por "*) Escribir una expresin regular con sintaxis LEX para los comentarios Pascal as definidos. Ejercicio: Dar una expresin regular para los strings de Ada

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

49

Sobre implementacin de AL Un AFN se suele implementar:


mediante una

tabla tabla de de transiciones transiciones


El grafo aparece explcitamente Entrada: (estado, smbolo) Salida: nuevo estado a pelo el grafo de transiciones no est explcitamente implementado

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

50

Sobre implementacin de AL Ejemplo: (ab|c)*d


c 1
inicio

d a

b 2

3 3

smbolo entrada e s t a d o

a
1 2 3 2
ERR acep

b
ERR

c
1
ERR acep

d
3
ERR acep

1
acep

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

51

Un analizador lxico muy simple Propuesta: Un analizador lxico para un evaluador de expresiones Involucra:
constantes enteras sin signo operadores relacionales <,<=,>,>=,<>,= identificadores de variables

Componentes lxicos:
Compiladores I. C.P.S. Universidad de Zaragoza

menor < mayor > menorIgual <= mayorIgual >= igual = distinto <> letra a|b|...|z|A|B|....|Z digito 0|1|...|9 identificador letra (letra |digito)* constEntera digito digito*

-J.Ezpeleta-

52

Un analizador lxico muy simple Ejemplo de uso:


v0<>27 segundos= 1000

analizador analizador lxico lxico


(IDENTIFICADOR,v0) (DISTINTO,) (CONSTENTERA,27) (IDENTIFICADOR,segundos) (IGUAL,) (CONSTENTERA ,1000)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

53

/*---------------------------------------------Implementacin con TTen stdin corresponde al PRE : el primer carcter primer carcter del siguiente lexema. Cualquier valor para 'yylval', 'yytext', 'yyleng' POST: se ha procesado un lexema. El siguiente carcter en stdin corresponde al primer carcter de un nuevo lexema. * Devuelve el token correspondiente al lexema tratado * asignado a la variable global 'yylval' el valor adecuado (si necesario) * la var. global 'yytext' contiene el lexema tratado * la var. global 'yyleng' contiene la long. del lexema ----------------------------------------------*/ token yylex() void main() { ........ } { token elToken; void reconocido(token elToken) { ........ }

do{

}
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta-

elToken=yylex(); reconocido(elToken); }while(elToken!=FIN);


54

Un analizador lxico muy simple Grafo de estados:


1 <
separador

accin de aceptacin

>

2 2 3 3 4 4 6 6 7 7

return(DISTINTO,) return(MENORIGUAL,) return(MENOR,) return(MAYORIGUAL,) return(MAYOR,)

> =
letra

5 8 8 9

e e

dev(IGUAL,)

digito

digito
separador representa

letra

10 10 12 12

return(IDENTIFICADOR, nombre) return(CONSTENTERA,valor)

11
digito

{\t,\n, }

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

55

Un analizador lxico muy simple Consideraciones para su implementacin


1) Saltaremos separadores:
separador

\t

\n

0
2) Sobre la entrada: carcter a carcter: buffer de entrada de tamao 1 entrada de stdin termina con $
no corresponde a ningn lexema devuelve un token ficticio FIN

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

56

Un analizador lxico muy simple


3) Usaremos algunas variables globales Por qu globales?
yytext

string con el lexema reconocido


yylval

entero con informacin necesaria (valor de las ctes., p.e.)


yyleng

longitud del lexema

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

57

#include <stdio.h> typedef int token; #include <ctype.h> /*isdigit(),isalpha()...*/ char sigCar, *delante, #define FIN 0 yytext[YYLMAX]; /*el lexema*/ #define MENOR 256 int yyleng, /*long. del lexema*/ #define MENORIGUAL 257 yylval; /*para atributos*/ #define MAYOR 258 int estado; /*el estado*/ #define MAYORIGUAL 259 #define IGUAL 260 #define DISTINTO 261 #define IDENTIFICADOR 262 hab., sern #define CONSTENTERA 263 128 #define NUMESTADOS #define NUMCARS #define ERROR #define carFin 13 41 -1 '$'
/*fin de ent.*/

Implementacin con TT

/* 'a'...'z''0'...'9' '<' '>' '=' ' ' OTROS */

#define YYLMAX 100 #define PONCAR(pC,C,L) {sprintf(pC++,"%c",C);L++;}

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

58

Implementacin con TT Las transiciones


a...z0...9 < > = otros 0 1 9 ... 9 4 ... 4 11... 11 4... 4 1 4 5 2 8 3 0 4 ERR 4

. . . . . . .

.................

12

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

59

Implementacin con TT Parte del autmata


int T[NUMESTADOS][NUMCARS]={ {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,11,11,11,11,11,11,11,11,11, 11,1,5,8,0,ERROR}, ........ } int aceptacion[NUMESTADOS]= {0,0,1,1,1,0,1,1,1,0,1,0,1};

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

60

token yylex() Implementacin con TT { int sigEstado, seguir=1; yyleng=0;

/* posible nuevo estado */

} Compiladores I. C.P.S. Universidad de Zaragoza

yytext[0]='\0'; /* de momento, lexema vac'io */ delante=yytext; estado=0; sigCar=getchar(); gen., no if(sigCar==carFin) return FIN; necesario do{ sigEstado=T[estado][pos(sigCar)]; if(sigEstado == ERROR) seguir=0; saltar else{ separadores estado=sigEstado; if(!isspace(sigCar)) PONCAR(delante, sigCar, yyleng); if(aceptacion[estado]) seguir=0; ... else{ sigCar=getchar(); if(aceptacion[estado]) if(sigCar==carFin) return tokenAceptacion(); seguir=0; else if(sigCar==carFin) } return FIN; } else }while(seguir); errorLexico(); ... }
-J.Ezpeleta-

61

/*----------------------------------------------PRE : global 'estado' con Implementacin con TTun estado de aceptacin yyleng,yytext como siempre POST: tokenAceptacion=token correspondiente. (lo da el estado) Adems, ejecuta las acciones asociadas a los estados de aceptacin -----------------------------------------------*/ elimina ult. token tokenAceptacion(){ car. de yytext switch(estado){ case 2: return DISTINTO; case 3: return MENORIGUAL; case 4: yytext[yyleng-1]='\0'; yyleng--; ungetc(sigCar, stdin); return MENOR; case 10: yytext[yyleng-1]='\0'; case 6: return MAYORIGUAL; yyleng--; case 7: yytext[yyleng-1]='\0'; ungetc(sigCar, stdin); yyleng--; return IDENTIFICADOR; ungetc(sigCar, stdin); case 12: yytext[yyleng-1]='\0'; return MAYOR; yyleng--; case 8: return IGUAL; ungetc(sigCar, stdin); ... sscanf(yytext, "%d", &yylval); } return CONSTENTERA; valor } entero
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta62

Implementacin con TT El objetivo bsico de una implementacin de un AF es dar la aplicacin


(estado, carEntrada) sigEstado

La ms natural:
tabla como array una fila por cada estado una columna por cada carcter posible de entrada en general, 128 columnas

Ventajas:
fcil de programar (trivial) acceso rpido

Inconvenientes:
despilfarro de memoria
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta63

Implementacin con TT Para evitar el problema de la memoria


tcnicas de compactacin de tablas

METODO 1: basado en ...0 0 que muchas columnas/filas suelen ser idnticas 0 0 Ejemplo: asumamos 6 1 1 estados (S0,...,S5) 2 2
3 3 4 4 5 4

...a b c d...0 1 2 3... ...2 2 2 1...

-1 3 -1 2 -1 -1 -1 -1 -1 -1

1 -1 1 5 2 5 2 -1 4 -1

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

64

Implementacin con TT METODO 2: especialmente til cuando la matriz de transicin es muy dispersa Ejemplo: asumamos 6 estados (S0,...,S5)

0 1 2 3 4 5

4 a 3 . 0 x 5 1 1 ...... 2 $ 0 1 3 ......

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

65

Sobre recuperacin de errores lxicos Cuando un scanner detecta un error lxico


NO abortar la compilacin + RECUPERAR

Tres aproximaciones:

panic-mode

borrar los caracteres ledos hasta la deteccin del error borrar el primer carcter ledo y recomenzar el anlisis aadir algn carcter (si est claro)

Errores ms comunes:
debidos a un carcter extrao suelen aparecer al principio del lexema desbordamiento de variables/constantes fin de lnea antes de cerrar un string problemas cerrar/abrir comentarios

string,..

Opcionalmente: pasar al analizador sintctico un token de ERROR,


junto con el string que lo forma
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta66

Você também pode gostar