【问题标题】:Possible bug in Happy?Happy中可能出现的错误?
【发布时间】:2014-10-18 18:26:07
【问题描述】:

我正在使用 Happy/Alex 编写解析器,因为我正在解析的语法不是完全上下文无关的,所以我需要获取前瞻标记。 Happy documentation 建议在使用线程词法分析器时,可以使用以下形式的规则来完成

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,只是为了确保我没有犯任何类型错误。正常的单子制作({% &lt;expn&gt; })工作正常。我正在使用 Happy 1.19.4 和 GHC 7.8.3。

这可能是一个错误,还是我做错了什么?

【问题讨论】:

  • 解析错误实际上在倒数第二行,它结束了一个无效的表达式case ... of { ... } tk。我会说这绝对是happy中的一个bug,虽然我不知道你的语法语法是否正确。
  • 哦,好电话,我的错误。我想我会打开一个错误报告。
  • @ReidBarton 既然你的评论解决了这个问题,你可以把它变成一个答案吗?否则,这将只是一个悬而未决的问题......

标签: haskell happy


【解决方案1】:

正如上面 Ried Barton 所指出的,这确实是一个错误,并且已在此处报告:https://github.com/simonmar/happy/issues/35

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多