You are on page 1of 45

Anlisis Lxico

Procesadores de Lenguaje (v1.7)

Anlisis Lxico
Funciones Ignorar caracteres no relevantes Agrupar resto de los caracteres Rechazar agrupaciones invlidas y clasificar las vlidas Ejemplo Entrada: 22 nmeros (caracteres)
Incremento (29) 87 72 73 76 69 32 69 68 65 68 49 43 43 32 Igual (61) 61 61 32 Num (33) 53 52 43 Mas (6) Num (33) 50 32 Final (0)

While (25)

Identificador (10)

Salida: 8 nmeros (tokens)

25

10

29

61

33

33

Anlisis Lxico
Definiciones Lexema Agrupacin de caracteres que constituyen los smbolos con los que se forman las sentencias del lenguaje 12 386 CONT i

Token Conjunto de lexemas que puede ser tratado como una unidad sintctica NUM NUM IDENT IDENT

Criterio Delimitadores? [ ] { } Operadores? + - * / Patrn Regla que permite determinar qu lexemas pertenecen a un token Token: IDENTIFICADOR En qu lenguaje se expresan los patrones? lexema: a32

Metalenguajes

Conceptos Bsicos

Metalenguajes
Definicin de Patrones En lenguaje natural O demasiado poco detallado a = .5; O demasiado extenso An identifier is a sequence of letters and digits; the first character must be a letter. The underscore _ counts as a letter. Upper- and lowercase letters are different. If the input stream has been parsed into tokens up to a given character, the next token is taken to include the longest string of characters that could possibly constitute a token. Blanks, tabs, newlines, and comments are ignored except as they serve to separate tokens. Some white space is required to separate otherwise adjacent identifiers, keywords, and constants. Metalenguajes Descripcin formal Precisin Concisin Ventajas Facilitan Comprensin Facilitan Implementacin

Metalenguajes
Por fase en la que se utilizan Lxicos Autmatas Finitos Expresiones Regulares Sintcticos Diagramas Sintcticos BNF EBNF Semnticos Gramticas Atribuidas Generacin del Cdigo Code Functions

Metalenguajes Lxicos

Conceptos Bsicos

Metalenguajes Lxicos
Autmatas Finitos Paso 1. Definir cada token con un autmata

.5 ?

Metalenguajes Lxicos
Expresiones Regulares Operadores Concatenacin Cierre: * Cierre Positivo: + Alternativa: | Agrupacin: ( ) Ejemplos (0|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)+ while .5 ?
9

pa pa* pa+ p|a (pa)+

Interfaz del Lxico

Procesadores de Lenguaje

10

Construccin Analizador Lxico


Pasos para obtener Analizador Lxico Determinar los tokens Definir un patrn para cada uno Implementar los patrones Manual Herramientas

patrones

Lexico.java

patrones

Herramienta (JFlex)

Lexico.java

11

Funcionalidad Requerida
Independientemente de cmo est implementado Eliminar espacios y comentarios Control de nmero de lnea Interfaz de Salida Interfaz de Entrada

12

Interfaz de Salida
No se procesa todo el fichero de una vez yylex Valores a devolver Qu valores hay que devolver? De qu tipo es cada uno? Representacin Cmo los devuelve el lxico? Protocolo de Acceso

13

