1

我是 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*

我真的不知道如何解决这个问题。如果你们中的任何人可以建议我一些想法,我将不胜感激。

4

0 回答 0