Você está na página 1de 47

Procesadores de Lenguajes

Ingeniera Tcnica superior de Ingeniera Informtica


Departamento de Lenguajes y Sistemas informticos

Anlisis lxico
Formalizacin y desarrollo
Javier Vlez Reyes jvelez@lsi.uned.es Departamento de Lenguajes Y Sistemas Informticos UNED

Anlisis lxico. Formalizacin y desarrollo


Objetivos

Objetivos
Conocer las responsabilidades de un analizador lxico Aprender cmo funciona Entender los diferentes tipos de patrones que reconoce

Aprender a especificar formalmente analizadores lxicos A travs de gramticas formales A travs de expresiones regulares A travs de autmatas finitos

Estudiar la implementacin de analizadores lxicos Conocer las distintas estrategias de implementacin Entender las posibles relaciones con la tabla de smbolos

Estudiar la generacin de errores lxicos

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


ndice

ndice
Introduccin Token Patrn lxico Lexema Lenguaje regular dirigida por tabla guiada por herramientas

Estrategias de implementacin Gestin de errores Construccin de A. lxicos en en la prctica Qu es JFlex? Cmo funciona JFlex? Cmo se usa JFlex? Gestin de errores en JFlex Desarrollo paso a paso

Especificacin de analizadores lxicos Lenguajes regulares Gramticas lineales Expresiones regulares Autmatas finitos Conversin de formalismos

Bibliografa

Implementacin de analizadores lxicos basada en casos

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Introduccin

Introduccin
El primer paso para procesar un programa es convertir la coleccin de caracteres del mismo en una coleccin de componentes lxicos con significado nico dentro del lenguaje llamados tokens. De eso se encarga el analizador lxico o escner i h w Cmo se formaliza un analizador lxico? El analizador sintctico va pidiendo nuevos tokens al analizador lxico y ste los sirve bajo demanda Formalismos Conversin entre formalismos

While ( a > b ) do a := a + 1;

Foco de atencin

Analizador lxico
Cmo se implementa un analizador lxico? <WHILE, PR> nextToken () Estrategias de implementacin Buenas prcticas

Analizador sintctico

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Introduccin

Introduccin
El primer paso para procesar un programa es convertir la coleccin de caracteres del mismo en una coleccin de componentes lxicos con significado nico dentro del lenguaje llamados tokens. De eso se encarga el analizador lxico o escner

Definicin de token
Un token es una unidad lxica indivisible con significado nico dentro del lenguaje. Desde el punto de vista tecnolgico se trata de una estructura de datos que contiene informacin sobre ID: Tipo del token Nmero de lnea Nmero de columna Lexema Valor

Categoras de token
Los tipos de tokens existentes en un lenguaje son una caracterstica intrnseca al mismo. No obstante, pueden encontrarse categoras generales

Categora Delimitadores Palabras reservadas Identificadores Nmeros enteros Nmeros flotantes Simbolos especiales Cadenas

Ejemplos ( ) , ; : [ ] while true do if for Index f isEven 3 -4 55 0 7658 4.5 .3 0.5 8.4e-5 + -* / . = < > <= >= != ++ Hola mundo!

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Introduccin

Introduccin
Cada tipo de token representa a un conjunto de tokens (construcciones lxicas diferentes) con unos mismos propsitos dentro del lenguaje. Estos tipos se definen a travs de un patrn lxico al que se adscriben los lexemas del tipo

Definicin de patrn lxico


Un patrn lxico es una expresin abstracta llamada expresin regular que permite identificar unvocamente un tipo de token y referenciar al conjunto de todos los tokens que se ajustan a l.

Definicin de lexema
La cadena de caracteres especfica de un token que se ajusta al patrn lxico de su tipo se llama lexema. Existen dos tipos de lexemas Cadena propia: lexema idntica al patrn Cadena no propia: lexema encaja con patrn

Tipo de token While Enteros Divisin Identificador

Patrn lxico while digito+ / letra (letra |digito)*

Ejemplos de lexema while 12 123 0 45 / Index f isEven

Cadena propia SI NO SI NO

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Introduccin

