2010-06-22 8 views
9

Actualmente estoy buscando un lector/analizador que genere código Scala a partir de una gramática BNF (un archivo ocamlyacc con precedencia y asociatividad). Estoy bastante confundido ya que no encontré casi nada sobre cómo hacerlo.Lexer/analizador para generar código Scala a partir de la gramática BNF

Para el análisis sintáctico, encontré scala-bison (con el que tengo muchos problemas para trabajar). Todas las otras herramientas son solo analizadores de Java importados a Scala (como ANTLR).

Para leer, no encontré nada.

También encontré el famoso analizador combinadores de Scala, pero (corríjanme si me equivoco), incluso si son bastante atractivo, que consumen una gran cantidad de tiempo y la memoria, debido principalmente a dar marcha atrás .

Así que tengo dos preguntas principales:

  • ¿Por qué las personas sólo parecen concentrarse en los combinadores _parser?
  • ¿Cuál es su mejor sugerencia de generador lexer/analizador para usar con Scala?

Respuesta

7

Como uno de los autores del artículo de ScalaBison, me he encontrado con este problema varias veces. :-) Lo que normalmente haría para escanear en Scala es usar JFlex. Funciona sorprendentemente bien con ScalaBison, y todas nuestras evaluaciones comparativas se realizaron usando esa combinación. La desafortunada desventaja es que genera fuentes Java, por lo que la compilación requiere un poco de gimnasia. Creo que John Boyland (el autor principal del artículo) ha desarrollado un modo de salida Scala para JFlex, pero no creo que haya sido lanzado al público.

Para mi propio desarrollo, he estado trabajando mucho con técnicas de análisis sin escáner. Los combinadores de analizadores de paquetes de Scala 2.8 son bastante buenos, aunque todavía no generalizados. Construí an experimental library que implementa el análisis generalizado dentro del marco del combinador del analizador. Sus límites asintóticos son mucho mejores que los combinadores de analizadores tradicionales, pero en la práctica la sobrecarga de tiempo constante es mayor (todavía estoy trabajando en ello).

+0

Gracias por la respuesta y sus combinadores gll, intentaré entender cómo funciona :) Pero creo que intentaré jugar con JFlex y Scala juntos. – Vinz

+1

Gracias a todo el montón de tutoriales (incluyendo algunos de los suyos sobre codecommit) finalmente logré hacer un simple lexer/parser con los combinadores de analizadores, y sin demasiada recursión ... ¡gracias de nuevo! – Vinz

3

Scala 2.8 tiene un analizador de paquetes. Cito de los documentos de la API aquí:

de Packrat de análisis es una técnica para la implementación de vuelta hacia atrás, analizadores descenso recursivo, con la ventaja de que garantiza ilimitada búsqueda hacia delante y un tiempo de análisis lineal. Usando esta técnica, las gramáticas recursivas recursivas también pueden ser aceptadas.

3

Sé que esta pregunta es antigua, pero para aquellos que todavía están en busca de un generador de lexer que emita código Scala, he escrito a fork of JFlex that emits Scala en lugar de Java, incluidos los correspondientes plugins Maven y sbt. Todos están ahora disponibles en Maven Central.

Actualmente lo estamos usando (incluidos los complementos de Maven/sbt) para tokenizar el texto en inglés como parte de la línea de procesamiento de lenguaje natural en FACTORIE - archivo .flex de ejemplo que contiene Scala here.

+0

Eso es genial. Había lanzado JFlex 1.5 + scale https://github.com/moy/JFlex/releases pero parece que tu está más actualizado, y es más fácil de encontrar. –

+0

@JohnTangBoyland ¡Ojalá hubiera encontrado tu versión antes de escribir la mía! –

Cuestiones relacionadas