JavaCC - Características

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.