我正在尝试使用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"
或者,您可以下载source和build and install in the normal way。
关于parsing - 在Haskell的Parsec中解析基于缩进的语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3023439/