Beruflich Dokumente
Kultur Dokumente
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)
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
Procesadores de Lenguaje
10
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 }
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
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
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,
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
29
Generacin Automtica
%% %byaccj %unicode %% [a-zA-Z][a-zA-Z0-9_]* [0-9]+ .|\n
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
int yylex() {
} }
32
} }
33
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 {
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)
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
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); 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;
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)
45