From ddff2e34a8f5e7fdb4a9e67d4df1edfa393ab3b7 Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 9 Mar 2020 16:20:28 +0100 Subject: Refactoring file structure --- Makefile | 10 +++++--- main.hs | 45 ---------------------------------- parser.hs | 78 ----------------------------------------------------------- src/main.hs | 45 ++++++++++++++++++++++++++++++++++ src/parser.hs | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 129 insertions(+), 127 deletions(-) delete mode 100644 main.hs delete mode 100644 parser.hs create mode 100644 src/main.hs create mode 100644 src/parser.hs diff --git a/Makefile b/Makefile index 48f7007..347c7f1 100644 --- a/Makefile +++ b/Makefile @@ -12,19 +12,21 @@ CC = ghc +SRC_DIR = src +BUILD_DIR = build NAME = computor -SRC = $(shell find . -name "*.hs") +SRC = $(shell find $(SRC_DIR) -type f -name "*.hs") all: $(NAME) $(NAME): $(SRC) - $(CC) -o $(NAME) $(SRC) + $(CC) --make -outputdir $(BUILD_DIR) -o $(NAME) $(SRC) clean: - rm -f *.o *.hi + $(RM) $(BUILD_DIR)/*.o $(BUILD_DIR)/*.hi fclean: clean - rm -f $(NAME) + $(RM) $(NAME) re: fclean all diff --git a/main.hs b/main.hs deleted file mode 100644 index c327d2b..0000000 --- a/main.hs +++ /dev/null @@ -1,45 +0,0 @@ -import System.Environment -import Data.Char - -data TokenType = Number | Add | Sub | Mul | Exp | Equal deriving (Show) -data Token = Token TokenType Float deriving (Show) - -main = do - args <- getArgs - -- putStr $ show args - let l = lexer $ (head args) - putStrLn $ show l - - -lexer :: String -> [Token] -lexer "" = [] -lexer (c:rest) - | c == ' ' = lexer rest - | isDigit c = (Token Number (read (isolateFloat (c:rest)) :: Float)) : lexer (afterFloat (c:rest)) - | c == '+' = (Token Add 0.0) : lexer rest - | c == '-' = (Token Sub 0.0) : lexer rest - | c == '*' = (Token Mul 0.0) : lexer rest - | c == '^' = (Token Exp 0.0) : lexer rest - | c == '=' = (Token Equal 0.0) : lexer rest - - where isolateFloat :: String -> String - isolateFloat "" = "" - isolateFloat (c:cs) - | isDigit c = c : isolateFloat cs - | c == '.' = c : isolateFloat cs - | otherwise = "" - - afterFloat :: String -> String - afterFloat "" = "" - afterFloat (c:cs) - | isDigit c = afterFloat cs - | c == '.' = afterFloat cs - | otherwise = (c:cs) - - --- parse :: Lexing -> SyntaxTree --- parse s = 2 --- --- --- eval :: SyntaxTree -> Maybe [Float] --- eval _ = 0.0 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 diff --git a/src/main.hs b/src/main.hs new file mode 100644 index 0000000..c327d2b --- /dev/null +++ b/src/main.hs @@ -0,0 +1,45 @@ +import System.Environment +import Data.Char + +data TokenType = Number | Add | Sub | Mul | Exp | Equal deriving (Show) +data Token = Token TokenType Float deriving (Show) + +main = do + args <- getArgs + -- putStr $ show args + let l = lexer $ (head args) + putStrLn $ show l + + +lexer :: String -> [Token] +lexer "" = [] +lexer (c:rest) + | c == ' ' = lexer rest + | isDigit c = (Token Number (read (isolateFloat (c:rest)) :: Float)) : lexer (afterFloat (c:rest)) + | c == '+' = (Token Add 0.0) : lexer rest + | c == '-' = (Token Sub 0.0) : lexer rest + | c == '*' = (Token Mul 0.0) : lexer rest + | c == '^' = (Token Exp 0.0) : lexer rest + | c == '=' = (Token Equal 0.0) : lexer rest + + where isolateFloat :: String -> String + isolateFloat "" = "" + isolateFloat (c:cs) + | isDigit c = c : isolateFloat cs + | c == '.' = c : isolateFloat cs + | otherwise = "" + + afterFloat :: String -> String + afterFloat "" = "" + afterFloat (c:cs) + | isDigit c = afterFloat cs + | c == '.' = afterFloat cs + | otherwise = (c:cs) + + +-- parse :: Lexing -> SyntaxTree +-- parse s = 2 +-- +-- +-- eval :: SyntaxTree -> Maybe [Float] +-- eval _ = 0.0 diff --git a/src/parser.hs b/src/parser.hs new file mode 100644 index 0000000..7929c26 --- /dev/null +++ b/src/parser.hs @@ -0,0 +1,78 @@ +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 -- cgit