Ann*_*nny 4 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 }
Run Code Online (Sandbox Code Playgroud)
当我们匹配浮点数时,我们调度解析函数来对捕获的字符串进行操作,然后我们可以将其作为解析函数包装并向用户公开:
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)
Run Code Online (Sandbox Code Playgroud)
使用Alex进行此正则表达式匹配的一个很好的结果是性能良好,因为正则表达式引擎是静态编译的.它也可以作为使用cabal构建的常规Haskell库公开.有关完整实现,请参阅bytestring-lexing.
关于何时使用词法分析器而不是正则表达式匹配器的一般建议是,如果你有一个你想要匹配的词汇的语法,就像我为浮点所做的那样,使用Alex.如果不这样做,并且结构更加临时,请使用正则表达式引擎.