我开始使用 Haskell,我正在尝试使用Alex工具来创建正则表达式,但我有点迷茫;我的第一个不便是编译部分。我必须如何使用 Alex 编译文件?然后,我认为我必须将 alex 生成的模块导入我的代码,但不确定。如果有人可以帮助我,我将非常感激!
问问题
821 次
3 回答
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。如果您不这样做,并且结构更加临时,请使用正则表达式引擎。
于 2010-06-21T23:42:27.967 回答
3
为什么要使用 alex 创建正则表达式?如果您只想进行一些正则表达式匹配等,您应该查看 regex-base 包。
于 2010-06-21T22:35:38.153 回答
1
如果它是您想要的纯正则表达式,则 API 在text.regex.base中指定。然后是实现text.regex.Posix,text.regex.pcre和其他几个。Haddoc 文档有点薄,但是基础知识在Real World Haskell,第 8 章中进行了描述。在这个SO question中描述了一些更深入的内容。
于 2010-06-21T23:11:56.080 回答