1

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

長くなってすみません。私はここで頭がいっぱいです。どんな助けや指針も素晴らしいでしょう。

4

0 に答える 0