2011-10-13 90 views
11

在一個階段中混合詞法分析器和解析階段有時會使Parsec解析器不易讀取,但也會降低它們的速度。一種解決方案是使用Alex作爲標記器,然後使用Parsec作爲標記流的解析器。是否有用於編寫詞法分析器的haskell EDSL?

這很好,但如果我可以擺脫Alex是因爲它在編譯管道中增加了一個預處理階段,並沒有很好地與haskell「IDEs」等集成在一起,這會更好。我想知道是否有用於描述標記器的haskell EDSL,非常像Alex的風格,但是作爲一個庫。

+0

這是我一直在尋找到爲晚,但已經出現了什麼我真的看到了問題。我想象一下,我們可以使用RegEx EDSL創建一個未加標記的標記器(:: [RegEx] - > String - > [String])。 –

+0

我可以想出使用任何正則表達式庫的快速解決方案,通過嘗試匹配每個正則表達式的當前字符串,但由於其對所有正則表達式的知識,我會失去很多亞歷克斯的優化。 –

回答

4

是 - http://www.cse.unsw.edu.au/~chak/papers/Cha99.html

Hackage之前,曼努埃爾用來釋放一個名爲CTK(編譯器工具包)封裝的代碼。我不確定這些日子項目的狀態如何。

我認爲Thomas Hallgren的lexer來自「Haskell中的Lexing Haskell」,它是動態的,而不是代碼生成器,而該版本是爲哈斯克爾量身定做的,圖書館中的機器更加通用。 Iavor Diatchki將代碼放在Hackage上。

http://hackage.haskell.org/package/haskell-lexer

+0

完美,謝謝! –

3

您也可以使用Parsec作爲詞法分析器。首先將字符串解析爲令牌,然後將令牌解析爲目標數據類型。

+0

確實如此,然後你又失去了使用像Alex這樣的工具而不會失去任何表現力的最小DFA的速度(我更喜歡Parsec,比如說Yacc,因爲它提供了更好的模塊化/表現力,但是我不確信這是對詞法分析器非常有用)。 但至少可以解決混合兩相的問題。謝謝。 –

相關問題