2012-02-25 62 views
1

我使用Parsec庫在Haskell中開發Pascal語言分析器,我需要重新定義Parsec.Token類中定義的一些標記。在Parsec.Token中重新定義「stringLiteral」令牌

Speeking吧,這裏是我的情況:

我需要改變stringLiteral令牌如何匹配。在默認定義中,它是between char '"'see this),但我需要它是between '\''(撇號)。我如何對Parsec行爲進行此修改?

謝謝!

+0

你必須寫一個替代'stringLiteral'解析器。不幸的是,你不能通過'LanguageDef'來定製它,就像你可以用評論一樣。 – 2012-02-25 21:59:10

+0

我明白了,但是我該如何強制詞法分析器使用替代'stringLiteral'分析器而不是默認分析器? – 2012-02-25 22:01:56

+0

看到托馬斯的回答... – 2012-02-25 22:07:30

回答

3

您正在討論調整名爲GenTokenParser的數據類型的字段。它看起來像您使用與合理的默認值的數據類型自動填充功能,你只是想調整的一件事,在這裏你去:

myMakeTokenParser langDef = 
    let default = makeTokenParser langDef 
    in default { stringLiteral = newStringLit } 
    where 
    newStringLit = lexeme (
         do{ str <- between (char '\'') 
             (char '\'' <?> "end of string") 
             (many stringChar) 
         ; return (foldr (maybe id (:)) "" str) 
         } 
         <?> "literal string") 
+0

我得到這個錯誤:'無法匹配預期類型P.GenTokenParser s0 u0 m0 與實際類型ParsecT s1 u1 m1 a0 在P.lexeme的第一個參數中,...' 我正在使用import'import qualified Text.Parsec.Token as P',所以有'P.lexeme' – 2012-02-25 22:40:44

+0

對,我剛從parsec複製並粘貼了一部分詞法分析器。您可以從鏈接模塊中複製和粘貼大部分代碼,或者創建自己的字符串詞法分析器並將其放在newStringLit的RHS中。 – 2012-02-25 23:33:46