Scala parser combinators vs ANTLR / Java generated parser?


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

ANTLR pros

  1. Bien conocido
  2. Rápido
  3. DSL externo
  4. ANTLRWorks (gran IDE para analizador grammer depuración/pruebas)

ANTLR cons

  1. Basado en Java (Scala interop puede ser un reto, cualquier experiencia?)
  2. Requiere una gran dependencia en tiempo de ejecución

Parser combinator pros

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

Parser combinator cons

  1. DSL interno (puede significar más lento ejecución?)
  2. No ANTLRWorks (proporciona buenas funciones de prueba y visualización del analizador)

¿Algún pensamiento?

EDIT: Este analizador de expresiones analiza expresiones algebraicas/de cálculo. Se utilizará en la aplicación Magnificalc para Android cuando se finalice.

Author: Nathan Moos, 2011-05-16

4 answers

Los combinadores de analizador de Scala no son muy eficientes. No fueron diseñados para ser. Son buenos para hacer tareas pequeñas con insumos relativamente pequeños.

Por lo que realmente depende de sus requisitos. No debería haber ningún problema de interop con ANTLR. Llamar a Scala desde Java puede ser complicado, pero llamar a Java desde Scala casi siempre funciona.

 16
Author: Erik Engbrecht,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-15 22:37:29

No me preocuparía por las limitaciones de rendimiento de los combinadores de analizadores a menos que esté planeando analizar expresiones algebraicas que tengan unas pocas páginas. El libro Programming Scala menciona que una implementación más eficiente de combinadores de parser es factible. 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 a Java, y necesitas compilar tanto Scala como Java para bytecode, en lugar de sólo Scala.

 6
Author: sullivan-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-17 20:52:51

He creado DSL externos con combinadores de parser ANTLRv4 y Scalas y claramente prefiero los combinadores de parser, porque obtiene un excelente soporte de editor al diseñar el lenguaje y es muy fácil transformar sus resultados de análisis a cualquier estructura de datos de clase de caso AST. Desarrollar gramáticas ANTLR lleva mucho más tiempo, porque, incluso con el soporte del editor ANTLRWorks, desarrollar gramáticas es muy propenso a errores. Todo el flujo de trabajo ANTLR se siente bastante hinchado para mí en comparación con el parser combinators ' uno.

 2
Author: Hannes John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-24 13:09:51

Me inclinaría a intentar producir un DSL externo usando combinadores de parser. No debería necesitar ser un DSL interno. Pero no creo que sea mejor.

El mejor enfoque para averiguar esto sería tomar una versión simplificada de la gramática, probarlo en ambos sentidos y evaluar las diferencias.

 0
Author: Don Roby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-15 21:13:18