我正在使用 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> }
)工作正常。我正在使用快乐 1.19.4 和 GHC 7.8.3。
这可能是一个错误,还是我做错了什么?