2010-06-21 52 views
4

我開始使用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

回答

3

爲什麼你想用alex創建正則表達式? 如果你只想做一些正則表達式匹配等,你應該看看正則表達式包。

+0

我真正想做的是一個詞彙和sintactic分析器,這就是爲什麼我與亞歷克斯工作:) – Anny 2010-06-22 01:10:07

6

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