Parsing 哈斯凯尔很高兴;不能';t匹配预期类型“;

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

我在理解为haskell感到高兴的解析器生成器系统的错误消息时遇到了一些问题

比如这个代码

{
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)
...