Estoy tratando de analizar un lenguaje basado en sangrías (piense en Python, Haskell sí mismo, Boo, YAML) en Haskell usando Parsec. He visto la biblioteca de IndentParser, y parece que es la combinación perfecta, pero lo que no puedo entender es cómo hacer que mi TokenParser
se convierta en un analizador de sangrías. Aquí está el código que tengo hasta ahora:Análisis de sintaxis basadas en sangría en 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
Esto arroja el error:
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
¿Qué estoy haciendo mal? ¿Cómo debería crear un IT.TokenParser
? ¿O está roto IndentParser y debe evitarse?
¡Usted, señor, es increíble! ¡Gracias! ¿Cómo sabías que estaba usando Parsec 3? ¿Una adivinanza? Porque creo que mi ejemplo podría ser ... – pavpanchekha
Me temo que mi trabajo de detective aquí no fue muy emocionante: compilé tu código con Parsec 3, obtuve un error similar al tuyo y luego probé Parsec 2, que trabajó. Por cierto, parece que no sería muy difícil hacer que IndentParser funcione con Parsec 3; puede considerar darle una oportunidad si encuentra que IndentParser es útil. –
Podría, pero ahora mismo solo estoy aprendiendo a Haskell; Me temo que me perdería en una base de código extranjera como esa. – pavpanchekha