我正在做一个使用Happy解析器生成器的项目。这就是我到目前为止所做的:
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 }问题是我得到了以下错误:
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)文件中的内容:
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 }发布于 2013-05-28 07:13:27
sqrt $2 p这将以$2函数作为参数调用sqrt,然后将生成的函数应用于参数p。只有当sqrt可以接受一个函数并生成一个函数作为结果时,这才有意义,当且仅当存在函数的Floating实例时才是这种情况,而实际上并没有。因此出现了错误消息。
毫无疑问,您要做的是将函数$2应用于参数p,然后将sqrt应用于结果,为此您将编写:
sqrt ($2 p)https://stackoverflow.com/questions/16781511
复制相似问题