我正在尝试使用Parsec在Haskell中解析基于缩进的语言(认为Python,Haskell本身,Boo,YAML)。我看过IndentParser库,看起来很合适,但是我不知道如何将TokenParser变成缩进解析器。这是我到目前为止的代码:

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

这将引发错误:
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

我究竟做错了什么?我应该如何创建IT.TokenParser?还是IndentParser损坏并应避免?

最佳答案

看起来您在这里使用的是Parsec 3,而IndentParser希望使用的是Parsec2。您的示例使用-package parsec-2.1.0.1为我编译。

因此IndentParser不一定是坏的,但是作者应该在依赖项列表中更详细地说明版本。可能同时安装了两个版本的Parsec,因此没有理由不应该使用IndentParser,除非您出于其他原因 promise 使用Parsec 3。

更新:实际上,要使IdentParser与Parsec 3一起使用,无需对源进行任何更改。我们俩都遇到的问题似乎是由于cabal-install具有Parsec 2的"soft preference"造成的。您可以使用以下命令重新安装IndentParser:对Parsec版本的显式约束:

cabal install IndentParser --reinstall --constraint="parsec >= 3"

或者,您可以下载sourcebuild and install in the normal way

关于parsing - 在Haskell的Parsec中解析基于缩进的语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3023439/

10-12 22:31