Características de JavaCC
ANÁLISIS DESCENDENTE o TOP-DOWN
JavaCC genera parsers recursivos descendentes. Si bien se elimina la posibilidad
de utilizar recursión a izquierda, se permite la utilización de gramáticas
más generales, la facilidad para depurar el código generado, la habilidad
de parsear cualquier no terminal de la gramática, y la capacidad de pasar
atributos en el árbol sintáctico durante el parsing.
ESPECIFICACIÓN LÉXICA Y GRAMATICAL EN UN ÚNICO ARCHIVO
Tanto las especificaciones léxicas como las gramaticales (expresiones regulares
y strings, y producciones BNF, respectivamente) se escriben en el mismo
archivo. De esta manera la gramática puede ser leída y mantenida más fácilmente
gracias al uso de las expresiones regulares dentro de la gramática.
PERMITE EXTENDER ESPECIFICACIONES BNF
JavaCC permite extender especificaciones BNF en las especificaciones léxicas
y gramaticales, mediante la utilización de expresiones regulares, tales
como (A)*, (A)+. Las BNF extendidas descubren la necesidad de utilizar
recursión a izquierda para algunas extensiones.
ESTADOS LÉXICOS Y ACCIONES LÉXICAS
JavaCC ofrece estados léxicos y la capacidad de agregar acciones léxicas,
además de los conceptos de token, more, skip, cambio de estados, etc. Ello
permite trabajar con especificaciones más claras, a la vez que permite
mejor manejo de mensajes de error y warning de JavaCC.
ESPECIFICACIONES SINTÁCTICAS Y SEMÁNTICAS DE LOOKAHEAD
JavaCC genera por defecto un parser LL(1). sin embargo, puede haber porciones
de la gramática que no son LL(1). JavaCC ofrece la posibilidad de resolver
las ambigüedades shift-shift localmente al punto del conflicto. En otras
palabras, el parser se vuelve LL(k) sólo en tales puntos pero se conserva
LL(1) en el resto de las producciones, para obtener una mejor performance.
Los conflictos shift-reduce y reduce-reduce no son objetivos de los parsers
descendentes.
TOKENS ESPECIALES
Los tokens que en la especificación léxica se definen como tokens especiales,
durante el parsing son ignorados, aunque se hallan disponibles para ser
procesados por las herramientas. El procesamiento de comentarios, es una
de las aplicaciones más comunes que posee la definición de tokens especiales.
ANÁLISIS LÉXICO CASE-INSENSITIVE
Las especificaciones léxicas pueden definir tokens de manera tal que a
nivel global no se diferencien las mayúsculas de las minúsculas en la especificación
léxica completa, o en una especificación léxica individual.
CAPACIDADES EXTENSIVAS DE DEPURACIÓN
Por medio de la utilización de las opciones DEBUG_PARSER, DEBUG_LOOKAHEAD,
y DEBUG_TOKEN_MANAGER, el análisis del parsing y los pasos de procesamiento
de tokens pueden realizarse en profundidad.
PREPROCESADOR PARA DESARROLLO DE ÁRBOLES
JavaCC incluye JJTree, un preprocesador para el desarrollo de árboles,
con características muy poderosas.
MUY BUEN REPORTE DE ERRORES
De entre los generadores de parsers, JavaCC se halla entre los que tienen
mejor manejo del reporte de errores. Los parsers generados por JavaCC son
capaces de localizar exactamente la ubicación de los errores, proporcionando
información diagnóstica completa.
GENERACIÓN DE DOCUMENTACIÓN
JavaCC incluye una herramienta llamada JJDoc que convierte los archivos
de la gramática en archivos de documentación.
INTERNACIONALIZACIÓN
El analizador léxico de JavaCC puede manejar entradas Unicode, y las especificaiones
léxicas también pueden incluir cualquier caracter Unicode. Esto facilita
la descripción de los elementos del lenguaje, tales como los identificadores
Java que permiten ciertos caracterees Unicode que no son ASCII, pero no
otros.
AMPLIO USO DE LA COMUNIDAD
JavaCC es quizá el generador de parsers usado con aplicaciones Java más
popular.
EXTREMADAMENTE PERSONALIZABLE
JavaCC ofrece muchas opciones diferentes para personalizar su comportamiento
y el comportamiento de los parsers generados. Ejemplos de tales opciones
son las clases de procesamiento Unicode para ejecutar en la secuencia de
entrada, el número de tokens para chequear ambigüedad, etc.
100 % JAVA
JavaCC corre en una plataforma completamente Java. Ello permite que pueda
ser usado en diferentes máquinas sin problemas de portabilidad.