Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2 Analisislexico PDF
2 Analisislexico PDF
programa fuente
tabla de símbolos analizador léxico
(scanner)
tokens
analizador sintáctico
(parser)
.....
program principal(input,output);
....
prog
yylex()
program
ProGRam cabecera bloque .
PRogram (tkPROG)
...
tkPROG tkID listaParsProg
yylex()
principal
pRinCipal (tkID,PRINCIPAL)
...
• Pero, además
– procesar directivas al compilador
– introducir información preliminar en la tabla de símbolos (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 sintácticamente complejo, dos
fases:
– fase de examen
– fase de análisis (propiamente dicho)
• Esquema de procesamiento
especificación
{v0,resultado,..}
{lexemas}
token
e.r. (ID,”v0”)
implementación
letra(letra|digito)* AFN
AFD
AFD mínimo
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 6
Tokens, lexemas y patrones léxicos
• Algunas definiciones:
token
lexema
secuencia de caracteres de la entrada que
corresponden a un token
patrón
• Además
– un token se corresponde con un patrón
– un token se puede corresponder con muchos lexemas
• Ejemplo: Identificadores
token patrón
IDENTIFICADOR dígito
letra
lexemas letra
posición _
v_0
Generador de A.L.
(lex, flex, “a mano”,...)
ci:carácter
IkIk-1...I1 ti:token
Ii:información
asociada a ti
alfabeto
conjunto finito de símbolos
ejemplo
{0,1}, letras y dígitos,.
cadena
secuencia finita de elementos del alfabeto
ejemplo
0010, estadoInicial, v_0,...
ejemplos
|hola| = 4
|123456| = 6
ε = 0 (cadena vacía)
lenguaje
dado un alfabeto, cualquier conjunto de cadenas
formadas con dicho alfabeto
ejemplo
unión de lenguajes
L∪ M = {c|c ∈ L ó c ∈ M}
concatenación de lenguajes
L M = {st|s ∈ L y t ∈ M}
L* = ∪∞
i=0
Li L+ = ∪∞
i=1
Li
• Sea Σ un alfabeto
expresión regular
1) ε es la expresión regular cuyo lenguaje es L(ε)={ε}
2) Si a∈Σ, a es la expresión 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 paréntesis para establecer prioridades
• Util, usar prioridades:
prioridad operador asociatividad
* izda.
concatenación 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 mínimo
mínimo
AFD
AFD
– ¿autómata?
¡¡ δ : S x Σ →
¡¡ Es posible que ε∈Σ !!
P(S) !!
¡N.D.!
• Notación gráfica:
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 aceptación)
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
Autómatas Finitos. Aceptación
c1 c2 ε cn
s0 → s1 → s2 → ... → sm-1 → sm
• Ejemplo:
– ¿Aceptaría el autómata “abcd”? ¿Y ”acd”?
c
1 d
inicio
33
b a
2
• Ejemplo:
– ¿Aceptaría el autómata “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 transición exige un símbolo distinto de ε
– desde un estado, no hay dos arcos etiquetados con el mismo símbolo
• 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:=(sAct∈F)
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 lógico, cuantos más estados tiene un AF, más memoria es
necesaria
– El número de estados del AFD se puede/debe minimizar (ver [HoUl 79])
» inicialmente, dos estados:
• uno con los de aceptación
• otro con los demás
» sucesivas particiones de estados “globales” que no concuerdan con
algún sucesor para un símbolo de entrada
– El AFD mínimo 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|)
Un identificador puede empezar con una letra o un "underscore" (carácter "_"), debe
estar seguido por 0 ó más letras, dígitos o underscores, pero con las restricciones
siguientes:
1) No pueden aparecer dos underscores seguidos
2) Un identificador no puede terminar con un underscore.
Además, no hay ninguna limitación en cuanto a la longitud de los identificadores.
1.1) (1.5 ptos.) Dibujar el Autómata 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 expresión regular correspondiente a los identificadores
descritos anteriormente
Escribir una expresión regular con sintaxis LEX para los comentarios Pascal
así definidos.
1 0
0 1 2
1
1 0
0
• Ejemplo: (ab|c)*d
c
1
d
33
b a
inicio
2
símbolo 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 léxico 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 léxicos:
• Ejemplo de uso:
v0<>27 segundos= 1000
analizador
analizador
léxico
léxico
(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 léxico muy simple
separador
2) Sobre la entrada:
» carácter a carácter: buffer de entrada de tamaño 1
» entrada de stdin
» termina con ‘$’
• no corresponde a ningún lexema
• devuelve un token “ficticio” ‘FIN’
yytext
string con el lexema reconocido
yylval
entero con información 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 “más natural”:
– tabla como array
» una fila por cada estado
» una columna por cada carácter posible de entrada
– en general, 128 columnas
• Ventajas:
– fácil de programar (trivial)
– acceso rápido
• Inconvenientes:
– “despilfarro” de memoria
Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 62
Implementación con TT