Я создаю синтаксический анализатор JavaScript в Haskell, используя Happy , и у меня появляется сообщение об ошибке, которое, как бы я ни старался, я не могу отладить.
Я не могу опубликовать весь код здесь, так как он длиной в тысячи строк. Я постараюсь опубликовать соответствующие материалы, и если кто-нибудь сможет мне помочь, я буду безмерно благодарен!
Это сообщение об ошибке очень длинное, поэтому, пожалуйста, потерпите меня. Я пропустил большую часть 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
Понял? Итак, первое, что я сделал, это посмотрел на строку 800 в Parser.hs (файл, сгенерированный Happy).
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
Извините, это так долго. Я в своем уме остроумие здесь. Любая помощь или указатели были бы удивительными.