EL Java Compiler Compiler (JAVACC) es un generador de analizadores sintácticos de código abierto para el lenguaje de programación Java.

JavaCC es similar a Yacc en que genera un parser para una gramática presentada en notación BNF, con la diferencia de que la salida es en código Java.

A diferencia de Yacc, JavaCC genera analizadores descendentes (top-down), lo que lo limita a la clase de gramáticas LL(K) (en particular, la recursión desde izquierda no se puede usar).

El constructor de árboles que lo acompaña, JJTree, construye árboles de abajo hacia arriba (bottom-up). En 1996Sun Microsystems lanzó un generador del programa de análisis llamado Gato.

Los reveladores responsables de Gato creó a su propia compañía llamada Metamata y cambió Gato nombre a JavaCC. Metamata se convirtió en eventual parte de WebGain. Después de que WebGain cerrara sus operaciones, JavaCC fue movido a su hogar actual.     

  CARACTERÍSTICAS PRINCIPALES

JavaCC integra las funciones de análisis léxico y análisis sintáctico en una sola herramienta, obteniendo a la salida código java

–a diferencia de lex/yacc cuya salida es código C

-. Antes que nada veamos un ejemplo sobre el cual se va a ir haciendo un seguimiento de cada uno de los distintos puntos que vayamos comentando.

En él se muestra una gramática reconocedora de una calculadora.

 

 

 

 

La principal diferencia con lex/yacc es que los analizadores sintácticosgenerados por JavaCC son analizadores sintácticos descendentes de tipo LL(k),mientras que los analizadores sintácticos generados por yacc son de tipo ascendenteLALR.

Otra diferencia bastante importante es que las especificaciones léxicas puedenestar incluidas dentro de la especificación de la gramática.

Por ejemplo, podemosescribir algo como esto:

sentenciaIf : {} { “if” “(” expresion() “)” sentencia() }

y automáticamente se ocupa de generar tokens para “if” y para “(“.También es necesario reseñar que el análisis léxico en JavaCC generacombinaciones de autómatas finitos deterministas (AFD) y autómatas finitos nodeterministas(AFND); por contra, lex siempre genera autómatas finitos deterministas.

En definitiva diremos que Java Compiler Compiler (JavaCC) es un potentegenerador de parsers descendentes escritos en lenguaje Java puro.

Es, quizá, uno de losgeneradores de parsers más populares dada su multiplataformidad.

Es por esto que serecomienda su uso para usuarios más afines a los lenguajes de programación orientadosa objetos.Dentro de las características de este metacompilador hay algunas que son aportadas por lex/yacc y otras que no.

Principalmente destacamos:

• Análisis descendente, permitiendo el uso de gramáticas mas generales y la posibilidad de poder utilizar atributos en el árbol sintáctico durante el parsing.

Especificaciones léxicas y gramaticales en un solo archivo. De esta manera la gramática puede ser leída y mantenida más fácilmente gracias al uso de lasexpresiones regulares dentro de la gramática.

• Permite extender especificaciones BNF mediante la utilización de expresionesregulares, tales como (A)*, (A)+.sentenciaIf : {} { “if” “(” expresion() “)” sentencia() }

• Ofrece estados léxicos y la capacidad de agregar acciones léxicas incluyendo unbloque de código java tras el identificador de un token. Además de los conceptosde token, more, skip, cambio de estados, etc. Ello permite trabajar conespecificaciones más claras, a la vez que permite un mejor manejo de mensajesde error y advertencias de JavaCC.

• Genera por defecto un parser LL(1). sin embargo, puede haber porciones de lagramática que no son LL(1).

JavaCC ofrece la posibilidad de resolver lasambigüedades shift-shift localmente al punto del conflicto.

En otras palabras,permite que el parser se vuelva LL(k) sólo en tales puntos; pero se conservaLL(1) en el resto de las producciones para obtener una mejor actuación.

• Permite el uso de Tokens Especiales que son ignorados por el parser; pero estándisponibles para poder ser procesados por el desarrollador.

• Las especificaciones léxicas pueden definir tokens de manera tal que a nivelglobal no se diferencien las mayúsculas de las minúsculas en la especificaciónléxica completa o en una especificación léxica individual

• El análisis del parsing y los pasos de procesamiento de tokens pueden realizarseen profundidad por medio de la utilización de las opciones DEBUG_PARSER,DEBUG_LOOKAHEAD, y DEBUG_TOKEN_MANAGER,.

JavaCC incluye JJTree, un preprocesador para el desarrollo de árboles, concaracterísticas muy poderosas.

De entre los generadores de parsers, JavaCC se halla entre los que tienen mejormanejo de errores.

Los parsers generados por JavaCC son capaces de localizarexactamente la ubicación de los errores, proporcionando informacióndiagnóstica completa.

JavaCC incluye una herramienta llamada JJDoc que convierte los archivos de lagramática en archivos de documentación.

El analizador léxico de JavaCC puede manejar entradas Unicode, y lasespecificaciones léxicas también pueden incluir cualquier caracter Unicode. Estofacilita la descripción de los elementos del lenguaje, tales como losidentificadores Java que permiten ciertos caracteres Unicode que no son ASCII,pero no otros.

• JavaCC es quizá el generador de parsers usado con aplicaciones Java máspopular.

• JavaCC ofrece muchas opciones diferentes para personalizar su comportamientoy el comportamiento de los parsers generados.

Para ampliar la información pulsa aqy

Tutorial util pulsa aqy