Introduccin
Desde la perspectiva lxica un programa es una familia ordenada de tokens de varios tipos. Cada tipo, a travs de su patrn lxico, define un micro lenguaje formado por todos aquellos lexemas que encajan con el patrn lxico. Este tipo de lenguajes sencillos se llaman lenguajes regulares program burbuja; uses crt; const n = 5; var i,j,temp:integer; a:array[1..n] of integer; begin for i := 1 to n do readln(a[i]); for j := (n - 1) downto 1 do for i := 1 to j do if (a[i])>(a[i+1]) then begin temp := a[i]; a[i] := a[i+1]; a[i+1] := temp; end; writeln ('El resultado es:'); for i := 1 to n do writeln (a[i]); readln; end. Javier Vlez Reyes jvelez@lsi.uned.es

Definicin de lenguaje regular


Un lenguaje regular describe una familia de tokens que se ajustan a un determinado patrn lxico. Lenguaje de delimitadores de Pascal ; = , : [ .. ] ( ) ... Lenguaje de palabras reservadas de Pascal program uses const var intger of array begin for to do downti if then End ... Lenguaje de identificadores Pascal burbuja ctr n i j temp a readln writeln ...

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin de lenguajes regulares


Adems de la declaracin extensiva slo viable en los lenguajes finitos existen 3 diferentes maneras de definir formalmente un lenguaje regular. A lo largo de esta seccin estudiaremos cada una de ellas en detalle y veremos cmo se puede pasar de cada una a las otras 2

Gramticas lineales

Elementos Gramticas lineales Expresiones regulares Autmatas finitos

Transformaciones De gramticas a expresiones De gramticas a autmatas De expresiones a gramticas De expresiones a autmatas De autmatas a gramticas De autmatas a expresiones

Lenguajes regulares
Expresiones regulares Autmatas finitos

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante gramticas lineales


Una forma de definir formalmente un lenguaje regular es utilizar una gramtica lineal, que describe todas las reglas que se pueden aplicar para la construccin de lexemas que pertenecen al lenguaje regular

Definicin de gramtica lineal


Una gramtica lineal es un conjunto de 4 elementos G = (T, N, S, P) donde: T es un conjunto de smbolos terminales N es un conjunto de smbolos no terminales S N axioma gramatical P un conjunto de reglas de produccin de la forma 1. A ::= B x 2. A ::= x B 3. A ::= x donde A, B N donde A, B N donde x T U { } y y xT xT

Tipos de gramticas lineales


Existen en realidad 2 tipos de gramticas lineales. En funcin de la forma del conjunto de reglas de produccin podemos distinguir entre: Gramticas lineales por la izquierda Usan reglas A ::= B x Usan reglas A ::= x

Gramticas lineales por la derecha Usan reglas A ::= x B Usan reglas A ::= x

A veces T se elide, N se deduce de los antecedentes de las reglas de P y se asume que el antecedente de la primera regla es S con lo G slo a travs de P representa la cadena vaca (ausencia de terminal)

Dada una gramtica G lineal por la izquierda siempre se puede encontrar una gramtica G lineal por la derecha y recprocamente

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante gramticas lineales


Una forma de definir formalmente un lenguaje regular es utilizar una gramtica lineal, que describe todas las reglas que se pueden aplicar para la construccin de lexemas que pertenecen al lenguaje regular

Derivacin gramatical
Una gramtica debe interpretarse como un conjunto de reglas de reescritura o transformacin de elementos no terminales en elementos terminales o no terminales. La primera transformacin parte del axioma En cada paso se aplica una nica regla Las reglas pueden extender la transformacin ( A::= B x / A ::= x B) Las reglas pueden ser recursivas (A ::= A x / A ::= x A) Las reglas pueden ser terminales (A ::= x)

Ejemplo
LG = {a b*} Sea G = (T, N A, P) con T = {a, b} N = {A, B} P={ A ::= a B A ::= a B ::= b B B ::= b }

El proceso debe ser convergente

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante gramticas lineales


Una forma de definir formalmente un lenguaje regular es utilizar una gramtica lineal, que describe todas las reglas que se pueden aplicar para la construccin de lexemas que pertenecen al lenguaje regular

Derivacin gramatical
El problema ahora se traduce en, dada una cadena formada por una secuencia de elementos terminales de T, demostrar que dicha cadena pertenece al lenguaje definido por la gramtica Cadena de derivacin axioma

Ejemplo
LG = {a b*} Sea G = (T, N A, P) con T = {a, b} N = {A, B} P={ asidero A ::= a B A ::= a B ::= b B B ::= b }

A aB abB abbB abbb


Paso de derivacin Forma de frase Frase

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante gramticas lineales


