2010-04-14 13 views
6

Ich möchte Parsec's makeTokenParser verwenden, um meinen Parser zu erstellen, aber ich möchte meine eigene Definition von whiteSpace verwenden. Das folgende Vorgehen ersetzt whiteSpace durch meine Definition, aber alle lexeme Parser verwenden immer noch die alte Definition (z. B. P.identifier lexer wird den alten whiteSpace verwenden).Benutzerdefinierter whiteSpace mit Haskell Parsec

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

auf den Code der Suche nach makeTokenParser Ich glaube, ich verstehe, warum es so funktioniert. Ich möchte wissen, ob es Problemumgehungen gibt, um zu vermeiden, den Code für makeTokenParser vollständig zu duplizieren?

+0

Related: http://stackoverflow.com/questions/5672142/in-parsec-is-there-a-way-to-prevent-lexeme-from-consuming-newlines –

Antwort

7

Leider glaube ich nicht, dass es einen Weg gibt. Die lokalen Definitionen, die in makeTokenParser verwendet werden, beziehen sich rekursiv auf sich selbst. Wie Sie bereits festgestellt haben, verwendet lexemewhiteSpace wie dort definiert anstelle des whiteSpace Datensatzelements, das Sie in Ihrem lexer Objekt ersetzen.

Der Code ist höhnisch, weil er die gleichen Namen wie die beiden lokalen Funktionen in makeTokenParser und als Datensatzelemente des TokenParser Konstruktors verwendet. Sie sind in der Tat völlig unterschiedliche Entitäten.

+2

Nun, wenn nur die 'TokenParser' geschrieben wurden Mit Typklassen wären wir gut zu gehen. – Steve

+1

.. und wenn es monadische Parser machen könnte (in Parsec 3) anstatt fest mit "Identity" verbunden zu sein. –

Verwandte Themen