Parsing 哈斯凯尔很高兴;不能';t匹配预期类型“;
我在理解为haskell感到高兴的解析器生成器系统的错误消息时遇到了一些问题 比如这个代码Parsing 哈斯凯尔很高兴;不能';t匹配预期类型“;,parsing,haskell,parser-generator,happy,Parsing,Haskell,Parser Generator,Happy,我在理解为haskell感到高兴的解析器生成器系统的错误消息时遇到了一些问题 比如这个代码 { module Test_parser where import System.IO import Test_lexer } %name parse %tokentype { Token } %error { parseError } %token true { TokenTrue posn } false { Tok
{
module Test_parser where
import System.IO
import Test_lexer
}
%name parse
%tokentype { Token }
%error { parseError }
%token
true { TokenTrue posn }
false { TokenFalse posn }
number { TokenInteger posn $$ }
%%
LiteralExpr :
true {LiteralTrue ()}
| false {LiteralFalse ()}
| number {LiteralInteger () $1}
{
data Expression n =
LiteralTrue n
| LiteralFalse n
| LiteralInteger n Integer
deriving (Eq, Show)
parseError xs = error "Parse error"
main = do
inStr <- getContents
let parseTree = parse (alexScanTokens inStr)
putStrLn $ show(parseTree)
}
我将收到一条巨大的错误消息。
如果你能帮助我理解它,那就太好了
提前感谢您似乎混淆了数据构造函数和类型构造函数<
Expression
中的code>Inte是一个数据构造函数,恰好与下面定义的Inte
数据类型具有相同的名称(并且与之无关)
你应该吃点类似的东西
data Expression n =
LiteralTrue n
| LiteralFalse n
| LiteralInt (Inte n)
并适当地修改代码(在需要的地方添加
LiteralInt
)好的,就是这样:
...
LiteralExpr :
true {LiteralTrue ()}
| false {LiteralFalse ()}
| Inte {LiteralInt $1}
Inte :
number {LiteralInteger () $1}
...
及
对不起,我不明白。也许你是对的,但我仍然收到错误消息。这不起作用:“…LiteralExpr:true{LiteralTrue()}false{LiteralFalse()}Inte{LiteralInt(Inte()$1)}Inte:number{literalinter()$1}{数据表达式n=LiteralTrue n | LiteralFalse n | LiteralInt(inten)派生(Eq,Show)数据inten=literalinter n整数派生(Eq,Show)…”请您修改给定的代码示例以运行它。也许我在看到正确的版本后得到它。;)
...
LiteralExpr :
true {LiteralTrue ()}
| false {LiteralFalse ()}
| Inte {LiteralInt $1}
Inte :
number {LiteralInteger () $1}
...
...
data Expression n =
LiteralTrue n
| LiteralFalse n
| LiteralInt (Inte n)
deriving (Eq, Show)
data Inte n =
LiteralInteger n Integer
deriving (Eq, Show)
...