正则表达式与Haskell中的词法分析器

时间:2010-06-21 22:26:37

标签: regex haskell lexical-analysis alex

我开始使用Haskell,我正在尝试使用Alex工具来创建正则表达式,我有点迷失;我的第一个不便是编译部分。我如何用Alex编译文件?然后,我认为我必须将alex生成的模块导入我的代码,但不确定。如果有人可以帮助我,我会非常感激!

3 个答案:

答案 0 :(得分:6)

您可以在Alex中指定正则表达式函数。

例如,Alex中的正则表达式匹配浮点数:

$space       = [\ \t\xa0]
$digit       = 0-9
$octit       = 0-7
$hexit       = [$digit A-F a-f]

@sign        = [\-\+]
@decimal     = $digit+
@octal       = $octit+
@hexadecimal = $hexit+
@exponent    = [eE] [\-\+]? @decimal

@number      = @decimal
             | @decimal \. @decimal @exponent?
             | @decimal @exponent
             | 0[oO] @octal
             | 0[xX] @hexadecimal

lex :-

   @sign? @number { strtod }

当我们匹配浮点数时,我们调度解析函数来对捕获的字符串进行操作,然后我们可以将其作为解析函数包装并向用户公开:

readDouble :: ByteString -> Maybe (Double, ByteString)
readDouble str = case alexScan (AlexInput '\n' str) 0 of
    AlexEOF            -> Nothing
    AlexError _        -> Nothing
    AlexToken (AlexInput _ rest) n _ ->
       case strtod (B.unsafeTake n str) of d -> d `seq` Just $! (d , rest)

使用Alex进行此正则表达式匹配的一个好结果是性能良好,因为正则表达式引擎是静态编译的。它也可以作为使用cabal构建的常规Haskell库公开。有关完整实施,请参阅bytestring-lexing

关于何时使用词法分析器而不是正则表达式匹配器的一般建议是,如果你有一个你试图匹配的词汇的语法,就像我为浮点所做的那样,使用Alex。如果不这样做,并且结构更加临时,请使用正则表达式引擎。

答案 1 :(得分:3)

为什么要使用alex创建正则表达式? 如果你想要的只是做一些正则表达式匹配等,你应该看看正则表达式的包。

答案 2 :(得分:1)

如果它是您想要的普通正则表达式,则API在text.regex.base中指定。然后是实施text.regex.Posixtext.regex.pcre和其他几个。 Haddoc文档有点渺茫,但Real World Haskell, chapter 8.中描述了基础知识。SO question.

中描述了一些更深入的内容。