You are on page 1of 17

29/05/2011

Captulo N06 ANLISIS LXICO


Ing. Laura Bazn Daz

Es la primera fase de un compilador. Su principal funcin consiste en leer los caracteres de entrada y elaborar como salida una secuencia de componentes lxicos que utiliza el analizador sintctico para hacer el anlisis.

INTERACCIN DE UN ANALIZADOR LXICO CON EL ANALIZADOR SINTCTICO

29/05/2011

El explorador, analizador lexicogrfico o scanner es la parte del compilador que lee los caracteres del programa fuente y que construye unos smbolos intermedios que llamaremos tokens, por ejemplo: las variables, los enteros, palabras reservadas y los delimitadores (+, -, *, etc.).

El explorador realiza un anlisis lexicogrfico del programa fuente, en contraposicin al anlisis sintctico que realizar luego el reconocedor sintctico o parser. Un tema muy importante es el por qu se separan los dos anlisis lexicogrfico y sintctico, en vez de realizar slo el anlisis sintctico, del programa fuente.

Como el analizador lxico es la parte del compilador que lee el texto fuente, tambin puede realizar ciertas funciones secundarias en la interfaz del usuario, como eliminar del programa fuente comentarios y delimitadores(espacios en blanco, smbolos de puntuacin, fin de lnea).

Otra funcin es relacionar los mensajes de error del compilador con el programa fuente. Por ejemplo, el analizador lxico puede tener localizado el nmero de caracteres de nueva lnea detectados, de modo que pueda asociar un nmero de lnea con un mensaje de error.

29/05/2011

10

Introducir los identificadores en la tabla de smbolos. En algunos compiladores, el analizador lxico se encarga de hacer una copia del programa fuente en el que estn marcados los mensajes de error.

En algunas ocasiones, los analizadores lxicos se dividen en una cascada de dos fases, la primera llamada examen, y la segunda anlisis lxico. El examinador se encarga de realizar tareas sencillas, mientras que el analizador lxico es el que realiza las operaciones ms complejas.

11

12

Las funciones principales que deber realizar el explorador son las siguientes: La ms importante es la formacin y la entrega al parser de los tokens. Estos tokens que entrega formarn los terminales del analizador sintctico. Manejar el fichero del programa fuente, es decir, abrirlo, a continuacin leer sus caracteres y cerrarlo.

El explorar los literales, por ejemplo los literales o tiras alfabticas, los nmeros flotantes, enteros, etc. Listar el programa fuente llegando en algn caso a llevar el control exacto de cada carcter ledo para sealar el carcter ofensivo en caso de un error. Manejar las macros (expansin del texto fuente) de una manera independiente, en general del compilador.

29/05/2011

13

14

1. 2.

3.

Hay varias razones para dividir la fase de anlisis de la compilacin en anlisis lxico y anlisis sintctico. UN DISEO SENCILLO SE MEJORA LA EFICIENCIA DEL COMPILADOR SE MEJORA LA TRANSPORTABILIDAD DEL COMPILADOR

1. UN DISEO SENCILLO, es quiz la consideracin ms importante. Separar los anlisis a menudo permite simplificar una u otra de dichas fases. Un analizador sintctico que incluya las convenciones de los comentarios y espacios en blanco es bastante ms complejo que uno que pueda comprobar si los comentarios y espacios en blanco ya han sido eliminados por el analizador lxico.

15

16

2.

SE MEJORA LA EFICIENCIA DEL COMPILADOR, un analizador lxico independiente permite construir un procesador especializado y potencialmente ms eficiente para esta funcin. Gran parte de tiempo se consume en leer el programa fuente y dividirlo en componentes lxicos.

3. SE MEJORA LA TRANSPORTABILIDAD DEL COMPILADOR. Las peculiaridades del alfabeto de entrada y otras anomalas propias de los dispositivos pueden limitarse al analizador lxico. La presentacin de smbolos especiales o no estndar, como en pascal, pueden ser aislados en el analizador lxico.

29/05/2011

17

18

Cuando se menciona el analizador sintctico, los trminos componente lxico - token, patrn y lexema se emplean con significados especficos. Un token es un smbolo terminal de la gramtica del analizador sintctico. En general, hay un conjunto de cadenas en la entrada para el cual se produce como salida el mismo componente lxico.

Un token se describe mediante un patrn. Este conjunto de cadenas se describe mediante una regla llamada PATRN asociado al COMPONENTE LXICO. Se dice que el patrn CONCUERDA con cada cadena del conjunto.

19

20

Es una secuencia de caracteres en el programa fuente con la que concuerda el patrn para un componente lxico. En cont pi = 3.1416; La subcadena pi es un lexema para el componente lxico identificador.

Los componentes lxicos se tratan como smbolos terminales de la gramtica del lenguaje fuente, con nombres en negritas para representarlos. Los lexemas para el componente lxico que concuerdan con el patrn representan cadenas de caracteres en el programa fuente que se pueden tratar juntos como unidad lxica.

29/05/2011

21

22

Componente lxico CONST IF relacin id nm literal

