Escolar Documentos
Profissional Documentos
Cultura Documentos
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)
-J.Ezpeleta-
-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 .....
-J.Ezpeleta-
Esquema de procesamiento
{lexemas}
{v0,resultado,..}
token e.r.
letra(letra|digito)* (ID,v0)
-J.Ezpeleta-
-J.Ezpeleta-
Ejemplo: Identificadores
token IDENTIFICADOR letra lexemas posicin v_0
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta7
patrn dgito
letra _
; , ()[]
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
-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
-J.Ezpeleta-
c1...cn$
A.L.
tktk-1...t1 IkIk-1...I1
ci:carcter ti:token Ii:informacin asociada a ti
10
-J.Ezpeleta-
-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)
-J.Ezpeleta-
12
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
-J.Ezpeleta-
14
|hola| |123456|
= 4 = 6 = 0 (cadena vaca)
lenguaje
-J.Ezpeleta-
16
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
-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
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)
-J.Ezpeleta-
19
-J.Ezpeleta-
21
(1|10)* (0|1)*
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
0 1 vez
23
digito
0|1|2|3|4|5|6|7|8|9
[aeiou]
- expresa subrango
@ @
a|e|i|o|u
[0-9]
Ejemplos:
0|1|2|3|4|5|6|7|8|9
-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
-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.
-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
-J.Ezpeleta-
28
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
eS
!!
-J.Ezpeleta-
d : S
x S
P(S) !!
N.D.!
29
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
-J.Ezpeleta-
30
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}
-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
c
inicio
1 b 2 a
d 3 3
-J.Ezpeleta-
33
Autmatas Finitos Deterministas Un Autmata Finito Determinista (AFD) es un caso particular de AFN
Autmata Finito Determinista
-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
-J.Ezpeleta-
35
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
-J.Ezpeleta-
36
Conversin de una expresin regular a AFN AF para la expresin regular R1R2 R1 inicio
R2
e e
Ri
R1 R2
e e
S2 S2
AFN para Ri
37
-J.Ezpeleta-
inicio
S1
e
R
S2 S2
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
e e
4
2 2 d
e
inicio 3
ab|c
2 2
-J.Ezpeleta-
39
e e
7 8
2 2
e e
e
b 12
9 inicio 3
e
11
10
e
5
e
8
2 2
-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])
-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
-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
sucesivas particiones de estados globales que no concuerdan con algn sucesor para un smbolo de entrada El AFD mnimo equivalente es nico
-J.Ezpeleta-
45
2,5
-J.Ezpeleta-
46
tiempo
O(|r|) O(2|r|)
O(|r|x|x|) O(|x|)
-J.Ezpeleta-
47
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
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
-J.Ezpeleta-
49
-J.Ezpeleta-
50
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
-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
-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-
accin de aceptacin
>
2 2 3 3 4 4 6 6 7 7
> =
letra
5 8 8 9
e e
dev(IGUAL,)
digito
digito
separador representa
letra
10 10 12 12
11
digito
{\t,\n, }
-J.Ezpeleta-
55
\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
-J.Ezpeleta-
56
-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
-J.Ezpeleta-
58
. . . . . . .
.................
12
-J.Ezpeleta-
59
-J.Ezpeleta-
60
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
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
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
-1 3 -1 2 -1 -1 -1 -1 -1 -1
1 -1 1 5 2 5 2 -1 4 -1
-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 ......
-J.Ezpeleta-
65
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,..