2

私は Happy/Alex を使用してパーサーを作成しています。構文解析している文法は完全にコンテキスト フリーではないため、先読みトークンを取得する必要があります。Happy のドキュメントは、スレッド化されたレクサーを使用する場合、これは次の形式のルールで実行できることを示唆しています。

n  :  t_1 ... t_n          {%^ <expr> }

ルールを書いたので

gdecl   : type ident paramList block     { FDefn $1 $2 $3 $4 }
        | type ident paramList ';'       { FDecl $1 $2 $3 }
        | typedef type ident ';'         {%^ mkTypDef $2 $3 }
        | struct ident ';'               { StructDecl $2 }
        | struct ident '{' fieldList '}' { StructDefn $2 $4 }

ただし、これにより ghc が解析できない .hs ファイルが生成されます。GHCは次のエラーを出します:

Parser.hs:301:47: parse error on input ‘tk’

これは、エラーを生成する haskell 関数です。

happyReduce_6 = happyMonadReduce 4# 2# happyReduction_6
happyReduction_6 (happy_x_4 `HappyStk`
        happy_x_3 `HappyStk`
        happy_x_2 `HappyStk`
        happy_x_1 `HappyStk`
        happyRest) tk 
         = happyThen (case happyOut21 happy_x_2 of { happy_var_2 ->
        case happyOutTok happy_x_3 of { (LocTok _ (TokIdent happy_var_3)) ->
        ( mkTypDef happy_var_2 happy_var_3)}} tk        <-- Error Here
        ) (\r -> happyReturn (happyIn6 r))

mkTypDef = undefined型エラーが発生していないことを確認するためだけに、を残しました。通常のモナド生成 ( を使用{% <expn> }) は問題なく動作します。Happy 1.19.4 と GHC 7.8.3 を使用しています。

これはおそらくバグですか、それとも私が間違っていることがありますか?

4

1 に答える 1