Capítulo 2: Expresiones Regulares en JavaCC

          Introducción:

          JavaCC es una herramienta para crear compiladores, tiene una gran potencia, pero en este tutorial sólo se explicará lo básico. Empecemos con las Expresiones Regulares. Una E.R. en JavaCC no se aleja mucho de una E.R. llevada a papel y lápiz, Empezaremos por los símbolos que utiliza JavaCC.

*

 

Significa que hará 0 o más repeticiones del elemento al que preceda

 

+

 

Significa que hará 1 o más repeticiones del elemento al que preceda

 

( )

 

Signo de agrupación, si lo que contiene dentro es una opción sólo sacará un elemento

 

[]

 

Ok este lo veremos más adelante, por su diversidad de usos

 

-

 

Indica qué es un intervalo de valores

 

|

 

Decisión, OR.

 

""

 

El caracter o símbolo que se encuentre dentro de las comillas es símbolo del lenguaje

 

~

 

Negación, luego veremos su uso

 

?

 

Elementos opcionales.

 

<e.r.>

 

Llamada a otra expresión regular

 

#

 

Expresión Regular Exclusiva para el uso de las E.R.'s

 

{} Repeticiones controladas en la E.R, veremos más a detalle luego.

          Una E.R. en JavaCC puede o no tener un nombre, además ésta va definida entre < y >, de la siguiente manera:

<la definición de la expresión regular> <NOMBRE: la definición de la expresión regular>

Estas E.R.'s son token tipo SKIP

 

Donde NOMBRE, es con lo que llamaremos a esta expresión regular y sigue las mismas reglas que un nombre de variable en Java (inicia con letra o guión bajo, le siguen letras números o guiones bajos).

          Una vez visto los símbolos utilizados por JavaCC para definir las E.R.'s, nos adentraremos en el uso de estos símbolos:

<"a">

E.R. sin nombre, que acepta el caracter "a".
<VOID: "void">

E.R. de nombre VOID, que acepta el token void.
<LETRA: ["a"-"z"]>

E.R. de nombre LETRA, que acepta un caracter del intervalo de la "a" a la "z"

<LETRAS: ["a"-"z"]+>

E.R. de nombre LETRAS, que acepta uno o más caracteres del intervalo de la "a" a la "z"
<LETRAS2: ["a"-"z"]*>

E.R. de nombre LETRAS2, que acepta cero o más caracteres del intervalo de la "a"a la "z"
<IF: ("i"|"I")("f"|"F")>

E.R. de nombre IF, que acepta el token "if" en mayúsculas y minúsculas
<SIGNO: ["-"]>

E.R. de nombre SIGNO, que acepta el caracter "-" ó nada
<SIGNOS: ("+"|"-")?>

E.R. de nombre SIGNOS, que acepta los caracteres "+" ó "-" ó nada
<TODOS: ~[]>

E.R. de nombre TODOS, que acepta cualquier caracter
<TODOSMENOS1: ~["1"]>

E.R. de nombre TODOSMENOS1, que acepta cualquier caracter excepto el "1"
<TODOSMENOS12: ~["1","2"]>

E.R. de nombre TODOSMENOS12, que acepta cualquier caracter excepto el "1" y el "2"
<#NUMERO: ["0"-"9"]>


E:R. privada de nombre NUMERO, que acepta cualquier número del "0" al "9", es privado y ninguna gramática puede usarla
<NUMEROS: <NUMERO>+>

E.R. de nombre NUMEROS que acepta uno o más números
<NOMBRE: <LETRA>{1,30}>

E.R de nombre NOMBRE que acepta de una a treinta letras.

          Existen cuatro tipos de E.R.'s que son: SKIP, TOKEN, SPECIAL_TOKEN y MORE.

