我是Haskell和Happy的新手,我正试图在Haskell中使用Happy来创建一个带有归属语法的解析器。我已经为变量声明制作了一点语法,给了BNFC以及一切,因为这里工作正常。然后我开始在解析器中添加属性,此时我发现了我的第一个问题:当我添加%attributetype {MyAttribute a}
时
happy -gca Pargrammar.y
工作正常,但在我添加%attribute parseTree {a}
happy给了我这个解析错误
开心:解析错误
所以我只保留%attributetype {MyAttribute a}
并尝试修改首先更改的基本类型
String :: { String } : L_quoted { $1 }
这一行
String : L_quoted { $$= $1 }
然后我的第二个问题出现了:当我启动Makefile时,我在这里遇到了这个错误
Pargrammar.hs:344:19:错误: 变量不在范围内:($$ =):: t1 - >字符串 - >吨
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*
我真的不知道如何解决这个问题。如果你们中的任何人可以向我提出一些想法,我将不胜感激。