¿Qué es mejor, ANTLR o JavaCC?
(8)
Las preocupaciones son documentación / capacidad de aprendizaje, integración de eclipse, herramientas, soporte comunitario y rendimiento (en aproximadamente ese orden).
Para una primera aproximación, lo que realmente le va a importar en la práctica es cuán conveniente e intuitiva es la notación para sus ojos.
Habiendo dicho eso, había hecho proyectos con ANTLR y JavaCC, y encontré que ANTLR era terriblemente pesado para la mayoría de las cosas.
ANTLR tiene una presentación más completa: es un compilador de compilador mucho más sencillo: lexing, análisis sintáctico, AST, transformaciones de árbol y generación de código.
Para JavaCC, es mucho más un generador de analizadores que un compilador de compiladores. El soporte de AST se proporciona a través de otra lib llamada JJTree.
No he usado generadores de analizadores en un tiempo, pero hace varios años cuando me interesaron, recuerdo que me gustó SableCC . Implementó algunas ideas interesantes con respecto a la generación de analizadores orientados a objetos que pueden o no haber sido recogidos por las alternativas.
Secundo jamesh arriba.
ANTLR tiene una presentación más completa: es un compilador de compilador mucho más sencillo: lexing, análisis sintáctico, AST, transformaciones de árbol y generación de código.
Para JavaCC, es mucho más un generador de analizadores que un compilador de compiladores. El soporte de AST se proporciona a través de otra lib llamada JJTree.
Desde mi experiencia personal, puedes hacer muchas más cosas con ANTLR, incluido pasar el parámetro entre las reglas y a través de todas las reglas secundarias, lo que ayuda mucho al crear un analizador complejo, como el analizador para C #. Además, la reescritura de reglas también es un clásico. Te ayuda a formatear tu AST ideal fácilmente.
Sin embargo, es realmente pesado. Para un proyecto simple, probablemente nunca use estas funcionalidades. Javacc es más genial para eso.
Una ventaja concreta que ANTLR tiene sobre JavaCC es que tiene generadores para lenguajes distintos a Java. Esto podría hacer que trasladar su idioma a otros lugares sea mucho más fácil.
Con respecto a las preocupaciones que mencionaste, sugeriría que JavaCC era una mejor opción. Es más rápido y más fácil para un desarrollador de Java aprender (la sintaxis es muy similar a la de Java común), la documentación es completa y la integración de Eclipse es adecuada.
Escribí un compilador para CAS-language como Maple o MuPAD con SableCC para convertir este solo idioma a Maxima (para CAS-Capacity) y LaTeX (para mostrar). El AST de SableCC está estrictamente orientado a objetos y es fácil extenderlo para generar lenguajes de difusión. Si desea compilar un idioma en más de un idioma, simplemente pruébelo.
Hay un par de alternativas que no debes descartar:
- JParsec es un marco de combinación de analizador que le permite construir su analizador completamente a partir de código.
- El marco del combinador del analizador de Scala aborda una preocupación similar; sin embargo, la sintaxis de Scala hace que todo esto sea mucho más legible.
- Luego está también el marco del combinador de analizadores realizado por John Metsker, para su libro Building Parsers With Java ; No recuerdo exactamente dónde está la biblioteca, pero al menos flotaba en Internet en el pasado. Aborda la misma preocupación: no define sus definiciones de gramática y token en un archivo separado que no sea de Java; en cambio, es todo Java.
- Fortress, el lenguaje de programación en el que Sun ha estado trabajando durante años parece estar basado en este conjunto de herramientas: Rats . No tengo mucha información, pero creo que si la usan para su nuevo lenguaje de programación, probablemente tenga algunas características interesantes.
En general, tengo la impresión de que los años de los generadores de códigos se han acabado. Si fuera usted, usaría el juego de herramientas del combinador del analizador de Scala. Básicamente, cualquier IDE que admita Scala, también ''admite'' este marco de combinación de analizadores. El rendimiento es bueno, AFAICT.
Por cierto, ANTLR tiene soporte IDE bastante decente, como un plugin de Eclipse (pero tal vez también hay algo en IntelliJ, no lo recuerdo). Por lo tanto, si opta por el enfoque clásico de definir su analizador léxico y analizador sintáctico fuera de su idioma, entonces ANTLR debería ser su elección, creo. Tiene la mayor cuota de conocimiento entre los desarrolladores de Java, hay soporte de herramientas, y hay un gran libro del autor de ANTLR. No creo que ninguno de los otros kits de herramientas pueda afirmar eso.