2011-10-13 10 views
11

Al mezclar las fases lexer y de análisis en una fase, algunas veces los analizadores Parsec son menos legibles pero también los ralentizan. Una solución es usar Alex como un tokenizer y luego Parsec como un analizador de la secuencia token.¿Hay un EDSL haskell para escribir lexers?

Esto está bien, pero sería aún mejor si pudiera deshacerme de Alex porque agrega una fase de preprocesamiento en el proceso de compilación, no se integra bien con los "IDEs" de Haskell, etc. Me preguntaba si había tal como un EDSL haskell para describir tokenizers, muy al estilo de Alex, pero como una biblioteca.

+0

Esta es una pregunta que he estado buscando en los últimos tiempos pero ha habido nada de lo que he visto realmente. Imagino que tal vez un RegEx EDSL del cual hacemos un tokenizador sin etiquetar (:: [RegEx] -> String -> [String]). –

+0

Podría encontrar una solución rápida usando cualquier biblioteca de expresiones regulares tratando de hacer coincidir la cadena actual contra cada expresión regular, pero perdería muchas optimizaciones de Alex debido a su conocimiento del conjunto de todas las expresiones regulares. –

Respuesta

4

Sí - http://www.cse.unsw.edu.au/~chak/papers/Cha99.html

Antes Hackage, Manuel utilizarse para liberar el código en un paquete llamado CTK (compilador conjunto de herramientas). No estoy seguro de cuál es el estado del proyecto en estos días.

Creo que el lector de Thomas Hallgren del periódico "Lexing Haskell en Haskell" era más dinámico que un generador de códigos, mientras que el lanzamiento está diseñado para leer Haskell. La maquinaria en la biblioteca es más general. Iavor Diatchki ha puesto el código en Hackage.

http://hackage.haskell.org/package/haskell-lexer

+0

Perfecto, gracias! –

3

Puede usar Parsec como lexer también. Primero analiza la cadena en tokens, luego analiza los tokens en el tipo de datos de destino.

+0

Cierto, pero de nuevo pierdes la velocidad de los DFA mínimos que podrías obtener con una herramienta como Alex sin perder expresividad (prefiero Parsec a, por ejemplo, Yacc porque ofrece una mejor modularidad/expresividad, pero no estoy seguro de que esto sea muy útil para los lexers). Pero al menos, resuelve el problema de mezclar las dos fases. Gracias. –

Cuestiones relacionadas