Я пытаюсь создать базовый синтаксический анализатор математических уравнений с помощью Parsec, и у меня возникают проблемы с использованием функции buildExpressionParser
.
Я создал функцию parsecParse
, но она просто зависает навсегда, когда я вызываю ее в ghci: parse parsecParse "" "200*6"
. Я не могу понять, почему. Любые идеи?
module Equation where
import Control.Applicative hiding (many, (<|>))
import Text.Parsec.Char (char, digit)
import Text.Parsec.Combinator (many1, option)
import Text.Parsec.Expr (Assoc (..), Operator (..), buildExpressionParser)
import Text.Parsec.Prim ((<|>), try)
import Text.Parsec.String (Parser)
data Equation = Leaf Double | Tree Op Equation Equation deriving (Show)
data Op = Plus | Minus | Multiply | Divide deriving (Show)
parsecParse :: Parser Equation
parsecParse = try parseOperator <|> parseDouble
parseDouble :: Parser Equation
parseDouble = fmap (Leaf . read) $ (++) <$> integer <*> fraction
where integer = many1 digit
fraction = option "" $ (:) <$> char '.' <*> many1 digit
parseOperator :: Parser Equation
parseOperator = buildExpressionParser table parsecParse
where table = [[ getOp '*' Multiply, getOp '/' Divide ],
[ getOp '+' Plus, getOp '-' Minus ]]
getOp c o = Infix (char c >> return (Tree o)) AssocLeft