.

18 mar. 2011

Analizador lexico en java con Jlex

Primero empezamos creando el archivo .lex 


 1 import java_cup.runtime.*;
 2 
 3 %%
 4  
 5 %class scanner
 6 %public 
 7 %cup 
 8 %line 
 9 %full 
10 %unicode 
11 %ignorecase 
12 %char 
13 %eofval{ 
14 {return new Symbol(Token.EOF, null); } 
15 %eofval} 
16 
17 ALPHA=[A-Za-zÑñ] 
18 DIGITO=[0-9]
19 IDENTIFICADOR={ALPHA}({ALPHA}|{DIGITO}|"_")*
20 NUMERO=({DIGITO})+("."({DIGITO})+)?
21 RESERVADAS="Project"|"Tabla"|"atributo"|"Relacion"
22 ATRIBUTO="name"|"nombre"|"x"|"y"|"tipo"|"pk"|"nnull"|"unique"|"Longitud"
23 %%
24  
25 [\n] { yychar=0;} 
26 [ \t\r\n\f] { /* ignore white space. */ } 
27 \? { /* ignore apostrofos. */ }
28 
29 <YYINITIAL>[\t\r\f] {/*no hace nada, aumenta una columna*/yychar++; } 
30 <YYINITIAL>[\n] {yychar=0;yyline++;}
31 <YYINITIAL>{
32 "<" {yybegin(ESTADO_1); return new Symbol(Token.ABRIR, yyline, yychar, yytext());} { /* cuando viene < pasamos al estado 1 */ }
33 }
34 <ESTADO_1>{
35 RESERVADAS {yybegin(ESTADO_2); return new Symbol(Token.RESERVADAS, yyline, yychar, yytext());}
36 }
37 <ESTADO_2>{
38 ATRIBUTO {yybegin(ESTADO_3); return new Symbol(Token.ATRIBUTO, yyline, yychar, yytext());}
39 }
40 <ESTADO_3>{
41 "=" {yybegin(ESTADO_4); return new Symbol(Token.EQUAL, yyline, yychar, yytext());}
42 }
43 <ESTADO_4>{
44 IDENTIFICADOR {yybegin(ESTADO_5); return new Symbol(Token.IDENTIFICADOR, yyline, yychar, yytext());}
45 }
46 <ESTADO_5>{
47 ";" {yybegin(ESTADO_6); return new Symbol(Token.POINTCOMA, yyline, yychar, yytext());}
48 }
49 <ESTADO_6>{
50 ">" { return new Symbol(Token.CERRAR, yyline, yychar, yytext());}
51 ATRIBUTO {yybegin(ESTADO_3); return new Symbol(Token.ATRIBUTO, yyline, yychar, yytext());}
52 }
53 
54 
55 . {System.out.println("Error lexico en la fila "+yyline+" y en la columna " + yychar);}

No hay comentarios:

Publicar un comentario en la entrada