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