JavaCUP - Análisis Léxico: Código de usuario

Código de Usuario

La sección de código de usuario es la sección de la especificación JLex que permite que el usuario defina clases de importación, tipos de retorno, etc.

Por ejemplo, la declaración:

import sym.*;

importa la definición de la clase sym, la cual contiene las constantes usadas por Yylex para indicar al parser el tipo de token retornado.

public class sym {
  /* terminals */
  static final int EOF     = 0;
  static final int tDIVIDE = 7;
  static final int tMINUS  = 5;
  static final int tTIMES  = 6;
  static final int tNUMBER = 2;
  static final int tPLUS   = 4;
  static final int tIDENT  = 3;
  static final int error   = 1;
}

En este ejemplo, las constantes llevan como prefijo el caracter "t" para significar "símbolo terminal" a la vez que se las diferencia de las palabras reservadas de Java. Las constantes se definen en sym debido a que el parser que se generará desde CUP, utilizará la misma clase.

La declaración:

import java_cup.runtime.*;

importa la definición de la clase Symbol. Cuando el parser solicita un nuevo token a Yylex, el objeto Yylex retorna una instancia de la clase Symbol. (Ver sección de directivas)

class TokenValue {
  public int lineBegin;
  public int charBegin;  
  public String text;
  public String filename;   
  .  .  .
}

Cuando es invocado, el scanner retorna un valor de tipo Symbol, el cual posee dos campos:

1) un numero de token (una de las constantes de sym) y
2) un valor semántico (identificador, número, caracter o string).

TokenValue es el tipo del valor semántico y tiene los siguientes campos:

campo información asociada
text contiene la cadena de caracteres reconocida en la actual invocación de Yylex
lineBegin es la línea del archivo en la que fue reconocido el string (la línea 0 es la primera línea).
charBegin es el índice del primer caracter del string reconocido (el caracter 0 es el primer caracter).
sourceFilename es el archivo que está siendo escaneado.

Los métodos definidos en la clase TokenValue, tales como toString(), se utilizan durante el acceso al valor semántico.

El uso de la clase TokenValue se explica en más detalle en la sección de Reglas de Expresiones Regulares.