Interfaz de Salida
Representacin de Tokens Se acuerda representacin mediante constantes public interface static final static final static final static final static final static final } Tokens { int IDENT = 1; int IF = 2; int CTE = 3; int REAL = 4; int IGUAL = 5; int PTOYCOMA = 6;

El 0 se reserva

14

Interfaz de Salida
Representacin de Tokens Los tokens de un solo carcter utilizan su cdigo ASCII public interface Tokens { static final int IDENT = 257; static final int IF = 258; static final int CTE = 259; static final int REAL = 260; static final int IGUAL = =; static final int PTOYCOMA = ;; } Facilita la lectura del sintctico

// Redundante // Redundante

asigna: IDENT IGUAL PARABRIR expr PARCERRAR PTOYCOMA asigna: IDENT = ( expr ) ; Numeracin comienza en 256 No se definen como Tokens
15

Interfaz de Salida
Representacin del lexema a = 56 + 3.5 Opcion 1 Opcion 2 a = 56 + 3.5 a = (int)56 + (double)3.5

Tipo variable? public class ParserVal { public int ival; // Si public double dval; public String sval; public Object obj; [..] Un constructor por }

el token es ENTERO // Si es real // Si es identificador cada tipo primitivo

16

Interfaz de Salida
Protocolo de Acceso Mtodo por valor class Lxico { int yylex() { } String lexeme() { } int line() { } } Mtodo nico class Lxico { Token yylex() { } } class Token { int getToken() { } String lexeme() { } int line() { } }

17

Interfaz de Entrada
De dnde recibe el lxico los caracteres? public class Lxico { private Reader input; public Lxico(Reader reader) { input = reader; } } Posibilidades Lxico Lxico Lxico Lxico lex lex lex lex = = = = new new new new Lxico(new Lxico(new Lxico(new Lxico(new InputStreamReader(System.in)); StringReader("cont = 12+x;")); FileReader("programa.txt")); FileReader(argv[0]));

18

Interfaz. Resumen
Interfaces de Entrada y de Salida Lxico lex = new Lxico(new FileReader(prog.c)); int token; while ((token = lex.yylex()) != 0) Sop(lex.line()+: + token +:"+ lex.lexeme()); Entrada altura + 1.75 Salida
1 yylex lexeme line interface Tokens static final static final static final static final } 2 3 { int int int int

IDENT = 257; IF = 258; CTE = 259; REAL = 260;

19

Implementacin Manual

Anlisis Lxico

20

Implementacin Manual
Pasos para obtener Analizador Lxico Determinar los tokens Definir un patrn para cada token Implementar los patrones

patrones

Lexico.java

Alternativas ms comunes Tabla de estados Implementacin Estructurada

21

Tabla de Estados
Proceso Se unen autmatas, se hace determinista y se simplifica

int autmata[][]={ /* /* state 0 */ {0,0, /* state 1 */ {0,0, /* state 2 */ {0,0, /* state 3 */ {0,0, /* state 4 */ {0,0, /* state 5 */ {0,0, /* state 6 */ {0,0,

... ... ... ... ... ... ... ...

0 1 2...+...e f g h i 0,0,0...0...0,0,0,0,0 7,7,7...9...4,4,4,4,2 4,4,4...0...4,3,4,4,4 4,4,4...0...4,4,4,4,4 4,4,4...0...4,4,4,4,4 6,6,6...0...0,0,0,0,0 6,6,6...0...0,0,0,0,0

... */ ...}, ...}, ...}, ...}, ...}, ...}, ...},

22

Implementacin Estructurada
Cuando el autmata se asemeja a un ordinograma estructurado La implementacin es la traduccin a cdigo del diagrama El lxico de la mayora de los lenguajes lo cumplen Es la implementacin ms eficiente y ms usada

23

Implementacin Estructurada
Ejemplo edad = 65; Paso 1 public interface Tokens { static final int IDENT = 257; static final int CTE = 258; // El = y el ; tal cual } Paso 2 IDENT CTE = ; [a-zA-Z][a-zA-Z0-9]* [0-9]+ = ; Fcilmente convertible en ordinograma

24

Implementacin Estructurada
public class Yylex { private Reader input; private int currentChar; public Yylex(Reader reader) { input = reader; readNext(); } private char readNext() throws IOException { currentChar = input.read(); return (char) currentChar; } private char getChar() throws IOException { return (char) currentChar; } private boolean noMoreChars() { return (currentChar == -1); } private string lexeme; public string lexeme() { return lexeme; }

25

Implementacin Estructurada
public int yylex() throws IOException { while (true) { while (Character.isWhitespace(getChar())) readNext(); if (noMoreChars()) return 0; if (getChar() == ';') { readNext(); return ';'; } if (getChar() == =') { readNext(); return ='; } if (Character.isDigit(getChar())) { StringBuffer buffer = new StringBuffer(); buffer.append(getChar()); while (Character.isDigit(readNext())) buffer.append(getChar()); lexeme = buffer.toString(); return Tokens.CTE; } if (Character.isLetter(getChar())) { StringBuffer buffer = new StringBuffer(); buffer.append(getChar()); while (Character.isLetterOrDigit(readNext())) buffer.append(getChar()); lexeme = buffer.toString(); return Tokens.IDENT; } System.out.println("Error lxico: " + getChar()); readNext(); } }

26

Implementacin Estructurada
Tarea. Mejoras sobre el lxico anterior Cmo meter ms operadores? +, - * / % { } )[ ] . , Sera repetir el mismo cdigo del ; una y otra vez? Cmo meter palabras reservadas? return, if, while, else, return. Contar nmero de lneas

27

Generacin Automtica

Anlisis Lxico

28

Generacin Automtica
Pasos para obtener Analizador Lxico Determinar los tokens Definir un patrn para cada uno Escribir los patrones en el formato de la herramienta

lexico.l

Herramienta (JFlex)

Lexico.java

java -jar jflex.jar lexico.l

Genera una tabla de estados y el cdigo que la recorre

29

Generacin Automtica
%% %byaccj %unicode %% [a-zA-Z][a-zA-Z0-9_]* [0-9]+ .|\n

{ return Tokens.IDENT; } { return Tokens.CTE; } { /* No hacer nada*/ }

Realiza la mayor parte de las tareas que antes se hacan a mano if (Character.isDigit(getChar())) { StringBuffer buffer = new StringBuffer(); buffer.append(getChar()); while (Character.isDigit(readNext())) buffer.append(getChar()); lexeme = buffer.toString(); return Tokens.CTE; }
30

Formato de Entrada
Fichero de entrada a JFlex <Cdigo de Usuario> %% <Opciones y Declaraciones> %% <Seccin de Reglas>

31

Seccin de Cdigo de Usuario

import z.x; %% <Opciones y Declaraciones> %% <Seccin de Reglas>

import z.x; class Yylex {

int yylex() {

} }

32

Seccin de Opciones y Declaraciones


Cdigo de Clase <Cdigo de Usuario> %% %{ int n; void f(void) { } %} %% <Seccin de Reglas>

class Yylex { int n; void f(void) { } int yylex() {

} }

33

Seccin de Opciones y Declaraciones


Directivas <Cdigo de Usuario> %% %class <clase> %function <func> %line %column

class <clase> { int yyline; int yycolumn;

%byacc %unicode %debug

int <func>() {

} %% <Seccin de Reglas> }

34

Seccin de Reglas
<Cdigo de Usuario> %% <Opciones y Declaraciones> %% [patrn 1] [accin 1] [patrn 2] [accin 2] [patrn 3] [accin 3]

class Yylex {

Error si la entrada no cumple ningn patrn

int yylex() { [accin1] [accin2] [accin3] } }

35

Expresiones Regulares
Operador a|b ab a* a+ (a) a? ~a pa? p~a p, pa pa, pba, pca, pbcdfsgea Ejemplo Sentencias

36

Expresiones Regulares
Operando Sec. Escape Cadenas Ejemplo \r \n \t a\+ a+ a?b+ a\n [abcde] [a-e] [a-zA-Z_] [+-*/] [^abc] p.a .+ (.|\n)+ a+ a+ Sentencias

Conjuntos

a, b, c, d, e a, b, c, d, e letra o subrayado ? d, e, f, g,

(a|b|c|d|e)

Conjunto Negado Punto

paa, pba, p4a, p$a,

37

Acciones
Miembros Generados en la clase Yylex String yytext(); private int yyline; private int yycolumn; Ejemplo %% %byaccj %unicode %line %% [a-zA-Z]+ .|\n // Si %line // Si %column

{ sop("Ident: "+ yytext() +" en "+ yyline); } { }

38

Finalizacin de yylex
yylex finaliza al procesar todo el fichero Contina despus de ejecutar una accin Para indicar que se desea salir de yylex al ejecutar una accin

[a-z]+ { sop(1);} [0-9]+ { sop(2);} .|\n { }

[a-z]+ { sop(1); return Tokens.IDENT; } [0-9]+ { sop(1); return Tokens.NUM; } .|\n { } // En esta no finaliza

void main(String[] args)throws IOException { Yylex lex; lex = new Yylex(new FileReader(f.txt)); lex.yylex() // Una llamada // Ha ejecutado todas las acciones cuyo // patrn se haya cumplido }

void main(String[] args)throws IOException { Yylex lex; lex = new Yylex(new FileReader(f.txt)); int token; while ((token = lex.yylex()) != 0) sop(token); }

39

Resolucin de Conflictos
Ejemplo [0-8]+ [0-9]+ Entrada 32954 32954 Entrada 32A 32A { sop(regla 1); } { sop(regla 2); }

regla 1 regla 2

regla 1 regla 2

40

Ejemplos
Ejemplo Convertir un texto en maysculas y eliminar espacios repetidos %% %byaccj %unicode %% [a-z] { Sop(yytext().toUpperCase()); } + { Sop( ); } .|\n { Sop(yytext()); } Ejemplo Contar caracteres, palabras y lneas %% %byaccj %unicode %{ public int caracteres, %} %% [a-zA-Z][a-zA-Z0-9_]* \n .

palabras, lineas;

{ palabras++; caracteres+= yytext().length(); } { lineas++; caracteres++; } { caracteres++; }

41

Ejercicio E1
Lxico del siguiente lenguaje edad = 65; { Comentario de varias lneas }

42

Tarea
Mejoras sobre el lxico anterior Aadir ms operadores +, - * / % { } )[ ] . , Aadir palabras reservadas return, if, while, else, return. Contar nmero de lneas

43

Ejemplo
Analizar lnea de comando c:\>prog v verbose f <file> -file <file> -? h help Solucin %% %byaccj %unicode %{ public int verbose = false; public String file; %} %% -h | -? | -help { sop(Ayuda: -v f <file>);} -v | -verbose -f [a-zA-Z0-9_.]+ -file [a-zA-Z0-9_.]+ { } . { sop(Opcin no permitida); } { verbose = true; } { file = yytext().substring(3);} { file = yytext().substring(6);}

44

Solucin E1
%% %byaccj %unicode %line %column interface Tokens { static final int IDENT = 257; static final int CTE = 258; }

%{ public string lexeme() { return yytext(); } public int line() { return yyline+1; } public int column() { return yycolumn+1; } %} %% [=;]

{ return yytext().charAt(0); }

// yycharat(0)

[a-zA-Z][a-zA-Z0-9_]* { return Tokens.IDENT; } [0-9]+ { return Tokens.CTE; } [ \n\r\t] "{" ~"} . { } { }

{ Sop("Error " + line() + ":" + column() + Lexema = + yytext());}

45

You might also like