如何创建Parser数据?

时间:2013-05-26 13:03:36

标签: parsing haskell parsec

我正在尝试学习如何在Haskell中为表达式执行解析器,我发现了这个代码(如下所示),但我甚至不知道如何使用它。

我尝试使用:expr(Add(Num 5)(Num 2)),但它需要一个“Parser”数据类型。

import Text.Parsec
import Text.Parsec.String
import Text.Parsec.Expr
import Text.Parsec.Token
import Text.Parsec.Language

data Expr = Num Int | Var String | Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr deriving Show

expr :: Parser Expr
expr = buildExpressionParser table factor
  <?> "expression"
table = [[op "*" Mul AssocLeft, op "/" Div AssocLeft],
      [op "+" Add AssocLeft, op "-" Sub AssocLeft]]
      where
        op s f assoc = Infix (do{ string s; return f}) assoc
factor = do{ char '('
        ; x <- expr
        ; char ')'
        ; return x}
    <|> number
    <|> variable
    <?> "simple expression"
number :: Parser Expr
number = do{ ds<- many1 digit
      ; return (Num (read ds))}
  <?> "number"
variable :: Parser Expr
variable = do{ ds<- many1 letter
        ; return (Var ds)}
  <?> "variable"

解决方案:readExpr input = parse expr“错误消息的名称”输入 并使用readExpr。

1 个答案:

答案 0 :(得分:2)

您可以使用函数parse,它将在输入字符串上运行Parser并返回Either ParseError Expr。我在下面添加了一个简单的用法,我将ParseError转换为字符串并将其传递给

readExpr :: String -> Either String Expr
readExpr input = case parse expr "name for error messages" input of
   Left err -> Left $ "Oh noes parsers are failing: " ++ show err -- Handle error
   Right a  -> Right a -- Handle success

还有一些其他功能,例如parseFromFile,可让您简写一些常见模式,找到它们,查看parsec haddock