Capítulo 4: Estructura de un Programa en JavaCC

         Primero que nada un archivo de JavaCC tiene que llevar la extensión .jj (sólo por gusto y por tratar de seguir un estandar, ya que con que cumpla con la estructura y sea un archivo plano es suficiente) y el nombre que estos tengan no forzosamente debe coincidir con el nombre de la clase JavaCC. Los programas en JavaCC siguen esta estructura general:

options{
   ...
}
PARSER_BEGIN( Nombre )
   public class Nombre{
     ...

     ...
   }
PARSER_END( Nombre )
Producción

          En la parte de options se colocan las opciones de JavaCC, es opcional, a partir de PARSER_BEGIN hasta PARSER_END es la declaración del programa en Java, es importante que se entienda que esta parte es código en Java, y que cualquier cosa que aquí se programe es omitido por JavaCC es hasta la compilación en Java que se encuentran los errores de esta parte. Por último, en la parte de producción se colocan las Gramáticas y Expresiones Regulares como lo vimos anteriormente.

          JavaCC se encarga de generar lo necesario para complementar esta clase, de forma tal, que cuando se crea una instancia de ésta, se llama al constructor que se le pasa como parámetro el tipo de entrada, existen dos tipos de entrada, por línea de comando (línea por línea) y por archivo (todo un código fuente). Esto es programación en Java, por lo cual no entraré mucho en detalle y cabe aclarar que existen más formas de definir los dos tipos de entradas, aquí solo veremos dos básicas, pero si sabes programar en Java puedes colocar tu instrucción favorita para definir el tipo de entrada.

Entrada por línea de comando:

          JavaCC espera a que el usuario escriba el código de acuerdo a la gramática llamada y a los tokens aceptados por ésta. Cuando encuentra un delimitador ejecuta la acción programada en la gramática.

          Este tipo de entrada se obtiene con la instrucción System.in de esta forma si ustedes colocan la siguiente línea, podrán leer una línea:

Nombre parser = new Nombre(System.in);

          Para mejorar la comprensión de esto, aquí coloco un ejemplo:

          Este pequeño programa espera que el usuario coloque las instrucciones <lee id.> o <pon id.> o <pon "cadena".> de otro modo mandará un error.

Entrada por archivo:

          Este tipo de entrada es la más utilizada por los compiladores, pues se lee un código fuente (archivo) y se intenta compilar, las líneas para lograrlo son las siguientes:

Nombre parser;
try{
   parser= new Nombre(new java.io.FileInputStream(Archivo));
}catch(java.io.FileNotFoundException e){
   ...
}

          Aquí primero se declara la instancia de nuestra clase de JavaCC, luego intentamos leer un archivo, donde Archivo es una cadena de caracteres que indican la ruta (si es necesaria) y el nombre del archivo. Si no logra leer el archivo nos arroja el FileNotFoundException, pero detallar solo sería entrar a Java, así que sólo les diré que en esa parte pueden mandar un mensaje de que no se encontró el archivo. A continuación colocó el mismo programa del ejemplo anterior, sólo que con las modificaciones necesarias para leer el código desde un archivo.

          Espero que les haya quedado clara la definición del programa, por último veremos un ejemplo de cómo jalar una clase de JavaCC, sin necesidad de que el main sea declarado en JavaCC, para esto utilizaremos el mismo main, pero en otro archivo, al que llamaremos afuera.java. Vemos a nuestra derecha el archivo de JavaCC (*.jj) y a la izquierda el archivo afuera.java.

          Cabe aclarar que los archivos están dentro del mismo proyecto (sin importar el ide que se utilice) y que el proyecto lleva el nombre de afuera. Ya para finalizar, les explicaré cómo compilar los archivos de JavaCC.

Desde MS-DOS:

Se supone que ya hicieron su archivo *.jj, en este ejemplo utilizaré el archivo Liza.jj

C:\Java1.4\JavaCC2.1\bin>javacc c:\misdoc~1\Liza\liza.jj
Java Compiler Compiler Version 2.1 (Parser Generator)
Copyright (c) 1996-2001 Sun Microsystems, Inc.
Copyright (c) 1997-2001 WebGain, Inc.
(type "javacc" with no arguments for help)
Reading from file c:\misdoc~1\tutorial\liza.jj . . .
File "TokenMgrError.java" does not exist. Will create one.
File "ParseException.java" does not exist. Will create one.
File "Token.java" does not exist. Will create one.
File "SimpleCharStream.java" does not exist. Will create one.
Parser generated successfully.

Aquí ya creamos los siguientes archivos:
          Liza.java
          LizaConstans.java
          LizaTokenManager.java
          ParserException.java
          SimpleCharStream.java
          Token.Java
          TokenMgrError.java

C:\Java1.4\bin>javac c:\Java1.4\javacc2.1\bin\*.java

Suponemos que en esa carpeta no existía ningún .java antes de la compilación de javacc, esta última instrucción nos creará los .class o las clases de Java. A continuación utilizaré un archivo .bat que hice para rutear la clase de java sin perder alguna ruta antes definida por otro lenguaje, para bajarte el archivo da click aquí y colócalo en tu directorio bin de Java.

C:\Java1.4\bin>j c:\Java1.4\javacc2.1\bin Liza

Al dar enter veras como corre tu aplicación... pero esta es la forma de hacerlo a travez de línea de comando (MS-DOS) abajo vermos como hacerlo desde window y con un IDE de Java. La sintaxis de nuestra instrucción es:

          j path clase

      Donde nada es opcional y:

          path es la ruta donde se encuentra tu archivo .class a correr en Java.

          clase es el nombre de la clase que vas a ejecutar. IMPORTANTE: no es lo mismo Liza que liza.

Desde Windows:

          Para nuestro ejemplo utilizaré el IDE de Java JCreator LE de Wendel de Witte, bájalo de su página oficial http://www.jcreator.com.

          Primero abrimos el javaccw.exe, que se encuentra en el directorio bin de javacc2.1, ahí eliges el archivo [fig. 1], detallas las opciones de JavaCC [fig. 2] (no te metas en esto, si tu conocimiento sobre JavaCC no excede del mío ^_^U o al menos que te guste experimentar). Luego confirmamos presionando el botón build [fig. 3] y por último nos saldrán los mensjes de errores o en su defecto el maravilloso Parser generated successfully [fig. 4].


fig. 1


fig. 2


fig. 3


fig. 4

          Ya creado los archivos, nos metemos a nuestro IDE y creamos un proyecto con el mismo nombre que la clase que contiene el main para que el proyecto lo reconozca como la clase principal [fig. 5]. Luego colocamos nuestros archivos dentro del proyecto [fig. 6], después compilamos [fig. 7] y por último corremos el programa [fig. 8].


fig. 5


fig. 6: Para insertar todos los archivos solo se le da click derecho sobre
el nombre del proyecto realzado en azul y se escoje agregar arhivos.


fig. 7


fig. 8

          Bueno espero que este capítulo les haya servido de mucho.

                      

 

Hosted by www.Geocities.ws

1