data Expr = ExprNum Double -- constants
| ExprVar String -- variables
| ExprAdd Expr Expr
| ExprSub Expr Expr
| ExprNeg Expr -- The unary '-' operator
| ExprMul Expr Expr
| ExprDiv Expr Expr
deriving Show
这是我的用户定义数据类型。我想在不使用(2+3 *4 - x)
解析器的情况下使用上述数据类型处理像buildExpression
这样的算术表达式。我能做什么?
请帮助我。它应该处理运算符优先级。
答案 0 :(得分:3)
假设我们要构建一个addsub
级别的解析器。我们想说(忽略实际值的正确返回,只关注原始解析)
addsub = muldiv >> oneOf "+-" >> muldiv
这不起作用。但我们可以把这个因素留作
addsub = muldiv >> addsub'
addsub' = many $ oneOf "+-" >> muldiv
我们假设muldiv
是一个只有乘法和除法的解析器,你可以用类似的方式编写。
也就是说,而不是使用语法
addsub = addsub (+-) muldiv | muldiv
我们使用稍微复杂一些,但实际上可以使用Parsec:
addsub = muldiv addsub'
addsub' = (+-) muldiv addsub' | Nothing
我们当然可以将后者重构为many
,它为我们提供了一个我们要添加的表达式列表。然后,您可以将其转换为您想要的任何形式,例如(Add a1 (Add a2 (Add a3)))
。