java parsing scala antlr3 parser-combinators

¿Compresores del analizador Scala vs ANTLR/Java analizador generado?



parsing antlr3 (4)

Creé DSL externas con ANTLRv4 y Scalas y prefiero los combinadores de analizador, porque se obtiene una excelente compatibilidad de edición cuando se diseña el lenguaje y es muy fácil transformar los resultados de análisis a cualquier estructura de datos de clase de caso de AST. El desarrollo de gramáticas ANTLR lleva mucho más tiempo, porque, incluso con el soporte del editor ANTLRWorks, el desarrollo de gramáticas es muy propenso a errores. Todo el flujo de trabajo de ANTLR se siente bastante hinchado en comparación con el de los combinadores de analizador.

Estoy escribiendo un analizador de expresiones para una aplicación escrita principalmente en Scala. Construí objetos AST en Scala y ahora necesito escribir el analizador. He oído hablar de los combinadores de analizadores incorporados de Scala, y también de ANTLR3, y me pregunto: ¿qué proporcionaría un mejor rendimiento y más facilidad para escribir código? Hasta aquí:

ANTLR pros

  1. Bien conocido
  2. Rápido
  3. DSL externo
  4. ANTLRWorks (gran IDE para depuración / prueba de la gramática del analizador)

ANTLR contra

  1. Basado en Java (la interoperabilidad de Scala puede ser desafiante, ¿alguna experiencia?)
  2. Requiere una gran dependencia en tiempo de ejecución

Mejoradores de analizador de Parser

  1. Parte de Scala
  2. Un paso menos de compilación
  3. No hay necesidad de una dependencia de tiempo de ejecución; por ejemplo, ya incluido en la biblioteca de tiempo de ejecución de Scala

Combinador del analizador contra

  1. DSL interno (¿puede significar una ejecución más lenta?)
  2. No ANTLRWorks (proporciona buenas características de prueba y visualización del analizador)

¿Alguna idea?

EDITAR: Este analizador de expresiones analiza expresiones algebraicas / de cálculo. Se usará en la aplicación Magnificalc para Android cuando esté finalizado.


Los combinadores de analizadores de Scala no son muy eficientes. Ellos no fueron diseñados para ser. Son buenos para hacer pequeñas tareas con entradas relativamente pequeñas.

Entonces realmente depende de tus requisitos. No debería haber ningún problema de interoperabilidad con ANTLR. Llamar a Scala desde Java puede ser complicado, pero llamar a Java desde Scala casi siempre funciona.


Me inclinaría a intentar producir una DSL externa usando los combinadores de analizadores. No debería necesitar ser una DSL interna. Pero no sé si sería mejor.

El mejor enfoque para resolver esto sería tomar una versión simplificada de la gramática, probar ambas formas y evaluar las diferencias.


No me preocuparía las limitaciones de rendimiento de los combinadores de analizadores a menos que estuviera pensando en analizar expresiones algebraicas de unas pocas páginas. El libro Programming Scala menciona que es factible una implementación más eficiente de los combinadores de analizadores. Tal vez alguien encuentre el tiempo y la energía para escribir uno.

Creo que con ANTLR estás hablando de dos pasos de compilación adicionales: ANTLR compila en Java, y necesitas compilar tanto Scala como Java en bytecode, en lugar de solo Scala.