2012-02-25 6 views
1

Parsecライブラリを使用してHaskellでPascal言語パーサーを開発しています.Parsec.Tokenクラスで定義されたトークンを再定義する必要があります。それのParsec.Tokenで "stringLiteral"トークンを再定義する

Speekingは、ここに私の場合です:

私はstringLiteralトークンが一致している方法を変更する必要があります。デフォルトの定義では、それは何かbetween char '"'see this)ですが、私はbetween '\''(アポストロフィ)にする必要があります。この変更をParsecの動作にどうやって行うことができますか?

ありがとうございました!

+0

別の 'stringLiteral'パーサーを書く必要があります。残念ながら、あなたは 'LanguageDef'を通してそれをコメントでカスタマイズすることはできません。 –

+0

私は参照していますが、どのようにして、デフォルトの代わりに代替の 'stringLiteral'パーサーを使用するように字句解析プログラムを強制しますか? –

+0

Thomasの答えを参照してください... –

答えて

3

GenTokenParserという名前のデータ型のフィールドを調整することについて話しています。データ型を適切なデフォルト値で自動的に塗りつぶす関数を使用しているようで、1つのことを調整したいだけです:

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'を使用していますので、' Plexeme'があります。 –

+0

私はちょうどparsecからレクサーの一部をコピーして貼り付けました。リンクされたモジュールから大量のコードをコピー&ペーストするか、独自の文字列レクサーを作成してnewStringLitのRHSに配置することができます。 –