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

问题描述:

我开始使用Haskell,我试图使用Alex工具来创建正则表达式,而且我有点迷路;我的第一个不便是编译部分。我怎样才能用Alex编译一个文件呢?然后,我认为我必须将我生成的模块导入到我的代码中,但不确定。如果有人能帮助我,我会非常感激!Haskell中的正则表达式与词法分析器的比较

+0

这是一个甚至是正则表达式的问题吗?如果是这样,你可能会得到更多的回复,如果你给它标记'regex'。这似乎不是,所以也许你会得到更多的回复,如果你重新命名它,就像“Haskell中的Alex问题”(是否有'Alex'标签?是否需要?) – Mawg 2010-06-21 23:41:58

+0

我个人总是使用Antlr用于正则表达式的工作,特别是AntlrWorks,它可以让你可视化和按比例调试你的正则表达式。然而,这个问题也可能对你有所帮助... http://stackoverflow.com/questions/1364259/antlr-vs-happy-vs-other-parser-generators – Mawg 2010-06-21 23:53:49

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

+0

我真正想做的是一个词汇和sintactic分析器,这就是为什么我与亚历克斯工作:) – Anny 2010-06-22 01:10:07

如果它是你想要的普通正规表达式,则在text.regex.base中指定该API。然后是实现text.regex.Posix,text.regex.pcre和其他几个。 Haddoc文档有点渺茫,但基本描述见Real World Haskell, chapter 8.更多深入的内容在这里描述SO question.

+0

我真正想要做的是一个词法和sintactic分析器,这就是为什么我与亚历克斯:) – Anny 2010-06-22 01:09:51

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

使用亚历克斯这个正则表达式匹配的一个很好的结果是性能还是不错的,因为正则表达式引擎是静态编译。它也可以作为用cabal构建的常规Haskell库公开。完整实施请参见bytestring-lexing

关于什么时候使用词法分析器而不是正则表达式匹配器的一般建议是,如果你有一个你想匹配的词法的语法,就像我对浮点数所做的那样,使用Alex。如果你不这样做,而且结构更特别,则使用正则表达式引擎。

+0

谢谢唐斯图尔特,这正是我所寻找的,因为真的是什么我想要做的是创建一个词法和sintatic分析器,这就是为什么我试图创建正则表达式....谢谢大家,你们都帮助了很多:) – Anny 2010-06-22 01:08:57

+0

对不起,如果我打扰你,但你能解释我一点位最后一行“的情况strtod(B.unsafeTake n str)d - > d'seq'只要$!(d,rest)”,因为我不明白它 – Anny 2010-06-22 01:21:49

+0

哦,那只是运行'strtod' lexeme,然后严格返回结果。 – 2010-06-22 01:25:41