Lexemas de ejemplo const if <,<=,=,<>,>,>= pi, cuenta, D2 3.1416, 0, 6.02E23 vaciado de memoria

Descripcin Informal del patrn const if < o <= o = o <> o > o >= Letra seguida de letras y/o dgitos Cualquier constante numrica Cualquier carcter entre

En la mayora de los lenguajes de programacin, se consideran componentes lxicos las siguientes construcciones: palabras clave, operadores, identificadores, constantes, cadenas literales y signos de puntuacin como parntesis, coma y punto y coma. En el ejemplo anterior, cuando la secuencia de caracteres pi aparece en el programa fuente, se devuelve al analizador sintctico un componente lxico que representa un identificador. La devolucin de un componente lxico a menudo se realiza mediante el paso de un nmero entero correspondiente al componente lxico. Este entero es al que hace referencia el id.

23

24

Un patrn es una regla que describe el conjunto de lexemas que pueden representar a un determinado componente lxico en los programa fuente.

El patrn para el componente lxico relacin es el conjunto de los seis operadores relacionales de pascal. Para la descripcin de patrones para componentes lxicos ms complejos, como id(para identificador) y num(para nmero). Se utilizar con mayor precisin, la notacin de expresiones regulares.

29/05/2011

25

26

El tratamiento de los espacios en blanco vara mucho de un lenguaje a otro. En algunos lenguajes los espacios en blanco no son significativos, excepto en las cadenas de literales, y se pueden aadir a voluntad para mejorar la legibilidad de un programa. Las convenciones relativas a los espacios en blanco pueden complicar mucho la tares de identificar los componentes lxicos.

DO 5 I = 1.25 En la proposicin no se puede saber hasta ver el punto decimal si DO es una palabra clave o es ms bien parte del identificador DO5I.

27

28

Por otro lado en la proposicin Do 5 I = 1,25 hay 7 componentes lxicos, que corresponde a la palabra clave DO, la etiqueta de la proposicin 5, el identificador I, el operador =, la constante 1, la coma y la constante 25. Aqu no se puede estar seguro hasta encontrar la coma si DO es una palabra clave.

En muchos lenguajes, ciertas cadenas son RESERVADAS, es decir, su significado est predefinido y el usuario no lo puede modificar. Si las palabras clave no son reservadas, entonces el analizador lxico debe distinguir entre una palabra clave y un identificador definido por el usuario.

29/05/2011

29

30

Existen una serie de palabras clave (reservadas) en muchos lenguajes que conviene introducir directamente en la tabla de smbolos: if x1>3 then a:=b+x1
Tokens if id relacin op asign then num Lexemas if x1,a,b > + := Then 3

31

32

Cuando concuerda con un lexema ms de un patrn, el analizador lxico debe proporcionar informacin adicional sobre el lexema concreto que concord con las siguientes fases del compilador.

29/05/2011

33

34

El analizador lxico recoge informacin sobre los componentes lxicos en sus atributos asociados. Los componentes lxicos influyen en las decisiones del analizador sintctico, y los atributos, en la traduccin de los componentes lxicos.

En la prctica, los componentes lxicos suelen tener un solo atributo un apuntador a la entrada de la tabla de smbolos donde se guarda la informacin sobre el componente lxico; el apuntador se convierte en el atributo del componente lxico.

35

36

Se escriben a continuacin como una secuencia de parejas: <id, apuntador a la entrada de la tabla de smbolos para E> <op_asign,> <id, apuntador a la entrada de la tabla de smbolos para M> <op_mult,> <id, apuntador a la entrada de la tabla de smbolos para C> <op_exp,> <id, apuntador a la entrada de la tabla de smbolos para C> <num, valor entero 2>

Los atributos de los identificadores se pueden guardar en la tabla de smbolos. Los otros se pueden guardar en otra tabla o devolverlos junto al token. Obsrvese que en ciertas parejas no se necesita un valor de atributo; el primer componente es suficiente para identificar el lexema.

29/05/2011

37

38

El compilador puede almacenar la cadena de caracteres que forma un nmero en una tabla de smbolos y dejar que el atributo del componente num sea un apuntador a la entrada de la tabla(valor entero).

Hay pocos detectables por el analizador lxico Detectables


Nmero de caracteres de los identificadores Caracteres ilegales Otros (si el lenguaje no admite .5 en lugar de 0.5)...

Programa con K errores: hacen falta K cambios para poder ser correcto No se suelen utilizar las acciones de correccin de errores por ser muy costosas

39

40

Acciones posibles
Borrar un carcter Insertar un carcter Reemplazar un carcter Intercambiar dos caracteres

Son pocos los errores que se pueden detectar simplemente en el nivel lxico porque un analizado lxico tiene una visin muy restringida de un programa fuente. Si aparece la cadena fi por primera vez en un programa en C en el contexto: fi (a == f(x) )

10

29/05/2011

41

42

Un analizador lxico no puede distinguir si fi es un error de escritura de la palabra clave if o si es un identificador de funcin no declarado. Como fi es un identificador vlido, el analizador lxico debe devolver el componente lxico de un identificador y dejar que alguna otra fase del compilador se ocupe de los errores.

