diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-03-09 16:20:28 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-03-09 16:20:28 +0100 |
| commit | ddff2e34a8f5e7fdb4a9e67d4df1edfa393ab3b7 (patch) | |
| tree | 0ef7eddfeadb0c7201bdc0fd3851350239229b06 /parser.hs | |
| parent | c27e85f27b8db206da23b813358ea44e302f2419 (diff) | |
| download | computorv1-ddff2e34a8f5e7fdb4a9e67d4df1edfa393ab3b7.tar.gz computorv1-ddff2e34a8f5e7fdb4a9e67d4df1edfa393ab3b7.tar.bz2 computorv1-ddff2e34a8f5e7fdb4a9e67d4df1edfa393ab3b7.zip | |
Refactoring file structure
Diffstat (limited to 'parser.hs')
| -rw-r--r-- | parser.hs | 78 |
1 files changed, 0 insertions, 78 deletions
diff --git a/parser.hs b/parser.hs deleted file mode 100644 index 7929c26..0000000 --- a/parser.hs +++ /dev/null @@ -1,78 +0,0 @@ -module Parser where - -import Control.Applicative -import Control.Monad -import Data.Char -import Numeric.Natural - - -newtype Parser a = Parser (String -> Maybe (a, String)) - -parse :: Parser a -> String -> Maybe (a, String) -parse (Parser p) input = p input - -instance Functor Parser where - -- fmap :: (a -> b) -> Parser a -> Parser b - fmap f (Parser p) = Parser new_p - where new_p s = do - (x, s') <- p s - return (f x, s') - -instance Applicative Parser where - -- pure :: a -> Parser a - pure x = Parser (\s -> Just (x, s)) - -- (<*>) :: Parser (a -> b) -> Parser a -> Parser b - (Parser p1) <*> (Parser p2) = Parser new_p - where new_p s = do - (f, s') <- p1 s - (x, s'') <- p2 s' - return (f x, s'') - -instance Alternative Parser where - -- empty :: Parser a - empty = Parser (\_ -> Nothing) - -- (<|>) :: Parser a -> Parser a -> Parser a - (Parser p1) <|> (Parser p2) = Parser new_p - where new_p s = p1 s <|> p2 s - - -charP :: Char -> Parser Char -charP x = Parser p - where p "" = Nothing - p (c:cs) = if c == x then Just (c, cs) - else Nothing - -digitsP :: Parser String -digitsP = Parser (\s -> Just $ span isDigit s) - -sepBy :: Parser a -> Parser b -> Parser [a] -sepBy x sep = ((:) <$> x <*> many (sep *> x)) <|> pure [] - - --- 1 * X^0 + 2 * X^1 + 1 * 3 * X^2 = 0 -data Equation = Equation { left :: Polynomial, right :: Polynomial } deriving (Show) -type Polynomial = [Term] -data Term = Term { coefficient :: Float, exponent :: Natural } deriving (Show) - -coefficientP :: Parser Float -coefficientP = read <$> (floatP <|> digitsP) - where floatP = (\i _ f -> (i ++ "." ++ f)) - <$> digitsP <*> charP '.' <*> digitsP - -exponentP :: Parser Natural -exponentP = read <$> digitsP - -termP :: Parser Term -termP = (\coef _ exp -> Term coef exp) - <$> coefficientP - <*> (charP '*' *> charP 'X' *> charP '^') - <*> exponentP - -polynomialP :: Parser Polynomial -polynomialP = sepBy termP (charP '+') - -equationP :: Parser Equation -equationP = (\l _ r -> Equation l r) - <$> polynomialP - <*> charP '=' - <*> polynomialP |
