Está en la página 1de 11

Estructura de un Programa en JavaCC

Que es Java CC

JavaCC (Java Compiler Compiler -


Metacompilador en Java) es el principal
metacompilador en JavaCC, tanto por sus
posibilidades, como por su ámbito de difusión.
Se trata de una herramienta que facilita la
construcción de analizadores léxicos y
sintácticos por el método de las funciones
recursivas, aunque permite una notación
relajada muy parecida a la BNF. De esta manera,
los analizadores generados utilizan la técnica
descendente a la hora de obtener el árbol
sintáctico.
Nata
JavaCC carece de una gestión de atributos específica, pero permite
el paso de parámetros y la devolución de valores cada vez que se
invoca a un no terminal. De esta manera, cada vez que se invoca a
un no terminal, podemos asignar el valor que devuelve a una
variable global declarada en el bloque de código Java asociado a
dicha regla; este valor hace las veces de atributo sintetizado.
Además, cuando se declara un no terminal, puede poseer
parámetros formales, de tal manera que deba ser invocada con
parámetros reales que harán las veces de atributos heredados.
Desgraciadamente, JavaCC tampoco permite asociar atributos a los
terminales, por lo que deberán ser las acciones semánticas quienes
trabajen directamente con los lexemas. Aunque esto puede ser un
engorro en la mayoría de los casos, tiene la ventaja de que cada
acción semántica puede extraer del lexema la información que le
convenga, en lugar de utilizar siempre el mismo atributo en todos
los consecuentes en los que parezca un mismo terminal

Iván
Atributos

Los atributos son las características individuales


que diferencian un objeto de otro y determinan
su apariencia, estado u otras cualidades. Los
atributos se guardan en variables denominadas
de instancia, y cada objeto particular puede
tener valores distintos para estas variables.

Kevin
Estructura
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:

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.
Marcos
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). Cabe aclarar que existen más formas de
definir los dos tipos de entradas, aquí solo vemos
dos básicas.

Dario
GESTIÓN DE ATRIBUTOS.

Como se ha ido diciendo a lo largo de este capítulo, JavaCC ofrece mecanismos


para la gestión de los atributos asociados a las entidades léxicas. En este
apartado vamos a hacer una recopilación de todos ellos. Pero en primer lugar
debemos hablar de clase token, la cual nos servirá para el posterior desarrollo de
cada uno de los mecanismos
mencionados.
LA CLASE TOKEN.
La clase Token es el tipo de los objetos token que son creados por el token
manager
después del escaneo exitoso de la cadena de entrada durante el análisis léxico.
Estos objetos son pasados al parser y se accede a las acciones de la gramática
JavaCC
usualmente retornando el valor del token. Los métodos getToken y getNextToken
del token manager, dan acceso a los objetos de este tipo.
Existen dos clases de tokens: regulares y especiales.
• Los tokens regulares son los tokens normales que maneja el parser.Los tokens
especiales son otros tokens muy usados que aunque no tienen
relevancia sintáctica no son descartados, tales como los comentarios.

Pedro
Tipo de gestión de atributos

Declarando el método void CommonTokenAction (Token t). Éste se


va a ejecutar siempre después de que una entrada se ajuste a
alguna de las expresiones regulares usadas para definir las distintas
entidades léxicas. De este modo podríamos hacer algo como:

NúmeroDePalabras y atributoDisponible son variables declaradas


en la clase principal sobre las cuales trabajamos. Las posibilidades
que se nos ofrecen mediante el empleo de este método son
enormes, pudiendo hacer cualquier clase de comprobación sobre
la cadena de entrada y en base a ella trabajar de una forma u otra.

Enzo
Acciones léxicas

Añadiendo acciones léxicas en la definición de un token mediante


bloques de códigojava. Como puede verse en el ejemplo en donde se
define un token de la siguiente manera: Como podemos ver, tras el
reconocimiento de la entidad léxica se realiza una acción, que en este
caso ha sido la de mostrar una línea por pantalla, pero del mismo modo
se hubiera podido recoger el contenido de token.image y guardarlo en
alguna variable del programa o cualquier otra clase de acción que
conlleve el reconocimientodel atributo asociado. Cuando una entrada se
ajusta a una expresión regular, se ejecuta la acción léxica (si es que hay
alguna especificada).

Maca
Haciendo uso de los parámetros de entrada y tipos de
retorno de los No Terminales. Como hemos visto, los
No Terminales se van a declarar como métodos en java
y por lo tanto tienen sus correspondientes parámetros
de entrada y de salida. Éstos pueden ser usados para
transmitir hacia arriba o hacia abajo en el árbol
sintáctico atributos asociados a entidades léxicas. En el
ejemplo 2.10. podemos ver el empleo de este
mecanismo:

Luis

También podría gustarte