Загадочное сообщение об ошибке в Happy parser - PullRequest
1 голос
/ 09 февраля 2012

Я создаю синтаксический анализатор 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

Извините, это так долго. Я в своем уме остроумие здесь. Любая помощь или указатели были бы удивительными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...