是否有用于编写lexers的haskell EDSL?

是否有用于编写lexers的haskell EDSL?,haskell,parsec,alex,Haskell,Parsec,Alex,在一个阶段中混合lexer和解析阶段有时会使解析器的可读性降低,但也会减慢它们的速度。一种解决方案是使用Alex作为标记器,然后使用Parsec作为标记流的解析器 这很好,但如果我能摆脱Alex,那就更好了,因为它在编译管道中添加了一个预处理阶段,不能很好地与haskell“IDE”等集成。我想知道是否有haskell EDSL这样的东西来描述标记器,非常像Alex的风格,但是作为一个库。您也可以使用Parsec作为lexer。首先将字符串解析为标记,然后将标记解析为目标数据类型。是- 在黑客攻

在一个阶段中混合lexer和解析阶段有时会使解析器的可读性降低,但也会减慢它们的速度。一种解决方案是使用Alex作为标记器,然后使用Parsec作为标记流的解析器


这很好,但如果我能摆脱Alex,那就更好了,因为它在编译管道中添加了一个预处理阶段,不能很好地与haskell“IDE”等集成。我想知道是否有haskell EDSL这样的东西来描述标记器,非常像Alex的风格,但是作为一个库。

您也可以使用Parsec作为lexer。首先将字符串解析为标记,然后将标记解析为目标数据类型。

是-

在黑客攻击之前,Manuel曾在一个名为CTK(编译器工具包)的包中发布代码。我不确定这些天项目的状态如何

我认为Thomas Hallgren在《Haskell中的Lexing Haskell》一文中的lexer是动态的,而不是一个代码生成器,同时该版本是为Lexing Haskell量身定制的,库中的机制更通用。Iavor Diatchki已经把代码放在黑客上了


这是一个我最近一直在研究的问题,但我什么都没看到。我想象可能是一个RegEx-EDSL,我们从中生成一个未标记的标记器(::[RegEx]->String->[String])。我可以通过尝试在每个regexp中匹配当前字符串,来使用任何regexp库快速想出一个解决方案,但是由于Alex对所有正则表达式集的了解,我会失去很多Alex的优化。是的,但是你又失去了使用Alex这样的工具可以获得的最小DFA的速度,而不会失去任何表现力(我更喜欢Parsec而不是Yacc,因为它提供了更好的模块化/表达能力,但我不认为这对lexer非常有用)。但至少,它解决了混合这两个阶段的问题。谢谢。