我是 Haskell 和 Happy 的新手,我正在尝试使用 Haskell 和 Happy 制作一个带有属性语法的解析器。我为变量声明做了一些语法,给了 BNFC 和一切,因为这里工作正常。然后我开始在解析器中添加属性,此时我发现了我的第一个问题:当我添加%attributetype {MyAttribute a}
happy -gca Pargrammar.y
工作正常,但在我添加后立即%attribute parseTree {a}
快乐给了我这个解析错误
快乐:解析错误
所以我保持只是%attributetype {MyAttribute a}
并尝试先修改基本类型
String :: { String } : L_quoted { $1 }
这条线在这里
String : L_quoted { $$= $1 }
但是我的第二个问题出现了:当我启动 Makefile 时,我在这里遇到了这个错误
Pargrammar.hs:344:19: 错误: 变量不在范围内: ($$=) :: t1 -> String -> t
Pargrammar.hs:1066:19:错误:
• Couldn't match type ‘t1 -> t’ with ‘[Char]’ Expected type: HappyAbsSyn String Actual type: HappyAbsSyn (t1 -> t) • In the first argument of ‘fn’, namely ‘v1’ In the expression: fn v1 In an equation for ‘r’: r = fn v1 • Relevant bindings include r :: HappyAbsSyn (t1 -> t) (bound at Pargrammar.hs:1066:12) stk' :: HappyStk (HappyAbsSyn (t1 -> t)) (bound at Pargrammar.hs:1065:81) v1 :: HappyAbsSyn (t1 -> t) (bound at Pargrammar.hs:1065:69) fn :: HappyAbsSyn String -> HappyAbsSyn (t1 -> t) (bound at Pargrammar.hs:1065:22) happySpecReduce_1 :: Happy_GHC_Exts.Int# -> (HappyAbsSyn String -> HappyAbsSyn (t1 -> t)) -> Happy_GHC_Exts.Int# -> Token -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn (t1 -> t)) -> [Token] -> Err (HappyAbsSyn (t1 -> t)) (bound at Pargrammar.hs:1063:1)
实际上在 Pargrammar.hs 的第 344 行,我得到了这个
happyIn8
($$= happy_var_1
)
但那不$$=
应该在那里。
我的 Makefile 就是这样做的
all:
happy -gca Pargrammar.y
alex -g Lexgrammar.x
ghc --make Testgrammar.hs -o Testgrammar
clean:
-rm -f *.log *.aux *.hi *.o *.dvi
-rm -f Docgrammar.ps
distclean: clean
-rm -f Docgrammar.* Lexgrammar.* Pargrammar.* Layoutgrammar.* Skelgrammar.* Printgrammar.* Testgrammar.* Absgrammar.* Testgrammar ErrM.* SharedString.* ComposOp.* grammar.dtd XMLgrammar.* Makefile*
我真的不知道如何解决这个问题。如果你们中的任何人可以建议我一些想法,我将不胜感激。