2010-04-14 60 views
6

我想使用Parsec的makeTokenParser來構建我的解析器,但我想使用我自己的定義whiteSpace。以下步驟用我的定義替換whiteSpace,但所有lexeme解析器仍使用舊定義(例如P.identifier lexer將使用舊的whiteSpace)。使用Haskell Parsec的自定義whiteSpace

... 
lexer :: P.TokenParser() 
lexer  = l { P.whiteSpace = myWhiteSpace } 
    where l = P.makeTokenParser myLanguageDef 
... 

看代碼爲makeTokenParser我想我明白爲什麼是這樣工作的。我想知道是否有任何解決方法可以避免完全重複makeTokenParser的代碼?

+0

相關:http://stackoverflow.com/questions/5672142/in-parsec-is-there-a-way-to-prevent-lexeme-from-consuming-newlines – 2011-10-15 23:34:04

回答

7

不幸的是,我認爲沒有辦法。 makeTokenParser中使用的本地定義遞歸地指向自己,因此,如您所注意的那樣,lexeme使用whiteSpace定義的那樣,而不是您在lexer對象中替換的whiteSpace記錄成員。

代碼是嘲弄,因爲它使用與makeTokenParser中的兩個本地函數相同的名稱,並且作爲TokenParser構造函數的記錄成員。它們實際上是完全不同的實體。

+2

現在,如果只寫入'TokenParser'與類型類,我們會很好去。 – Steve 2010-04-15 07:36:08

+1

..如果它可以使monadic解析器(在Parsec 3中),而不是硬連接到「身份」。 – 2010-04-20 19:30:39