首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell - Happy解析器错误

Haskell - Happy解析器错误
EN

Stack Overflow用户
提问于 2013-05-28 06:51:13
回答 1查看 769关注 0票数 4

我正在做一个使用Happy解析器生成器的项目。这就是我到目前为止所做的:

代码语言:javascript
复制
Exp   : Exp1                    { $1 }

Exp1  : Exp1 '+' Term           { \p -> $1 p + $3 p }
      | Exp1 '-' Term           { \p -> $1 p - $3 p }
      | Term                    { $1 }

Term  : Term '*' Factor         { \p -> $1 p * $3 p }
      | Term '/' Factor         { \p -> $1 p / $3 p }
      | sqrt Factor             { \p -> sqrt $2 p }
      | Factor                  { $1 }

Factor                    
      : double                  { \p -> $1 }
      | '(' Exp ')'             { $2 }

问题是我得到了以下错误:

代码语言:javascript
复制
Parser.hs:158:38:
No instance for (Floating ([a0] -> Double))
  arising from a use of `happyReduction_7'
Possible fix:
  add an instance declaration for (Floating ([a0] -> Double))
In the second argument of `happySpecReduce_2', namely
  `happyReduction_7'
In the expression: happySpecReduce_2 6 happyReduction_7
In an equation for `happyReduce_7':
    happyReduce_7 = happySpecReduce_2 6 happyReduction_7

你知道我该怎么解决这个问题吗?

更新:我解决了这个问题,但现在只有当我写“sqrt2”( sqrt和2之间没有空格)时它才能工作;如果我写“sqrt2”,我会得到"parse error“。

这是我在Alex(lex)文件中的内容:

代码语言:javascript
复制
       tokens :-

       $white+         ;
       "--".*          ;
       "sqrt"                   { \s -> TokenSqrt}
       "sin"                    { \s -> TokenSin}
       "log"                    { \s -> TokenLog}
       @doubleNumber            { \s -> TokenDouble (read s) }
       @var                     { \s -> TokenVar s }
       "+"                      { \s -> TokenPlus }
       "-"                      { \s -> TokenMinus }
       "*"                      { \s -> TokenMul }
       "/"                      { \s -> TokenDiv }
       "("                      { \s -> TokenOB }
       ")"                      { \s -> TokenCB }
       "="                      { \s -> TokenEq }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-28 07:13:27

代码语言:javascript
复制
sqrt $2 p

这将以$2函数作为参数调用sqrt,然后将生成的函数应用于参数p。只有当sqrt可以接受一个函数并生成一个函数作为结果时,这才有意义,当且仅当存在函数的Floating实例时才是这种情况,而实际上并没有。因此出现了错误消息。

毫无疑问,您要做的是将函数$2应用于参数p,然后将sqrt应用于结果,为此您将编写:

代码语言:javascript
复制
sqrt ($2 p)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16781511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档