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

标签 regex haskell lexical-analysis alex

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

最佳答案

您可以在 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 }

当我们匹配浮点数时,我们分派(dispatch)到一个解析函数来对捕获的字符串进行操作,然后我们可以将其包装并作为解析函数公开给用户:
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。如果您不这样做,并且结构更加临时,请使用正则表达式引擎。

关于regex - Haskell 中的正则表达式与词法分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3088929/

相关文章:

java - 为什么这个正则表达式回溯不起作用

Haskell - 非法多态类型?

PHP 代码分析器以确定使用的类/扩展

c - 调试词法分析器问题

parsing - Haskell 编译器在实践中如何实现 parse-error(t) 规则?

java - 正则表达式替换 spring :message tags with th:text equivalent

用逗号或点对十进制数进行正则表达式验证

php - 如何在 PHP 中验证电子邮件地址

haskell - 受限 Monoid 类型值组合

haskell - Haskell 中的函数