compiladores análisis léxico oscar bonilla [email protected] universidad galileo
TRANSCRIPT
CompiladoresAnálisis Léxico
Oscar [email protected] Galileo
Anatomía de un compilador
Analizador Sintáctico (Parser)
Generador de Código
Optimizador de Código
Analizador Semántico
Analizador Léxico (Scanner)
Parse Tree
Programa (character stream)
Token stream
Intermediate Representation
Optmized Intermediate Representation
Assembly code
Ayer vimos NDFA's
Podemos convertir fácilmente una expresión regular a unAutómaton Finito No Determinístico.
Los Autómata Finitos No Determinísticos son muy difícilesde Implementar ya que tienen que adivinar qué arista tomar.
Así que convertimos el Autómaton Finito No Determinísticoa un Autómaton Finito Determinístico.
Cerradura
La cerradura de un estado es el conjunto de estados que pueden alcanzarse desde ese estado sin consumir ningúnsímbolo de la entrada.
La cerradura de un estado S, Closure(S) es el conjunto T máspequeño tal que:
Algoritmo:
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {}T' = {}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {1}T' = {}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {1}T' = {1}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {1,2}T' = {1}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {1,2}T' = {1}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {1,2}T' = {1,2}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {1,2}T' = {1,2}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {1,2}T' = {1,2}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
S = {1}T = {1,2}T' = {1,2}
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?S = {3}T = ??
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
Pregunta: Que es Closure(3) ?
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?S = {3}T = {2, 3, 4, 8}
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
Pregunta: Que es Closure(3) ?
Arista DFA
Supongamos que estamos en un conjunto de estados del NFA,si consumimos un símbolo de la entrada, ¿Qué otro conjunto de estados podemos alcanzar?
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
(-| ?) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?
d = {1}
DFAedge({1}, 3) = ??
Que es DFAedge({1},3)?
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
(-| ?) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?
d = {1}edge({1},3) = {}
DFAedge({1}, 3) = ??
Que es DFAedge({1},3)?
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
(-| ?) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?
d = {1}closure({1}) = {1, 2}
DFAedge({1}, 3) = ??
Que es DFAedge({1},3)?
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
(-| ?) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?
d = {1}edge({1}, 3} = {}
DFAedge({1}, 3) = {}
Que es DFAedge({1},3)?
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
(-| ?) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?
d = {1}edge({2}, 3} = {3}
DFAedge({1}, 3) = {3}
Que es DFAedge({1},3)?
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
(-| ?) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?
d = {1}closure({3}) = {2, 3, 4, 8}
DFAedge({1}, 3) = {2, 3, 4, 8}
Que es DFAedge({1},3)?
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
(-| ?) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?
d = {3}
DFAedge({1}, 3) = ??
Que es DFAedge({3},.)?
3
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 4 5 6 7 8
(-| ?) ·(0|1|2|3|4|5|6|7|8|9)+ · (. ·(0|1|2|3|4|5|6|7|8|9)*)?
d = {3}
DFAedge({1}, 3) = {4, 5, 6, 8}
Que es DFAedge({3},.)?
Algoritmo
states[0] {}; states[1] closure({s1})p 1; j 0while j p
foreach c e DFAedge(states[ j ], c)if e = states[i] for some i pthen
trans[j,c] ielse
p p + 1states[p] etrans[j,c] p
j j + 1
Sea el alfabeto.
Implementación de DFA
El algoritmo anterior construye una matriz de transición quesirve para implementar el DFA.
int trans[][256] = { /* ... 0 1 2 ... - ... e f g h i j ... *//* estado 0 */ {0,0...0,0,0,... 0 ... 0,0,0,0,0,0 ... *//* estado 1 */ {0,0...7,7,7,... 9 ... 4,4,4,4,2,4 ... *//* estado 2 */ {0,0...4,4,4,... 0 ... 4,3,4,4,4,4 ... *//* estado 3 */ {0,0...4,4,4,... 0 ... 4,4,4,4,4,4 ... *//* estado 4 */ {0,0...4,4,4,... 0 ... 4,4,4,4,4,4 ... *//* estado 5 */ {0,0...6,6,6,... 0 ... 0,0,0,0,0,0 ... */et cetera}
Usamos el estado 0 para representar la ausencia de una arista
Algoritmostates[0] {}; states[1] closure({s1})p 1; j 0while j p
foreach c e DFAedge(states[ j ], c)if e = states[i] for some i pthen
trans[j,c] ielse
p p + 1states[p] etrans[j,c] p
j j + 1
Sea el alfabeto.
Cuándo j = 0 el algoritmo construye el estado 0
int trans[][256] = { /* ... 0 1 2 ... - ... e f g h i j ... *//* estado 0 */ {0,0...0,0,0,... 0 ... 0,0,0,0,0,0 ... *//* estado 1 */ {0,0...7,7,7,... 9 ... 4,4,4,4,2,4 ... *//* estado 2 */ {0,0...4,4,4,... 0 ... 4,3,4,4,4,4 ... *//* estado 3 */ {0,0...4,4,4,... 0 ... 4,4,4,4,4,4 ... *//* estado 4 */ {0,0...4,4,4,... 0 ... 4,4,4,4,4,4 ... *//* estado 5 */ {0,0...6,6,6,... 0 ... 0,0,0,0,0,0 ... */et cetera}
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
closure({1}) = {1, 2}
1,2
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
DFAedge({1,2}, -) = {2}
1,2
2
-
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
closure({2}) = {2}
1,2
2
-
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
DFAedge({1,2},0..9) = {3}
1,2
2
3
-
o,1,2,3,4,5,6,7,8,9
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
closure({3}) = {2,3,4,8}
1,2
2
2,3,4,8
-
o,1,2,3,4,5,6,7,8,9
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
DFAedge({2}, 0..9) = {3}closure({3}) = {2,3,4,8}
1,2
2
2,3,4,8
-
o,1,2,3,4,5,6,7,8,9
o,1,
2,3,
4,5,
6,7,
8,9
o, 1
,5
8,9
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
DFAedge({2,3,4,8}, 0..9) = {3}closure({3}) = {2,3,4,8}
1,2
2
2,3,4,8
-
o,1,2,3,4,5,6,7,8,9
o,1,
2,3,
4,5,
6,7,
8,9
o, 1
,5
8,9
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
DFAedge({2,3,4,8}, .) = {5}closure({5}) = {5,6,8}
1,2
2
2,3,4,8
5,6,8-
o,1,2,3,4,5,6,7,8,9
o,1,
2,3,
4,5,
6,7,
8,9
.
o, 1
,5
8,9
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
DFAedge({5,6,8}, 0..9) = {7}closure({7}) = {6,7,8}
1,2
2
2,3,4,8
5,6,8
6,7,8
-
o,1,2,3,4,5,6,7,8,9
o,1,
2,3,
4,5,
6,7,
8,9
.
o,1,2,3,4,5,6,7,8,9
,3 7,
o, 1
,5
8,9
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
DFAedge({6,7,8}, 0..9) = {7}closure({7}) = {6,7,8}
1,2
2
2,3,4,8
5,6,8
6,7,8
-
o,1,2,3,4,5,6,7,8,9
o,1,
2,3,
4,5,
6,7,
8,9
.
o,1,2,3,4,5,6,7,8,9
,3 7,
o, 1
,5
8,9
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
1,2
2
2,3,4,8
5,6,8
6,7,8
-
o,1,2,3,4,5,6,7,8,9
o,1,
2,3,
4,5,
6,7,
8,9
.
o,1,2,3,4,5,6,7,8,9
El estado de aceptación es 8,así que marcamos los estadosque contienen a 8 como estadosaceptados.
,3 7,
o, 1
,5
8,9
(-| (0|1|2|3|4|5|6|7|8|9)+ (. (0|1|2|3|4|5|6|7|8|9)*)?
-
0
123
4
5
67
8
9
0
123
4
56
7
8
9
.
1 2 3 4 5 6 7 8
1,2
2
2,3,4,8
5,6,8
6,7,8
-
o,1,2,3,4,5,6,7,8,9
o,1,
2,3,
4,5,
6,7,
8,9
.
o,1,2,3,4,5,6,7,8,9
NFA
DFA
En la práctica
● Usamos herramientas automáticas para construir analizadores léxicos– Dado un conjunto de tokens definidos con
expresiones regulares, generamos un tokenizador del stream de caracteres mediante la construcción de un DFA
● Herramientas comunes para generar DFA's– lex en C– Jlex en Java
● Vamos a hablar acerca de lex