我開始使用Haskell,我試圖使用Alex工具來創建正則表達式,而且我有點迷路;我的第一個不便是編譯部分。我怎樣才能用Alex編譯一個文件呢?然後,我認爲我必須將我生成的模塊導入到我的代碼中,但不確定。如果有人能幫助我,我會非常感激!Haskell中的正則表達式與詞法分析器的比較
回答
爲什麼你想用alex創建正則表達式? 如果你只想做一些正則表達式匹配等,你應該看看正則表達式包。
我真正想做的是一個詞彙和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.
我真正想要做的是一個詞法和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。如果你不這樣做,而且結構更特別,則使用正則表達式引擎。
- 1. 正則表達式詞法分析
- 2. 在詞法分析器中的條件正則表達式
- 3. 正則表達式比較
- 4. 在萊克斯正則表達式(詞法分析器)
- 5. FLEX(詞法分析器)正則表達式 - 重用定義
- 6. 分詞正則表達式
- 7. 在haskell正則表達式中分組
- 8. 正則表達式風味的比較
- 9. 匹配比較的正則表達式
- 10. 如何使用正則表達式(詞法分析)表達類似cpp的字符串(詞法分析)
- 11. Lua模式匹配與正則表達式的比較
- 12. 正則表達式解析長詞
- 13. 用正則表達式比較數據
- 14. 正則表達式的表達式分析在C#中
- 15. 正則表達式的SQL分析
- 16. 正則表達式分析的問題
- 17. 與比較器的Java Lambda表達式
- 18. 需要幫助的正則表達式與比較
- 19. 將讀取的行與正則表達式比較
- 20. 與正則表達式差異的Java字符串比較?
- 21. 與正則表達式捕獲的Ruby字符串比較
- 22. Python正則表達式查找單詞與其他詞分開
- 23. 無法比擬的正則表達式
- 24. 比較一些模式與正則表達式C#
- 25. 解析體育比分的正則表達式
- 26. Python的正則表達式解析器
- 27. 比較使用boost ::正則表達式(C++)兩個正則表達式
- 28. 使用與正則表達式拆分分析模式
- 29. 如何使用正則表達式比較單詞,但忽略某些單詞?
- 30. javascript正則表達式中的反向引用的比較
這是一個甚至是正則表達式的問題嗎?如果是這樣,你可能會得到更多的回覆,如果你給它標記'regex'。這似乎不是,所以也許你會得到更多的回覆,如果你重新命名它,就像「Haskell中的Alex問題」(是否有'Alex'標籤?是否需要?) – Mawg 2010-06-21 23:41:58
我個人總是使用Antlr用於正則表達式的工作,特別是AntlrWorks,它可以讓你可視化和按比例調試你的正則表達式。然而,這個問題也可能對你有所幫助... http://stackoverflow.com/questions/1364259/antlr-vs-happy-vs-other-parser-generators – Mawg 2010-06-21 23:53:49