Parsing Happy解析器中令人费解的错误消息

Parsing Happy解析器中令人费解的错误消息,parsing,haskell,happy,Parsing,Haskell,Happy,我正在用Haskell构建一个JavaScript解析器,我遇到了一条错误消息,不管我怎么努力,我都无法调试 我不能在这里发布所有的代码,因为它有数千行。我会尽力发布相关的信息,如果有人能帮助我,我将不胜感激 此错误消息很长,请耐心等待。我省略了HappyAbsSyn的大部分部分。如果有帮助,我可以提供完整的错误消息 Parser.hs:800:28: Couldn't match expected type `Expression' with actua

我正在用Haskell构建一个JavaScript解析器,我遇到了一条错误消息,不管我怎么努力,我都无法调试

我不能在这里发布所有的代码,因为它有数千行。我会尽力发布相关的信息,如果有人能帮助我,我将不胜感激

此错误消息很长,请耐心等待。我省略了HappyAbsSyn的大部分部分。如果有帮助,我可以提供完整的错误消息

Parser.hs:800:28:
    Couldn't match expected type `Expression'
                with actual type `PrimaryExpr'
    Expected type: Int
                   -> Int
                   -> Token
                   -> HappyState
                        Token
                        (HappyStk
                           (HappyAbsSyn
                              FuncDecl
                              ... etc etc ...
                              PostFix)
                         -> P a1)
                   -> [HappyState
                         Token
                         (HappyStk
                            (HappyAbsSyn
                               FuncDecl
                              ... etc etc ...
                               PostFix)
                          -> P a1)]
                   -> HappyStk
                        (HappyAbsSyn
                           FuncDecl
                              ... etc etc ...
      Actual type: Int
                   -> Int
                   -> Token
                   -> HappyState
                        Token
                        (HappyStk
                           (HappyAbsSyn
                              FuncDecl
                              ... etc etc ...
                              t630)
                         -> P a0)
                   -> [HappyState
                         Token
                         (HappyStk
                            (HappyAbsSyn
                               FuncDecl
                              ... etc etc ...
                               t630)
                          -> P a0)]
                   -> HappyStk
                        (HappyAbsSyn
                           FuncDecl
                              ... etc etc ...
                           t630)
                   -> P a0
    In the first argument of `happyGoto', namely `action_90'
    In the expression: happyGoto action_90
明白了吗?好的,我做的第一件事是看Parser.hs(由Happy生成的文件)中的第800行

行动90
定义为:

action_90 (100) = happyShift action_224
action_90 _ = happyFail
除非我们理解代码对应的是什么,否则这显然没有多大意义。我要求Happy在编译时生成一个信息文件,我认为这是合适的部分:

-----------------------------------------------------------------------------
Grammar
-----------------------------------------------------------------------------
    %start_parse -> program                            (0)
    ... etc etc ...
    statement -> ID ':' statement                      (28)
    ... etc etc ...
    primaryExpr -> THIS                                (100)
    ... etc etc ...
所以它看起来和一个ID语句有关。这一点我真的很困惑。有没有人对我今后的路有什么建议?我猜要完成这项工作,您需要了解抽象语法。这里有一点。再一次,如果有帮助的话,我很高兴展示更多

data Expression
    = Assignment    Assignment 
    deriving Show

data Assignment
    = CondExpr        CondExpr
    | Assign          LeftExpr AssignOp Assignment 
    | AssignFuncDecl  FuncDecl
    deriving Show

data FuncDecl
    = FuncDecl      (Maybe String) [String] [Source]
    deriving Show

data Statement
    = EmptyStmt
    | IfStmt        IfStmt
    | IterativeStmt IterativeStmt
    | ExprStmt      Expression
    | Block         [Statement]
    | VarStmt       [VarDecl]
    | TryStmt       TryStmt
    | ContinueStmt  (Maybe String)
    | BreakStmt     (Maybe String)
    | ReturnStmt    (Maybe Expression)
    | WithStmt      Expression Statement
    | LabelledStmt  String Statement
    | Switch        Switch
    | ThrowExpr     Expression
    deriving Show

data PrimaryExpr
    = ExpLitInt     Integer
    | ExpLitStr     String
    | ExpId         String
    | ExpBrackExp   PrimaryExpr
    | ExpThis
    | ExpRegex      String
    | ExpArray      ArrayLit
    | ExpObject     [(Property, Assignment)]
    deriving Show

对不起,时间太长了。我在这里束手无策。任何帮助或提示都会令人惊讶。

通常需要编译整个happy文件(以我的经验,但我对happy只感到稍微舒服一点)。另外,请确保您运行的是最新版本的Happy-我以前被bug咬过。您是否尝试过修改语法?它有时会使像这样的类型错误更容易跟踪。您还可以尝试用
未定义的
替换可疑语义动作。如果这使得它可以编译,那么你很可能已经找到了罪魁祸首。你可以尝试将你的示例精简到一个仍然失败的最小示例。您已经怀疑它与ID标记有关,所以请尝试注释出与此无关的行。您是否缺少构造函数,并且在某个愉快的操作中使用PrimExpression作为表达式?快乐语法不是类型检查的,它们生成的解析器是类型检查的——这意味着类型错误可能是模糊的,需要一些查找。一定要听从哈马尔的建议,在你的语法中添加类型签名。这都是非常好的建议。我最终通过像hammar建议的那样给出所有类型的签名来追踪bug。如果你想把它作为回答,哈马尔,我很乐意接受。在我添加了类型之后,给我的错误消息更加清晰。
data Expression
    = Assignment    Assignment 
    deriving Show

data Assignment
    = CondExpr        CondExpr
    | Assign          LeftExpr AssignOp Assignment 
    | AssignFuncDecl  FuncDecl
    deriving Show

data FuncDecl
    = FuncDecl      (Maybe String) [String] [Source]
    deriving Show

data Statement
    = EmptyStmt
    | IfStmt        IfStmt
    | IterativeStmt IterativeStmt
    | ExprStmt      Expression
    | Block         [Statement]
    | VarStmt       [VarDecl]
    | TryStmt       TryStmt
    | ContinueStmt  (Maybe String)
    | BreakStmt     (Maybe String)
    | ReturnStmt    (Maybe Expression)
    | WithStmt      Expression Statement
    | LabelledStmt  String Statement
    | Switch        Switch
    | ThrowExpr     Expression
    deriving Show

data PrimaryExpr
    = ExpLitInt     Integer
    | ExpLitStr     String
    | ExpId         String
    | ExpBrackExp   PrimaryExpr
    | ExpThis
    | ExpRegex      String
    | ExpArray      ArrayLit
    | ExpObject     [(Property, Assignment)]
    deriving Show