SKIP: Toda E.R. de este tipo, será simplemente ignorada y no producirá ninguna salida.
TOKEN: Este es el tipo de E.R. más utilizado, crea un token con la cadena encontrada y lo manda al parser.
SPECIAL_TOKEN: Crea un token, que no es evaluado en el parser, por ejemplo los comentarios
MORE: Continúa con la siguiente cadena, y la actual se convierte en prefijo de ella.

 

          Las E.R.'s se agrupan por tipo para un mejor entendimiento del código, sin embargo, todas pueden ir dentro del mismo bloque de tokens, muy bien veamos el formato de los bloques de tokens:

TIPO:
{
          ..... definición de tokens...
}

Donde TIPO es uno de los cuatro tipos de tokens ya vistos, y la definición de los tokens se hacen de la manera antes vista.

          Ahora que ya vimos como se definen los tokens, veamos algunos ejemplos sencillos:

Ejemplo 1:

SKIP:
{
   <"\r" | "\t" | " ">
}

 

Este conjunto de tokens es del tipo SKIP, e indica que, cuando encuentre retornos de carro, tabulaciones y espacios en blanco el parser no los deberá tomar en cuenta como tokens

Ejemplo 2:

TOKEN:
{
   <PYC: ";">
|  <DP: ":">
}

 

En este conjunto de Tokens encontramos que se definen dos tokens, PYC y DP. podemos notar que el conjunto nos indica que de aquí puede ser PYC ó DP, aprecien el símbolo de | (or).h

Ejemplo 3:

TOKEN:
{
   <DIGITOS: <NUMERO>+>
   |<#NUMERO: ["0"-"9"]>
}

 

 

Bueno, ya sabemos que es un conjunto de tokens, pero ahora analizaremos un poco más lo que es la E.R.

Si bien podemos apreciar la E.R. DIGITOS manda a llamar una repetición de otra E.R. denominada NUMERO, esto es recomendable cuando el token no se utilizará en la gramática, es decir NUMERO ya no podrá ser utilizado en una gramática directamente. Luego nos encontramos que en la definición de la E.R. NUMERO existe un # que precede al nombre, esto significa que NUMERO será privado, y que sólo servirá para uso de las E.R.'s; y en su E.R encontramos un intervalo del "0" al "9", va entre corchetes para indicar que será un intervalo, y lleva el guión para separar del primero al último, los caracteres deben de ir en el orden del código ASCII.

 

Ejemplo 4:

TOKEN:
{
   <ID: (["a"-"z"]|["A"-"Z"]|"_")(["a"-"z" ]|["A"-Z"]|["0"- "9"]|"_"){0,47}>
}

 

En este ejemplo podemos ver cómo se crea una E.R. para los id's, observemos que está formada por una letra o un guión bajo, seguido de 0 hasta 47 repeticiones de letras números y guiones bajos.

Nótese que el {0,47} indica el número de repeticiones.

 


Ejemplo 5:

TOKEN:
{
   <UNO: ~[]>
|  <DOS: ~["\n","\r"]>
}

 

En este ejemplo notamos el uso de ~[] ésta es la unión que significa cualquier caracter excepto, los que estén adentro separados por comas lo vemos en la E.R DOS que dice cualquier caracter menos retorno de carro ni salto de línea, y en la E.R. uno aceptamos cualquier caracter.

 

 

 

Ejemplo 6:

TOKEN:
{
   <POSNEG: ("+"|"-")?<NUMERO>+>
|  <NEGATIVO: ["-" ]<NUMERO>+>
}

Aquí mostramos el uso de los síimbolos opcionales, en la E.R. POSNEG dentro de ( )? se agrupan varios elementos que son opcionales, en cambio dentro de [ ] sólo se puede colocar un símbolo, en este caso "-".






 

          Espero no hayan tratado de compilar alguna de estas E.R.'s, porque no tiene el formato completo, en el Capítulo 4: Estructura de un program en JavaCC, veremos cómo se pueden compilar estas E.R.'s.

                      

Hosted by www.Geocities.ws

1