Una forma de definir formalmente un lenguaje regular es utilizar una gramtica lineal, que describe todas las reglas que se pueden aplicar para la construccin de lexemas que pertenecen al lenguaje regular

Ejercicios
Definir formalmente a travs de una gramtica lineal los siguientes lenguajes descritos informalmente L1 = conjunto de todas las palabras sobre {a, b} que empiezan por a L2 = conjunto de todas las palabras sobre {a, b} que empiezan por a y continan con secuencias ab L3 = Nmeros fraccionarios L4 = Identificadores L1 GD = (T, N A, P) con T = {a, b} N = {A, B} P={ A ::= a B B ::= a B B ::= b B B ::= } Javier Vlez Reyes jvelez@lsi.uned.es } GI = (T, N A, P) con T = {a, b} N = {A, B} P={ A ::= A a A ::= A b A ::= a

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante expresiones regulares


Otra forma de definir lenguajes regulares es a travs del uso de expresiones regulares. Una expresin regular utiliza los trminos del alfabeto de terminales operados a travs de operaciones con una semntica especifica

Definicin de expresin regular


Una expresin regular sobre un conjunto T es un conjunto ER = (T, | , , *) que cumple las siguientes propiedades: es una expresin regular que define el lenguaje L = (cadena vaca) es una expresin regular que define el lenguaje L ( ) = { } Cualquier smbolo a T es una expresin regular que define el lenguaje L ( a ) = { a } Si x, y son dos expresiones regulares, xy es una expresin regular que define L ( xy ) = L ( x ) L ( y ) Si x, y son dos expresiones regulares, x | y es una expresin regular que define L (x | y) = L ( x ) U L ( y ) Si x es una expresin regular x* es una expresin regular que define L ( x* ) = U L( x ) i i =0 i Si x es una expresin regular x+ es una expresin regular que define el lenguaje L ( x* ) = U L( x )
i =1

No existen ms expresiones regulares

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante expresiones regulares


Otra forma de definir lenguajes regulares es a travs del uso de expresiones regulares. Una expresin regular utiliza los trminos del alfabeto de terminales operados a travs de operaciones con una semntica especifica

Ejercicios
Definir los siguientes lenguajes regulares utilizando para ello expresiones regulares L1 = Lenguaje de identificadores L2 = Lenguaje de nmeros naturales L3 = Lenguaje de nmeros fraccionarios L4 = Lenguaje de nmeros enteros con exponente L5 = Lenguaje de nmeros fraccionarios con exponente L6 = Lenguaje de nmeros pares L7 = Lenguaje de las cuentas de correo L8 = Lenguajes de las URL

L1 = l ( l | d )* l {a..z} d {0..9} L3 = d+ . d+ L6 = d+ p d {0..9} d {0..9} p {0, 2, 4, 6, 8}

L7 = nombre @ host nombre = L1 (. L1)* host = L1 (. L1)*

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Autmata finito determinista


Un autmata finito determinista es un conjunto AFD = (T, Q, f, q, F) donde: T es un alfabeto de smbolos terminales de entrada Q es un conjunto de estados finito no vaco f: Q x T Q es una funcin de transicin q Q es un estado inicial o estado de arranque F C Q es un subconjunto de estados finales de aceptacin

Interpretacin grfica
Grficamente, un autmata finito determinista es una coleccin de estados unidos por arcos, donde para cada estado existe un arco etiquetado con cada elemento de T. El estado inicial tiene una flecha entrante y los estados finales tienen un doble borde letra, dgito

letra dgito

2
letra, dgito letra [a..z] dgito [0..9] Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Extensin de los autmatas finitos deterministas


Con el nimo de simplificar el trabajo con los autmatas finitos deterministas, dentro de la teora de compiladores se utilizan las siguientes extensiones notacionales Las transiciones ausentes se asumen como errores Se omiten los estados de absorcin de errores Se usa la etiqueta otro para representar el resto de alternativas Los estados finales paran el proceso y emiten token Los estados finales con * recuperan el carcter de trnsito Se espera a reconocer el posible toquen de lexema ms largo El estado final ya no es final Al llegar un carcter terminador se pasa a uno final Entonces se emite el token Si es necesario se marca con * el estado final

Interpretacin grfica
A continuacin representamos el autmata finito determinista anterior aplicando las extensiones descritas letra, dgito

letra

1
otro

letra [a..z] dgito [0..9]

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Como se usan los autmatas finitos deterministas


Los autmatas arrancan en el estado de inici y comienzan a consumir caracteres de la entrada lo que provoca una transicin a un nuevo estado o un error. En cuanto se alcanza un estado de aceptacin final, el autmata para y se emite el token reconocido token

letra, dgito

letra

1
otro

letra [a..z] dgito [0..9]

Estado 0

Estado 1

Estado 2

c o u n t e r 0 1 +
caracteres transiciones Carcter delimitador (otro)

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Ejercicios
Definir los siguientes lenguajes regulares utilizando para ello autmatas finitos deterministas L1 = Lenguaje de identificadores L2 = Lenguaje de nmeros naturales L3 = Lenguaje de nmeros fraccionarios L4 = Lenguaje de nmeros naturales con exponente L5 = Lenguaje de nmeros fraccionarios con exponente L6 = When * otro

L1 0
letra

letra, dgito

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Construccin manual compositiva de autmatas


Para construir un analizador lxico completo es necesario combinar en un nico autmata todos los autmatas correspondientes a los micro-lenguajes que aparecen en el lenguaje. Este proceso se puede hacer mediante una aproximacin holstica

L8 0
<

< =

2 3 4 *

<< <= < == * = ++ * + * *= * *

= =

Ejercicios
Definir los siguientes lenguajes regulares utilizando para ello autmatas finitos deterministas L7 = Nmeros naturales y fraccionarios con exponente L8 = {<, <<,<=, =, ==, +, ++, -, --, *, *=} L9 = {While, When, Do, Downto} L10 = L1 U L7 U L9 L11 = U Li con i [1..11]

5
+

6 7 9 10

8
11

12 13

* = 14

15 16

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Construccin sistemtica compositiva de autmatas


Cuando el nmero de micro-lenguajes es grande y stos son complejos la aproximacin manual se convierte en un proceso prolijo por eso conviene establecer un proceso sistemtico. Este proceso se basa en definir formalmente la composicin de autmatas sobre las operaciones legtimas de composicin de autmatas x
Las transiciones deben interpretarse como transiciones que no consumen caracteres

L (x)

x x

n-1

n L (x)+

L (x) L (y)

y x

L (x) U L (y)

L (x)*

y
Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Construccin sistemtica compositiva de autmatas


Cuando el nmero de micro-lenguajes es grande y stos son complejos la aproximacin manual se convierte en un proceso prolijo por eso conviene establecer un proceso sistemtico. Este proceso se basa en definir formalmente la composicin de autmatas sobre las operaciones legtimas de composicin de autmatas

Ejemplo

L = {<, <<, <=}

<

otro

<

<

otro

<

<

<

<<

< <

<

<<

<

<=

<=

Uso de autmata

transiciones para construir el

La eliminacin de las transiciones provoca varias transiciones iguales desde el mismo nodo Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Autmatas finitos no deterministas


La construccin sistemtica de autmatas genera autmatas finitos no deterministas. Un autmata finito no determinista es un autmata finito donde cada estado:

Puede tener

transiciones

Genera indeterminacin porque desde ese estado no se sabe si avanzar por otra transicin normal consumiendo un carcter o hacerlo por la transicin sin consumir ningn carcter

Puede tener varias transiciones con la misma etiqueta Genera indeterminacin porque desde ese estado, si el carcter a la entrada tiene varias posibles transiciones no se sabe cual escoger Los autmatas finitos deterministas no son formalismos adecuados para representar lenguajes regulares

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos

Especificacin mediante autmatas finitos


La tercera forma de definir lenguajes regulares es a travs del uso de autmatas finitos. Un autmata finito reconoce una cadena de entrada si consumidos todos los caracteres de la misma acaba en un estado final de aceptacin

Conversin de autmatas finitos no deterministas a autmatas finitos deterministas


La construccin de un autmata finito determinista a partir de uno no determinista requiere de la identificacin de todos los estados alcanzables desde cada estado a travs de transiciones y transiciones mltiples

Ejemplo

L = {<, <<, <=}

{0} = {1 4 7} {1 4 7} < = {2 5 8} {2 5 8} < = {6} {2 5 8} = = {9} {2 5 8} otro = {3}

<

otro

<

<

<

<<

{3} 7
<

<=

{1 4 7}

<

{2 5 8}

< =

{6} {9}

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos
Gramticas lineales

Conversin de formalismos
Dado cualquiera de los 3 formalismos de representacin estudiados es posible encontrar un isomorfismo para expresarlo en cualquiera de los otros 2
Expresiones regulares

Lenguajes regulares
Autmatas finitos

Conversin de Gramticas a expresiones


Cada regla se expresa en trminos de los operadores de concatenacin, cierre + y cierre * A ::= l B B ::= l B B ::= d B B ::= A= l B B=lB=l+ B=dB=d+ B= B = ( l+ | d+ | ) = ( l | d | A=l(l|d)* )+ = ( l | d )*

Conversin de Gramticas a autmatas


Se genera un estado por cada no terminal. El estado del axioma es el de inicio. Las reglas se traducen a transiciones. Si la regla es terminal (A ::= x) entonces se genera una transicin otro a un estado de aceptacin final. Si sale no determinista, convertirlo a determinista. A ::= l B B ::= l B B ::= d B B ::= otro * l

l, d

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos
Gramticas lineales

Conversin de formalismos
Dado cualquiera de los 3 formalismos de representacin estudiados es posible encontrar un isomorfismo para expresarlo en cualquiera de los otros 2
Expresiones regulares

Lenguajes regulares
Autmatas finitos

Conversin de Expresiones a gramticas


Transformar primero la expresin regular desfactorizando los cierres + y *. Despus aplicar las transformaciones + a recursividad y * a recursividad con produccin L=l(l|d)*=l(l*|d*) A ::= l B B ::= l B B := d B B ::= B representa ( l* | d* ) Se captura l+ Se captura d+ Se captura l* | d*

Conversin de Expresiones a autmatas


La conversin de expresiones regulares a autmatas finitos se realiza utilizando las transformaciones atmicas definidas anteriormente al discutir la composicin de lenguajes

x.y

x
0

y x

x+

x|y

x*

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Especificacin formal de analizadores lxicos
Gramticas lineales

Conversin de formalismos
Dado cualquiera de los 3 formalismos de representacin estudiados es posible encontrar un isomorfismo para expresarlo en cualquiera de los otros 2
Expresiones regulares

Lenguajes regulares
Autmatas finitos

Conversin de autmatas a gramticas


Cada estado se convierte a un no terminal. El estado de arranque corresponde con el axioma. Cada transicin A B etiquetada con x se traduce en A ::= x B. Si B es un estado final se genera A ::= x. Si x = otro se genera A ::= l, d

Conversin de autmatas a expresin


Para la transformacin de autmatas a expresiones basta con hacer una lectura inversa de las transformaciones atmicas definidas anteriormente

x.y

x
0

y x

x+

[0] ::= l [1] [1] ::= l [1] [1] := d [1] [1] ::=

1
otro

x|y

x*

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Implementacin de analizadores lxicos

Qu es un analizador lxico?
Un analizador lxico o scanner es un programa capaz de descomponer una entrada de caracteres generalmente contenidas en un fichero en una secuencia ordenada de tokens. El analizador lxico responde bajo demanda a las solicitudes de siguiente token que le va haciendo el analizado sintctico. Cada vez que ste ltimo hace una solicitud al primero, el analizador lxico consume un nmero de caracteres de la entrada y retorna un artefacto computacional que representa el siguiente token en la entrada. En lo venidero utilizaremos el trmino token para referirnos a dicho artefacto

While ( a > b ) do a := a + 1;

Analizador lxico
En la prctica el artefacto software que representa un token suele ser una estructura de datos o un objeto en los lenguajes orientados a objetos

e l i h w

Id nFila nColumna lexema valor

<WHILE, PR>

nextToken ()

Analizador sintctico

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Implementacin de analizadores lxicos
letra, dgito

Implementacin de analizadores lxicos basada en casos


De acuerdo a esta estrategia de implementacin es necesario disponer de una variable de estado para codificar el estado actual y una batera de casos que describen la lgica de transicin del autmata finito determinista. letra = [a..z] break; 1: switch (c) { letra : lexema += c c = leerCaracter () break default: estado = 2; } break 2: token = crearToken (lexema...) fin = true } return token digito : estado = 1

