Académique Documents
Professionnel Documents
Culture Documents
programa fuente
tabla de smbolos analizador lxico
(scanner)
tokens
analizador sintctico
(parser)
.....
program principal(input,output);
....
prog
yylex()
program
ProGRam cabecera bloque .
PRogram (tkPROG)
...
tkPROG tkID listaParsProg
yylex()
principal
pRinCipal (tkID,PRINCIPAL)
...
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)
Esquema de procesamiento
especificacin
{v0,resultado,..}
{lexemas}
token
e.r. (ID,v0)
implementacin
letra(letra|digito)* AFN
AFD
AFD mnimo
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 6
Tokens, lexemas y patrones lxicos
Algunas definiciones:
token
lexema
secuencia de caracteres de la entrada que
corresponden a un token
patrn
Adems
un token se corresponde con un patrn
un token se puede corresponder con muchos lexemas
Ejemplo: Identificadores
token patrn
IDENTIFICADOR dgito
letra
lexemas letra
posicin _
v_0
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
Generador de A.L.
(lex, flex, a mano,...)
ci:carcter
IkIk-1...I1 ti:token
Ii:informacin
asociada a ti
alfabeto
conjunto finito de smbolos
ejemplo
{0,1}, letras y dgitos,.
cadena
secuencia finita de elementos del alfabeto
ejemplo
0010, estadoInicial, v_0,...
ejemplos
|hola| = 4
|123456| = 6
= 0 (cadena vaca)
lenguaje
dado un alfabeto, cualquier conjunto de cadenas
formadas con dicho alfabeto
ejemplo
unin de lenguajes
L M = {c|c L c M}
concatenacin de lenguajes
L M = {st|s L y t M}
L* =
i=0
Li L+ =
i=1
Li
Sea un alfabeto
expresin regular
1) es la expresin regular cuyo lenguaje es L()={}
2) Si a, a es la expresin regular cuyo lenguaje
es L(a)={a}
3)Sean r,s exp. reg. con lenguajes L(r) y L(s) a <> a
Importante:
3.4) da la posibilidad de uso de parntesis para establecer prioridades
Util, usar prioridades:
prioridad operador asociatividad
* izda.
concatenacin izda.
| izda.
ab {ab}
a|b {a,b}
a* {,a,aa,aaa,aaaa,...}
ab* {a,ab,ab,abbb,...}
(ab|c)*d {d,abd,cd,abcd,ababcd,...}
(0|)(1|10)*
todos los strings que no tengan dos 0
consecutivos
AFN AFD
AFD
AFN mnimo
mnimo
AFD
AFD
autmata?
: S x
Es posible que !!
P(S) !!
N.D.!
Notacin grfica:
s un estado
a transitar de s1 a s2
s1 s2
cuando se reconozca a
s0
s0 es el estado inicial
> s0
ff
f es un estado final
+ (de aceptacin)
f
1) S ={1,2,3,4,5,6}
2) ={a,b,c,d}
3) (1,c)={1} (1,d)={3} (1,a)={2,5} (2,b)={1}
(2,)={4} (4,c)={1} (5,b)={6}
4) s0 = 1
5) F = {3,6}
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 25
Autmatas Finitos. Aceptacin
c1 c2 cn
s0 s1 s2 ... sm-1 sm
Ejemplo:
Aceptara el autmata abcd? Y acd?
c
1 d
inicio
33
b a
2
Ejemplo:
Aceptara el autmata abcd?
El indeterminismo puede generar problemas de eficiencia (backtraking)
5 b
66
c a
inicio 1 d
33
b a
c
2
4
Es decir:
toda transicin exige un smbolo distinto de
desde un estado, no hay dos arcos etiquetados con el mismo smbolo
Simular un AFD
es muy sencillo Func simulaAFD(x,A) dev (acep:booleano)
y eficiente /* Pre: x es la cadena a aceptar
A=(S,,,s0,F) es el AFD
En lo que sigue: Post:acep = x es aceptado por A
dada una e.r., */
generar el AFN Variables sAct:estado {ERROR};i:entero
Convertir el Principio
AFN en un <i,sAct>:=<1,s0>
AFD y Mq sAct<>ERROR i<=length(x)
minimizarlo sAct:=mueve(A,sAct,x[i]) /*nico*/
Implementar el i:=i+1
AFD FMq Complejidad?
acep:=(sActF)
Fin
AF para a
a
inicio S1 S2
R1 R2
inicio
Ri AFN para Ri
AF para un conjunto de ER
S1
R1
inicio
S2
R2
S
S3
R3
....
(ab|c)* 1
d
22
inicio
d
inicio 3
ab|c 4 1 22
inicio
ab
3 5 8 4 1 d 22
6
c
7
9
a
10 11
b
12
inicio
3 5 8 4 1
d
22
6 c
7
a b
1,2 3,4,5
3,4,5 4,5
4,5
inicio a a
AFD b
55
mueve(T,c)
Ejercicio:
Escribir el algoritmo clausura
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
Ejemplo:
b c
a 2 3 44
1
d 5 6 77
b c
1,2,3 c 4,7
4,7
5,6
1,2 b 3,6 c 4,7
5 4,7
a
1 2,5 b 3,6 c 4,7
4,7
d
Complejidad calculada:
espacio tiempo
AFN
AFN (|r|) (|r|x|x|)
AFD
AFD (2|r|) (|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
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:
1.2) (1.5 ptos.) Dar una expresin regular correspondiente a los identificadores
descritos anteriormente
Escribir una expresin regular con sintaxis LEX para los comentarios Pascal
as definidos.
( "(* | { ) commentary ( *) | } )
1 0
0 1 2
1
1 0
0
Ejemplo: (ab|c)*d
c
1
d
33
b a
inicio
2
smbolo entrada
e
s a b c d
t 1 2 ERR 1 3
a 2 ERR 1 ERR ERR
d
o 3 acep acep acep acep
Propuesta:
Un analizador lxico menor <
para un evaluador de mayor >
expresiones menorIgual <=
mayorIgual >=
Involucra: igual =
constantes enteras sin distinto <>
signo letra a|b|...|z|A|B|....|Z
operadores relacionales digito 0|1|...|9
<,<=,>,>=,<>,= identificador
identificadores de letra (letra |digito)*
variables constEntera
digito digito*
Componentes lxicos:
Ejemplo de uso:
v0<>27 segundos= 1000
analizador
analizador
lxico
lxico
(IDENTIFICADOR,v0)
(DISTINTO,)
(CONSTENTERA,27)
(IDENTIFICADOR,segundos)
(IGUAL,)
(CONSTENTERA ,1000)
9 10 return(IDENTIFICADOR,
10
digito letra nombre)
11 12
separador representa 12 return(CONSTENTERA,valor)
{\t,\n, }
digito
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 54
Un analizador lxico muy simple
separador
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
yytext
string con el lexema reconocido
yylval
entero con informacin necesaria
(valor de las ctes., p.e.)
yyleng
longitud del lexema
Parte
del int T[NUMESTADOS][NUMCARS]={
aut- {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,
mata 11,1,5,8,0,ERROR},
........
int aceptacion[NUMESTADOS]=
{0,0,1,1,1,0,1,1,1,0,1,0,1};
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.Ezpeleta- 62
Implementacin con TT
4 a 3 . 0 x 5 1 1
0
1 ......
2
3
4 2 $ 0 1 3
5
......