Ich versuche, eine indentation-basierte Sprache (denke Python, Haskell selbst, Boo, YAML) in Haskell Parsec zu analysieren. Ich habe die IndentParser-Bibliothek gesehen, und es sieht so aus, als wäre es die perfekte Übereinstimmung, aber was ich nicht herausfinden kann, ist, wie ich meine TokenParser
in einen Einrückungsparser machen kann. Hier ist der Code Ich habe bisher:Parsing Indentation-basierte Syntax in Haskell's Parsec
import qualified Text.ParserCombinators.Parsec.Token as T
import qualified Text.ParserCombinators.Parsec.IndentParser.Token as IT
lexer = T.makeTokenParser mylangDef
ident = IT.identifier lexer
Dies führt den Fehler:
parser2.hs:29:28:
Couldn't match expected type `IT.TokenParser st'
against inferred type `T.GenTokenParser s u m'
In the first argument of `IT.identifier', namely `lexer'
In the expression: IT.identifier lexer
In the definition of `ident': ident = IT.identifier lexer
Was mache ich falsch? Wie soll ich ein IT.TokenParser
erstellen? Oder ist IndentParser kaputt und sollte vermieden werden?
Sie, Herr, sind fantastisch! Vielen Dank! Woher wusstest du, dass ich Parsec 3 benutzt habe? Eine Annahme? Weil ich denke, mein Beispiel könnte entweder ... – pavpanchekha
Ich fürchte, dass meine Detektivarbeit hier nicht wirklich sehr aufregend war: Ich habe Ihren Code mit Parsec 3 kompiliert, einen Fehler ähnlich dem Ihren bekommen und dann Parsec 2 ausprobiert, was hat funktioniert. Übrigens scheint es nicht zu schwer zu sein, IndentParser mit Parsec 3 arbeiten zu lassen; Sie können es in Betracht ziehen, wenn Sie IndentParser nützlich finden. –
Ich könnte, aber im Moment lerne ich gerade erst Haskell; Ich fürchte, ich würde mich in einer fremden Codebase so verlieren. – pavpanchekha