Haskell でHappyを使用して 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 行目です。
799: action_60 (7) = happyGoto action_71
800: action_60 (28) = happyGoto action_90
801: action_60 (33) = happyGoto action_15
action_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
長くなってすみません。私はここで頭がいっぱいです。どんな助けや指針も素晴らしいでしょう。