Escolar Documentos
Profissional Documentos
Cultura Documentos
Anlisis lxico
Formalizacin y desarrollo
Javier Vlez Reyes jvelez@lsi.uned.es Departamento de Lenguajes Y Sistemas Informticos UNED
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
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
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
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!
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 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
Cadena propia SI NO SI NO
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
Gramticas lineales
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
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
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 }
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 }
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
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
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
Interpretacin grfica
A continuacin representamos el autmata finito determinista anterior aplicando las extensiones descritas letra, dgito
letra
1
otro
letra, dgito
letra
1
otro
Estado 0
Estado 1
Estado 2
c o u n t e r 0 1 +
caracteres transiciones Carcter delimitador (otro)
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
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
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
Ejemplo
<
otro
<
<
otro
<
<
<
<<
< <
<
<<
<
<=
<=
Uso de autmata
La eliminacin de las transiciones provoca varias transiciones iguales desde el mismo nodo Javier Vlez Reyes jvelez@lsi.uned.es
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
Ejemplo
<
otro
<
<
<
<<
{3} 7
<
<=
{1 4 7}
<
{2 5 8}
< =
{6} {9}
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
l, d
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
x.y
x
0
y x
x+
x|y
x*
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
x.y
x
0
y x
x+
[0] ::= l [1] [1] ::= l [1] [1] := d [1] [1] ::=
1
otro
x|y
x*
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
<WHILE, PR>
nextToken ()
Analizador sintctico
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 () }
letra
1
otro
Estrategias de implementacin
I. Reconocimiento de palabras reservadas
Se indican todas con su patrn lxico
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
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
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
Copia en vervatim
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
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])
} } } } }
{ yybegin (COMMENT);
<COMMENT> /* <COMMENT> */
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
e l i
h w
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 ()
Analizador sintctico
Analizador lxico
While ( a > b ) do a := a + 1;
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!); }
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
Material de estudio
Bibliografa bsica
Construccin de compiladores: principios y prctica Kenneth C. Louden International Thomson Editores, 2004 ISBN 970-686-299-4
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