2011-10-13 48 views
11

在一个阶段中混合词法分析器和解析阶段有时会使Parsec解析器不易读取,但也会降低它们的速度。一种解决方案是使用Alex作为标记器,然后使用Parsec作为标记流的解析器。是否有用于编写词法分析器的haskell EDSL?

这很好,但如果我可以摆脱Alex是因为它在编译管道中增加了一个预处理阶段,并没有很好地与haskell“IDEs”等集成在一起,这会更好。我想知道是否有用于描述标记器的haskell EDSL,非常像Alex的风格,但是作为一个库。

+0

这是我一直在寻找到为晚,但已经出现了什么我真的看到了问题。我想象一下,我们可以使用RegEx EDSL创建一个未加标记的标记器(:: [RegEx] - > String - > [String])。 –

+0

我可以想出使用任何正则表达式库的快速解决方案,通过尝试匹配每个正则表达式的当前字符串,但由于其对所有正则表达式的知识,我会失去很多亚历克斯的优化。 –

回答

4

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

Hackage之前,曼努埃尔用来释放一个名为CTK(编译器工具包)封装的代码。我不确定这些日子项目的状态如何。

我认为Thomas Hallgren的lexer来自“Haskell中的Lexing Haskell”,它是动态的,而不是代码生成器,而该版本是为哈斯克尔量身定做的,图书馆中的机器更加通用。 Iavor Diatchki将代码放在Hackage上。

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

+0

完美,谢谢! –

3

您也可以使用Parsec作为词法分析器。首先将字符串解析为令牌,然后将令牌解析为目标数据类型。

+0

确实如此,然后你又失去了使用像Alex这样的工具而不会失去任何表现力的最小DFA的速度(我更喜欢Parsec,比如说Yacc,因为它提供了更好的模块化/表现力,但是我不确信这是对词法分析器非常有用)。 但至少可以解决混合两相的问题。谢谢。 –

相关问题