如何在Haskell中构建Parser

时间:2014-10-27 12:52:47

标签: parsing haskell

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这样的算术表达式。我能做什么?

请帮助我。它应该处理运算符优先级。

1 个答案:

答案 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)))