letra

1
otro

digito = [0..9] estado = 0 fin = false c = leerCaracter () while (!fin) { switch (estado) { 0: switch (c) { letra : estado = 1 lexema += c c = leerCaracter () break digito : throw error () }

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Implementacin de analizadores lxicos
letra, dgito

Implementacin de analizadores lxicos dirigida por tabla


Podemos codificar computacionalmente un autmata como una matriz bidimensional de Q x T Q que indique, para cada entrada y estado el nuevo estado. El algoritmo se limita a leer dicha matriz tTransicion = [][] sFinales = {estados finales} estado = 0 fin = false c = leerCaracter () while (!fin) { s = tTransicion [s][c] if (s != null) if (!(s in sFinales)) { lexema += c c = leerCaracter () } else fin = true else throw error () } return crearToken (lexema...)

letra

1
otro

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Implementacin de analizadores lxicos

Implementacin de analizadores lxicos guiada por herramientas


Existen herramientas para la construccin automtica de analizadores lxicos [Lex] [Flex] [JFlex]. Estas herramientas se basan en la definicin de una coleccin de reglas patrn - accin letra = [a..z] digito = [0..9] letra (letra | digito)* digito+ digito* . digito+ ( ) [ ] ... { return new Token (ID); { return new Token (ENT); { return new Token (PI); { return new Token (PD); { return new Token (PI); { return new Token (PD); } } } } } }

{ return new Token (FRAC); }

Dan prioridad al token ms largo DO / DOT > / >=

Ante igualdad de longitud Anteponer la regla mas especfica When While Id

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Implementacin de analizadores lxicos

Estrategias de implementacin
I. Reconocimiento de palabras reservadas
Se indican todas con su patrn lxico

Reconocimiento de palabras reservadas

Resolucin explcita

Se integran en el diagrama global Se utilizan herramientas generadoras (FLex) Las palabras reservadas (PR) se reconocen como identificadores Las k palabras reservadas se meten en la tabla de smbolos (TS) Se busca cada id en TS. Si su ndice es < k es PR

Resolucin implcita

II. Reconocimiento estructuras complejas de forma hbrida


Implementacin manual de las estructuras ms sencillas Operadores Identificadores Nmeros Implementacin tabular o guiada por herramientas con estructuras complejas Cadenas no especficas Prefijos comunes Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Gestin de errores

Errores lxicos
Los errores lxicos son aquellos que se producen en el mbito del reconocimiento de patrones para construir tokens del lenguaje. Podemos establecer una clasificacin de errores de naturaleza lxica Errores bsicos Aparicin de caracteres ajenos al conjunto T (, , etc.) Ausencia de concordancia con ningn patrn (1abc, +*, etc.) Errores complejos Cadena de caracteres sin cierre (falta final) Cadena de caracteres sin apertura (falta inicial) Comentario sin cierre (falta */ final) Comentario sin apertura (falta /* inicial) Error en el anidamiento de comentarios (/* .. /* .. */) No son en realidad errores capturables por un reconocedor de lenguajes regulares aunque las herramientas generadoras son capaces de reconocerlos Son en realidad de esta categora

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Qu es JFlex?
JFlex es una herramienta para la generacin de analizadores lxicos escritos en java. A partir de un fichero de especificacin que describe las caractersticas lxicas de un lenguaje, JFlex genera un cdigo fuente compilable que puede ser utilizado como analizador lxico Esta es la especificacin del analizador lxico. Todo cambio en el escner debe indicarse aqu Esta es la clase generada a partir de la especificacin. Atencin! No incluir aqu ningn cdigo manualmente ya que en la prxima generacin se perder Esta es la clase java compilada que puede ser interpretada por la JVM

Scanner.flex

JFlex
JFlex

Scanner.java

Javac
compile

Scanner.class

Java
JFlexTest

Framework

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo funciona JFlex?


El fichero de especificacin de JFlex esta dividido en tres secciones separadas por el delimitador %%. Cada una de ellas tiene una semntica diferente

I. Seccin de cdigo de usuario


La seccin de cdigo de usuario se utiliza para incluir cualquier declaracin java (paquete, importacin o clase) que sea necesario para compilar el scanner

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo funciona JFlex?


El fichero de especificacin de JFlex esta dividido en tres secciones separadas por el delimitador %%. Cada una de ellas tiene una semntica diferente

II. Seccin de directivas


Se incluyen directivas de compatibilidad con cup, gestin de fila, columna y lexema, declaracin de estados y macros e inclusin de cdigo de inicializacin

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo funciona JFlex?


El fichero de especificacin de JFlex esta dividido en tres secciones separadas por el delimitador %%. Cada una de ellas tiene una semntica diferente

III. Seccin de reglas patrn - accin


En esta ltima seccin se define una familia de escneres lxicos, cada uno asociado a un estado distinto (YYINITIAL, COMMENT, etc.). Es posible saltar de uno a otro. La definicin se basa en reglas patrn accin que indican el cdigo java que debe ejecutarse cuando la entrada encaja con determinado patrn lxico. Si el cdigo java no acaba con un return el scanner continua buscando un nuevo token

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo funciona JFlex?


I. Seccin de cdigo de usuario
La seccin de cdigo intermedio se copia tal cual al inicio de la clase fuente que representa el escner (Scanner.java), por tanto todo lo que va en esta seccin es cdigo puro java de carcter declarativo
Scanner.java

Consltese el documento Manual de JFlex

Copia en vervatim

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo funciona JFlex?


II. Seccin de directivas
Directiva %full %unicode %{ %} %init{ %} %intthow{ %} %yylexthrow{ %} %eof{ %} %eofval{ %} %eofthrow{ %} %ignorecase %char %line %notunix Descripcin Utiliza el cdigo ASCII extendido 8 bits Utiliza codificacin UNICODE de 16 bits

Consltese el documento Manual de JFlex

Se incluye el cdigo como declaracin dentro de la clase Scanner Incluye cdigo dentro de los constructores Declara excepciones que el constructor puede lanzar Declara excepciones que el mtodo de escaneo puede lanzar Incluye cdigo que se ejecuta tras encontrar EOF Define el valor de retorno al encontrar EOF Excepcin de se lanza al encontrar EOF No distinguir entre maysculas y minsculas Contabiliza el nmero de caracteres en la variable yychar Contabiliza el nmero de lneas en la variable yyline Reconoce \r\n como carcter (doble) de nueva lnea

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo funciona JFlex?


II. Seccin de directivas
Directiva %class name %public %function name %interface name %type name %integer %intwrap %yyeof %cup %state nombre nombre = valor Descripcin Da nombre a la clase del escner Define como pblica la clase del escner Da nombre a la funcin de escaneo

Consltese el documento Manual de JFlex

Declara los interfaces que debe implementar el escner Define el tipo de retorno de la funcin de escaneo Define el tipo de retorno de la funcin de escaneo como un int Define el tipo de retorno de la funcin de escaneo como Integer Define la constante Yylex.YYEOF (obligatorio uso de %integer) Habilita la compatibilidad con Cup Define el estado nombre Define una macro (LETRA = [A-Za-z])

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo funciona JFlex?


III. Reglas patrn-accin
Despliegue de macros Se utilizan los caracteres { y } para encerrar el nombre de la macro, definida en la seccin de directivas, que se quiere desplegar Utilizacin de estados Cada estado, declarado en la seccin de directivas, corresponde con un autmata distinto. Cada regla debe asociarse a un estado precediendo al patrn lxico el nombre del mismo encerrando entre < y > Desde una regla r de un estado A se puede saltar a un estado B mediante la instruccin yybegin (B) invocada en la accin de r. El estado inicial por defecto es YYINITIAL. Este es un estado que no es preciso declarar
<YYINITIAL> <YYINITIAL> <YYINITIAL> <YYINITIAL> ... <YYINITIAL> ... + - * / /* { { { { return return return return {LETRA} ( {LETRA} |{DIGITO})* {DIGITO} *

Consltese el documento Manual de JFlex

{ return crearToken (ID); } { return crearToken (NUM); }

crearToken crearToken crearToken crearToken

(MAS); (MENOS); (MUL); (DIV);

} } } } }

{ yybegin (COMMENT);

<COMMENT> /* <COMMENT> */

{ nComments ++; } { nComments --; if (nComments == 0) yybegin (YYINITIAL); <COMMENT> {COMMENT} { }

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo funciona JFlex?


III. Reglas patrn-accin
Secuencias de escape \b \n \t \f \r \ddd \xdd \udddd \^C \c Secuencias de escape yychar yyline yytext () Descripcin Retroceso Nueva lnea Tabulador Avance de pgina Retorno de carro Nmero octal Nmero hexadecimal Hexadecimal de 4 dgitos Carcter de control Backslash seguido del c Descripcin Nmero de columna Numero de lnea lexema Metacaracteres \b $ . {name} * + ? () [] [^] a-b Descripcin Retroceso

Consltese el documento Manual de JFlex

Fin de fichero Cualquier carcter menos \n Expansin de una macro Clausura de Kleene Una o ms repeticiones Opcionalidad Agrupacin de expresiones regulares Conjunto de caracteres Conjunto complementario Rango a - b

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo se usa JFlex?


Los analizadores sintcticos de JFlex estn pensados para usarse bajo demanda. Se trata de artefactos con una API bien definida. El mtodo ms relevante es el de escaneo que devuelve el siguiente token a la entrada. El framework prescribe que el mtodo de escaneo debe devolver un objeto de la clase Token

Consltese el documento Directrices de implementacin

next_Token () <WHILE, PR>

e l i

h w

Token next_Token () JFlex


Javacup.runtime.Symbol

Cup

La clase Token
Token es una clase hija que hereda de la clase que usa cup para integrarse con JFlex (javacup.runtime.Symbol). Esta clase facilita y encapsula la comunicacin entre el analizador lxico y el analizador sintctico desarrollado en Cup proporcionando una coleccin de mtodos de inters

Token
+ getID () + getLexema () + getline () + getColumn ()

Javier Vlez Reyes jvelez@lsi.uned.es

Analizador sintctico

Analizador lxico

While ( a > b ) do a := a + 1;

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Cmo se usa JFlex?


Para adaptar JFlex al framework de desarrollo es necesario realizar una serie de tareas sobre el fichero de especificacin. stas ya vienen realizadas en la plantilla Jflex que proporciona el framework por lo tanto lo aqu contado es meramente explicativo y no requiere trabajo alguno del estudiante El escner pertenece al paquete compiler.lexical Debe importarse La clase Token El interfaz ScannerIF Las clases de gestin de errores Debe activarse la compatibilidad con el framework %cup %implements ScannerIF %scanerror LexicalError Opcionalmente declararse la funcin crearToken Cada accin debe acabar con un return crearToken ();

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Gestin de errores en JFlex


La gestin de errores lxicos est soportada dentro del framework por la clase LexicalErrorManager. Los mtodos para emitir error son error (). Emite un mensaje de error fatal (). Emite un mensaje de error y para el scanner Estos mtodos estn doblemente sobrecargados. Pueden recibir un mensaje de error (String) o un objeto LexicalError que representa un error lxico
usa

Consltese el documento Directrices de implementacin

LexicalError

LexicalErrorManager
+ lexicalDebug (String message) + lexicalInfo (String message) + lexicalWarn (String message) + lexicalError (String message) + lexicalError (LexicalError error) + lexicalFatal (String message) + lexicalFatal (LexicalError error)

Ejemplo
<YYINITIAL> <YYINITIAL> <YYINITIAL> <YYINITIAL> ... <YYINITIAL> + - * / . { { { { return return return return crearToken crearToken crearToken crearToken (MAS); (MENOS); (MUL); (DIV); } } } }

{ LexicalErrorManager.lexicalFatal (ufff!); }

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Construccin de analizadores lxicos en la prctica

Desarrollo paso a paso


1. Especificacin del escner Abrir el documento de especificaciones JFlex doc/specs/scanner.flex No cambiar nada de lo que est escrito! Declarar macros necesarias (ALFA, DIGIT, SPACE, NEWLINE) Declarar el estado de comentarios %%state COMMENT Definir las reglas de YYINITIAL Definir las reglas de COMMENT (contemplar el anidamiento si procede)

2. Generar el escner Limpiar (tarea clear) Generar el escner (tarea jflex) Compilar el escner (tarea compile)

3. Probar el escner Abrir fichero LexicalTestCase src/compiler/test/LexicalTestCase.java Descomentar y comentar lo indicado en el fichero (lelo atentamente) Si funciona, fin. Sino volver a 1

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Bibliografa

Material de estudio
Bibliografa bsica
Construccin de compiladores: principios y prctica Kenneth C. Louden International Thomson Editores, 2004 ISBN 970-686-299-4

Javier Vlez Reyes jvelez@lsi.uned.es

Anlisis lxico. Formalizacin y desarrollo


Bibliografa

Material de estudio
Bibliografa complementaria
Compiladores: Principios, tcnicas y herramientas. Segunda Edicin Aho, Lam, Sethi, Ullman Addison Wesley, Pearson Educacin, Mxico 2008

Diseo de compiladores. A. Garrido, J. Iesta, F. Moreno y J. Prez. 2002. Edita Universidad de Alicante

Javier Vlez Reyes jvelez@lsi.uned.es

Você também pode gostar