Pero supngase que surge una situacin en la que el analizador lxico no puede continuar porque ninguno de los patrones concuerda con un prefijo de la estrada restante. Tal vez la estrategia de recuperacin ms sencilla sea la recuperacin en modo de pnico.

43

44

Se borran caracteres sucesivos de la entrada restante hasta que el analizador lxico pueda encontrar un componente lxico bien formado. Esta tcnica de recuperacin puede confundir en ocasiones al analizador sintctico, pero en un ambiente de computacin interactivo puede resultar bastante adecuada.

Expresin Regular: (a|..|z|A|..|Z) (a|..|z|A|..|Z)* Autmata finito (diagrama o tabla de transicin)

Gramtica Lineal (regular) S::= aR | ... | zR | AR | ... | ZR R::= aR | ... | zR | AR | ... | ZR | 0R | ... | 9R |

11

29/05/2011

45

46

47

48

Utilizando un lenguaje de alto nivel


Programacin Tablas compactas Hashing Autmata programado

12

29/05/2011

49

50

Utilizando ensamblador
Ms eficiente Ms difcil

Utilizando un generador de Analizadores Lxicos (LEX)


Ms cmodo

Consejo: Ordenar las reglas/transiciones de acuerdo a la frecuencia de utilizacin

51

52

13

29/05/2011

A)
53

TABLA COMPACTA
54

Supongamos que tenemos el autmata que reconoce el lenguaje regular L={dda$, abnca$| n>=0}
Caracteres de entrada

b 1 a d 5 a) Diagrama de estados 2 d c 3 a 4 $ 6
ESTADOS

a 1 2 3 4 5 6 2 4 -

b 2 -

c 3 -

d 5 3 -

$ 6 -

Con el fin de ahorrar memoria en el ordenador se pueden guardar slo los elementos no nulos de la matriz de transicin M en un vector VALOR, numerndolos con un ndice, que en el ejemplo va de 1 a 7. Luego se aade una columna adicional COL indicando en qu columna estaba el elemento no nulo correspondiente de VALOR.

b) Matriz de transicin M

55

56

Finalmente se crea otra tabla con los datos siguientes:


Dnde est el primer VALOR de cada lnea (PRIFIL). Nmero de elementos (no nulos) de VALOR para esa lnea (NUMFIL).

Nm. del elemento 1 2 3 4 5 6 7

VALOR 2 5 2 3 4 6 3

COL 1 4 2 3 1 5 4

Nm. de la fila 1 2 3 4 5 6

PRIFIL 1 3 5 6 7 0

NUMFIL 2 2 1 1 1 0

a) Valores no nulos de M y sus columnas.

b) Tabla para localizacin de los elementos no nulos.

Como medida de la reduccin alcanzada, si M tuviera 100x100 elementos con solo 110 elementos no nulos, se tendra de esta forma 2+(100+110)=420 elementos almacenados en total en vez de los 10,000 originales.

14

29/05/2011

M(2,3)? PRIFIL(2)=3
57 58

FIL=2, esto significa que los elementos 3 y 4 de VALOR contienen las transiciones del estado 2, de los dos el que tiene valor COL=3 tiene una transicin a 3. Otra forma de programar un analizador lxico es creando una tabla hash con el autmata.

En cada iteracin, se lee un carcter de la entrada y se transita a un estado dependiendo de la tabla de transiciones. Si el autmata es determinista, slo habr una transicin posible para cada smbolo de entrada y no hace falta retroceso.

59

60

Tcnica muy simple de proceder, considerando como clave de hashing la concatenacin formada por los dos valores de la fila y columna del elemento no nulo de la matriz (si no est almacenado, su valor es nulo).

Consiste en representar directamente con un programa al autmata en cuestin. Este mtodo puede ser muy rpido si el ordenador dispone de alguna instruccin para determinar si un carcter pertenece a un conjunto dado.

15

29/05/2011

O
61 62

63

64

El autmata no debe mostrar nicamente si o no. Realmente realiza una Traduccin. El explorador realiza comprobaciones en la tabla de smbolos.

16

29/05/2011

65

66

Las acciones semnticas ms comunes son:


AADIR: concatena caracteres para construir smbolos. LEECAR: lee caracteres de la entrada. VER: Comprueba si un identificador est o no en la TdS. ADD: Aade un identificador a la TdS.

El AL agrupa caracteres para formar tokens, por tanto es importante definir el delimitador : Carcter que delimita el token sin pertenecer a l. Otro concepto importante es el de palabra reservada. El lenguaje prohbe el uso libre al programador de determinadas palabras que tienen un significado especfico y nico en el lenguaje.

67

Se pueden clasificar los lenguajes de programacin por el uso de los delimitadores y palabras reservadas:
Delimitadores blancos con palabras reservadas.
Caso ms sencillo de lenguaje (PASCAL, COBOL)

Delimitadores blancos sin palabras reservadas


PL/I

Blancos se ignoran sin palabras reservadas


El tipo ms difcil de ambigedades (FORTRAN) lenguaje, aparecen

Blancos se ignoran con palabras reservadas

17

You might also like