compiladores análisis léxico oscar bonilla [email protected] universidad galileo

40
Compiladore s Análisis Léxico Oscar Bonilla [email protected] Universidad Galileo

Upload: maria-del-rosario-parra-ponce

Post on 24-Jan-2016

228 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

CompiladoresAnálisis Léxico

Oscar [email protected] Galileo

Page 2: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad 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

Page 3: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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.

Page 4: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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:

Page 5: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 6: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 7: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 8: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 9: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 10: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 11: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 12: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 13: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 14: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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) ?

Page 15: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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) ?

Page 16: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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?

Page 17: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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)?

Page 18: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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)?

Page 19: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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)?

Page 20: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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)?

Page 21: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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)?

Page 22: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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)?

Page 23: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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},.)?

Page 24: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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},.)?

Page 25: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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.

Page 26: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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

Page 27: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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}

Page 28: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 29: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

-

Page 30: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

-

Page 31: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 32: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 33: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

(-| (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

Page 34: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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

Page 35: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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

.

Page 36: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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

Page 37: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

,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

Page 38: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

,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.

Page 39: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

,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

Page 40: Compiladores Análisis Léxico Oscar Bonilla obonilla@galileo.edu Universidad Galileo

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