El generador JavaCC (Java Compiler Compiler) es una herramienta para generar programas escritos en lenguaje Java; acepta como entrada una especificación de un determinado lenguaje y produce como salida un analizador para ese lenguaje. En la manera más simple de funcionamiento, la especificación proporcio-nada define las características sintácticas y lexicográficas de un lenguaje y se genera un analizador léxico-sintáctico del lenguaje especificado; pero también es posible completar una especificación léxico-sintáctica con la inclusión adecuada de código para que el programa generado llegue a ser un analizador completo del lenguaje.
◊ Obtención de un analizador léxico-sintáctico
• Pasos para la generación del analizador
1.- Edición de la especificación (editor de texto plano)
vi | edit |· · · NombreFichero.jj
(el nombre del fichero puede tener cualquier extensión; suele usarse .jj)
2.- Ejecución del generador
javacc NombreFichero.jj
Si el nombre elegido para la especificación es NombreDeLaEspecif (más adelante se indica la manera de dar un nombre a la especificación), como resultado de la generación se obtiene (además de otros ficheros auxiliares) el fichero
NombreDeLaEspecif.java
3.- Compilación del analizador generado
javac NombreDeLaEspecif.java
Como resultado de la compilación se obtiene (además de otras clases auxiliares) el fichero
NombreDeLaEspecif.class
• Ejecución del analizador generado
Si el nombre del fichero donde se encuentra el texto fuente (escrito en el lenguaje para el que se ha genera-do el analizador) que se pretende analizar es Programa.len
java NombreDeLaEspecif <>
Si se desea que los resultados del análisis, en vez de presentarse por pantalla, queden grabados en un fi-chero de nombre Salida.dat
java NombreDeLaEspecif <> Salida.dat
◊ Ejemplo de presentación
• Descripción del lenguaje
El lenguaje L está formado por las expresiones en las que pueden aparecer:
- variables
- constantes
- operadores + y *
Las variables son nombres formados por una única letra (minúscula o mayúscula); las constantes son nú-meros enteros de una o más cifras. El espacio y el tabulador pueden estar presentes, pero no tienen ningún significado; los finales de línea tampoco son significativos (una expresión puede codificarse ocupando una o más líneas).
La sintaxis de las expresiones se especifica mediante la siguiente gramática:
| constante
| (
• Especificación léxico-sintáctica codificada con la notación JavaCC
Una manera de escribir la especificación (para la que se ha elegido el nombre ExprMin) de forma que sea aceptada por el generador es:
options { Ignore_Case = true; }
PARSER_BEGIN (ExprMin)
public class ExprMin {
public static void main (String[] argum) throws ParseException {
ExprMin anLexSint = new ExprMin (System.in);
anLexSint.unaExpresion();
System.out.println("Análisis terminado:");
System.out.println
("no se han hallado errores léxico-sintácticos");
}
}
PARSER_END (ExprMin)
void unaExpresion() :
{ }
{
expresion()
}
void expresion() :
{ }
{
termino() ( "+" termino() )*
}
void termino() :
{ }
{
factor() ( "*" factor() )*
}
void factor() :
{ }
{
|
| "(" expresion() ")"
}
TOKEN:
{
<>
}
TOKEN:
{
<>
}
SKIP:
{ " " | "\t" | "\n" | "\r" }
• Obtención del analizador
Si la especificación precedente se tiene grabada en un fichero de nombre Ejemplo.jj, para obtener el analizador:
- se ejecuta el generador: javacc Ejemplo.jj
- se compila el analizador generado: javac ExprMin.java
• Ejecución del analizador
Si se quiere analizar una expresión grabada en un fichero de nombre PruebaExp.txt:
- se ejecuta el analizador obtenido: java ExprMin <>
Webgrafia:
http://www.lpsi.eui.upm.es/webcomp/jgperez/java/IntrodJavaCC.pdf
No hay comentarios:
Publicar un comentario