Я пытаюсь узнать, как сделать анализатор выражений в Haskell, и я нашел этот код (ниже), но я даже не знаю, как его использовать.
Я пробовал с: expr (Add (Num 5) (Num 2)) , но ему нужен тип данных «Парсер».
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 = проанализировать ввод expr «имя сообщения об ошибке» и использовать readExpr.
Either
. Я бы закончил тем, что написалRight a -> Right a
26.05.2013ParseError
иString
— это разные типы, поэтому вам нужно написатьRight a -> Right a
, чтобы изменить тип сEither ParseError Expr
наEither String Expr
. В противном случае он не будет проверять тип. 26.05.2013