Resumen
El siguiente artculo trata sobre cmo si se tiene por un lado un
generador de analizadores lxicos (JFlex) y por otro lado un generador de analizadores sintcticos (CUP), se pueden integrar cada uno
de los procesos de dichos metacompiladores para de esta forma obtener
un compilador mucho mas completo y personalizado, esto ahorra de
manera abismal la generacin de cdigo al momento de programar un
compilador.
The next article is about how if you have in one hand a lexical analysis
(JFlex) and in the other hand a parser generator (CUP), you can integrate the process of the tow analyzers and get a completely compiler
software, with these you can save thousands of programming time and
lines of algorithms code.
JFlex es un metacompilador que permite generar rapidamente analizadores lxicos que se integran con Java.
1. Caractersticas de JFlex
Las caractersticas sobre salientes de JFlex son las siguientes:
Soporte completo con caracteres unicode
util debemos
import java.util.*;
Luego sigue un par de signos de porcentaje ( %) para indicar que
empezar la denicin del bloque de conguracin del analizador. El
bloque de conguracin se dene por el conjunto de parmetros que
Unicode
, es una gran tabla, que en la actualidad asigna un cdigo a cada uno de los
ms de cincuenta mil smbolos, los cuales abarcan todos los alfabetos europeos, ideogramas
chinos, japoneses, coreanos, muchas otras formas de escritura, y ms de un millar de
smbolos especiales.
%unicode
%line
%column
%{
public static void escribir(String cadena)
{
System.out.println(cadena);
}
%}
FinDeLinea = \r | \n | \r\n
Variable = [:jletter:][:jletterdigit:]*
Si = Si
Entero = 0 | [1-9][0-9]*
En la prxima lnea de cdigo se especican los posible estados en
%class Lexer:
nombre.
%unicode:
%cup:
%line:
se esta analizando.
%line:
Sino
Si,
regular
yybegin(CADENA),
esto indica al escner que a partir del llamado de esa funcin el escner se encontrar en el estado lxico CADENA, por otro lado tenemos
3. Codicacin de caracteres
%7bit
Permite usar entradas de 7 bits, es decir entre 0-127. Si una entrada es mayor que 127 se generar un error en tiempo de ejecucin y
se lanzar una excepcin de tipo
ArrayIndexOutofBoundsException.
%full
%8bit
Permite usar entradas de 8 bits, es decir entre 0-255. Si una entrada es mayor que 255 se generar un error en tiempo de ejecucin y
ArrayIndexOutofBoundsException.
%unicode
%16bit
Esto signica que la entrada puede ser cualquier tipo de caracter,
es decir, entre 0-65535. Para esta directiva no se produce ningn
tipo de error en tiempo de ejecucin.
4. Reglas lxicas
Las
acciones.
reglas lxicas
iente gramtica:
|
|
|
|
'[:digit:]'
'[:uppercase:]'
'[:lowercase:]'
'.'
JavaCode
Es una secuencia que describe las especicaciones del lenguaje
Java.
Character
Una secuencia de caracteres que no sean ninguno de los siguientes:
| (
!
) {
} [
] < > \ . *
+ ?
$ /
" -
StringCharacter
Una secuancia de caracteres que no sean ninguno de los siguientes:
"
a | b Unin
Es una expresin regular que encuentra todas las entradas que
a b.
a b Concatenacin
sean validas para
a seguida de b.
a* Cerradura de Kleene
sean validas para
a.
a+ Iteracin
Es una expresin regular que encuentra todas las entradas que
sean validas para una o mas repeticiones de
aa*
a. Es equivalente a
a? Opcin
Es una expresin regular que encuentra todas las entradas que
sean validas para cero o una ocurrencia de
!a Negacin
a.
a{n} Repeticin
a.
a{n}{m}
a.
a.
a.
| ((!c)(d*)).
los use generen conicto con otros mtodos o atributos de las dems
clases. JFlex no tiene mtodos ni atributos pblicos o privados, por el
contrario utiliza los prejos
yy y zz
String yytext()
Devuelve la cadena que coincidi con la respectiva expresin regular.
int yylength()
Devuelve el tamao de la cadena que coincidi con la respectiva
expresin regular.
pos
de la
void yyclose()
Cierra el ujo de la entrada de datos, por tanto a todas las entradas siguientes arrojara n de archivo.
int yystate()
Devuelve el estado lxico actual del analizador.
int yyline
Contiene el nmero de la lnea en la que se encuentra el analizador. (Solo si se incluy la directiva %line)
int yychar
Contiene el nmero del carcter que se esta analizando.
int yycolumn
Contiene el nmero de la columna en la que se encuentra el analizador. (Solo si se incluy la directiva %column)
import.
package
rol que el
package nombre_del_paquete;
donde nombre_del_paquetes es el nombre del paquete al que se esta
incluyendo la clase en Java. En general, CUP implementa las convenciones lxicas de Java, como por ejemplo, soporta los dos tipos de
comentarios que soporta Java.
Despus de la declaracin opcional de
package,
import nombre_del_paquete.nombre_de_la_clase;
o
import nombre_del_paquete.*;
En general, la declaracin del paquete indica en donde se van a incluir
import
package,
viene
parser,
{: :}.
{: :}.
parser
es el que se
parser.
void
scan with
Symbol en la pila
simbolo .
precedence left
terminal, terminal, ...;
precedence right
terminal, terminal, ...;
precedence nonassoc terminal, terminal, ...;
La coma separa los terminales que deben tener asociatividad y en ese
nivel de precedencia que se esta declarando. El orden de la precedencia del mayor a menor es de abajo a arriba. En el siguiente ejemplo el
producto y la divisin son asociativos y tiene mayor precedencia que
la suma y la resta que son asociativos entre ellos.
precedence left
SUMA, RESTA;
entrada
o por el
tiene
start with...;
string
parser.java.
sym.java
package
y
parser
name:
name.
sym
parser
expect
sym
number:
nosummary:
progress:
time:
sobre los tiempos resultantes del analizador. Muy til para futuros mantenimientos y optimizacin del analizador.
version:
se esta trabajando.
parse(),
que
p= par.parse().value;
Como el objeto almacenado en el atributo value es de la clase Object, normalmente se realizar un casting para convertirlo a la clase
adecuada, como por ejemplo:
p= (Prog) par.parse().value;