From 8c8f6155f1b05230c271059c52a503211aec872b Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 16 Mar 2020 14:15:42 +0100 Subject: file Renaming, basic REPL --- src/Assignment.hs | 11 +++++ src/Expr.hs | 98 +++++++++++++++++++++++++++++++++++++++ src/Polynomial.hs | 87 +++++++++++++++++++++++++++++++++++ src/Statement.hs | 14 ++++++ src/assignment.hs | 11 ----- src/atom.hs | 49 -------------------- src/expr.hs | 43 ----------------- src/main.hs | 25 ++++++++++ src/manifest | 96 -------------------------------------- src/parser/Assignment.hs | 15 ++++++ src/parser/Core.hs | 117 +++++++++++++++++++++++++++++++++++++++++++++++ src/parser/Expr.hs | 42 +++++++++++++++++ src/parser/Statement.hs | 12 +++++ src/parser/assignment.hs | 15 ------ src/parser/core.hs | 116 ---------------------------------------------- src/parser/expr.hs | 45 ------------------ src/parser/statement.hs | 12 ----- src/polynomial.hs | 95 -------------------------------------- src/statement.hs | 14 ------ 19 files changed, 421 insertions(+), 496 deletions(-) create mode 100644 src/Assignment.hs create mode 100644 src/Expr.hs create mode 100644 src/Polynomial.hs create mode 100644 src/Statement.hs delete mode 100644 src/assignment.hs delete mode 100644 src/atom.hs delete mode 100644 src/expr.hs create mode 100644 src/main.hs delete mode 100644 src/manifest create mode 100644 src/parser/Assignment.hs create mode 100644 src/parser/Core.hs create mode 100644 src/parser/Expr.hs create mode 100644 src/parser/Statement.hs delete mode 100644 src/parser/assignment.hs delete mode 100644 src/parser/core.hs delete mode 100644 src/parser/expr.hs delete mode 100644 src/parser/statement.hs delete mode 100644 src/polynomial.hs delete mode 100644 src/statement.hs (limited to 'src') diff --git a/src/Assignment.hs b/src/Assignment.hs new file mode 100644 index 0000000..c086280 --- /dev/null +++ b/src/Assignment.hs @@ -0,0 +1,11 @@ +module Assignment where + +import qualified Expr as E + +data Assignment + = Variable String E.Expr + | Function String String E.Expr + +instance Show Assignment where + show (Variable name e) = name ++ " = " ++ show e + show (Function name arg e) = name ++ "(" ++ arg ++ ") = " ++ show e diff --git a/src/Expr.hs b/src/Expr.hs new file mode 100644 index 0000000..e3d8aef --- /dev/null +++ b/src/Expr.hs @@ -0,0 +1,98 @@ +module Expr where + +import Data.List + + +data Atom + = Rational Float + | Imaginary Float + | Matrix [[Expr]] + +data Expr + = EAtom Atom + | Add Expr Expr + | Sub Expr Expr + | Mul Expr Expr + | Div Expr Expr + | Mod Expr Expr + | Exp Expr Expr + | Dot Expr Expr + | Variable String + | Function String Expr + +eval :: Expr -> Maybe Atom +eval (EAtom a) = Just a +eval (Add e1 e2) = evalInfix e1 e2 (+?) +eval (Sub e1 e2) = evalInfix e1 e2 (-?) +eval (Mul e1 e2) = evalInfix e1 e2 (*?) +eval (Div e1 e2) = evalInfix e1 e2 (/?) +eval (Mod e1 e2) = evalInfix e1 e2 (%?) +eval (Exp e1 e2) = evalInfix e1 e2 (^?) +eval (Dot e1 e2) = evalInfix e1 e2 (**?) +eval _ = Nothing + +evalInfix :: Expr -> Expr -> (Atom -> Atom -> Maybe Atom) -> Maybe Atom +evalInfix e1 e2 f = do a <- eval e1 + b <- eval e2 + f a b + +infixl 6 +? +(+?) :: Atom -> Atom -> Maybe Atom +(Rational a) +? (Rational b) = Just $ Rational (a + b) +(Imaginary a) +? (Imaginary b) = Just $ Imaginary (a + b) +_ +? _ = Nothing + +infixl 6 -? +(-?) :: Atom -> Atom -> Maybe Atom +(Rational a) -? (Rational b) = Just $ Rational (a - b) +(Imaginary a) -? (Imaginary b) = Just $ Imaginary (a - b) +_ -? _ = Nothing + +infixl 7 *? +(*?) :: Atom -> Atom -> Maybe Atom +(Rational a) *? (Rational b) = Just $ Rational (a * b) +(Rational a) *? (Imaginary b) = Just $ Imaginary (a * b) +(Imaginary a) *? (Imaginary b) = (Imaginary (a * b)) ^? Rational 2 +_ *? _ = Nothing + +infixl 7 /? +(/?) :: Atom -> Atom -> Maybe Atom +_ /? (Rational 0) = Nothing +(Rational a) /? (Rational b) = Just $ Rational (a / b) +_ /? _ = Nothing + +infixl 7 %? +(%?) :: Atom -> Atom -> Maybe Atom +_ %? _ = Nothing + +infixr 8 ^? +(^?) :: Atom -> Atom -> Maybe Atom +(Rational a) ^? (Rational b) = Just $ Rational (a ** b) +(Imaginary a) ^? (Rational 0) = Just $ Rational a +(Imaginary a) ^? (Rational 1) = Just $ Imaginary a +(Imaginary a) ^? (Rational 2) = Just $ Rational (-a) +(Imaginary a) ^? (Rational 3) = Just $ Imaginary (-a) +(Imaginary a) ^? (Rational b) = Imaginary a ^? (Rational (b - 4)) +_ ^? _ = Nothing + +infixr 8 **? +(**?) :: Atom -> Atom -> Maybe Atom +_ **? _ = Nothing + +instance Show Expr where + show (EAtom a) = show a + show (Add e1 e2) = show e1 ++ " + " ++ show e2 + show (Sub e1 e2) = show e1 ++ " - " ++ show e2 + show (Mul e1 e2) = show e1 ++ " * " ++ show e2 + show (Div e1 e2) = show e1 ++ " / " ++ show e2 + show (Mod e1 e2) = show e1 ++ " % " ++ show e2 + show (Exp e1 e2) = show e1 ++ " ^ " ++ show e2 + show (Dot e1 e2) = show e1 ++ " ** " ++ show e2 + show (Variable name) = name + show (Function name e) = name ++ "(" ++ show e ++ ")" + +instance Show Atom where + show (Rational r) = show r + show (Imaginary i) = show i ++ "i" + show (Matrix m) = intercalate "\n" (map showRow m) + where showRow r = "[ " ++ intercalate ", " (map show r) ++ " ]" diff --git a/src/Polynomial.hs b/src/Polynomial.hs new file mode 100644 index 0000000..cd0da4f --- /dev/null +++ b/src/Polynomial.hs @@ -0,0 +1,87 @@ +module Polynomial where + +-- import Data.List +-- +-- +-- data Equation = Equation { left :: Polynomial, right :: Polynomial } +-- type Polynomial = [Term] +-- data Term = Term { coefficient :: Float, exponent :: Int } +-- +-- instance Eq Term where +-- (Term _ e1) == (Term _ e2) = e1 == e2 +-- +-- instance Ord Term where +-- compare (Term _ e1) (Term _ e2) = compare e1 e2 +-- +-- instance Show Term where +-- show (Term 0 e) = "" +-- show (Term c 0) = show (round c) +-- show (Term c e) = show (round c) ++ " * X^" ++ show e +-- +-- instance Show Equation where +-- show (Equation l r) = showPolynomial (filterNull l) +-- ++ " = " +-- ++ showPolynomial (filterNull r) +-- where showPolynomial [] = "0" +-- showPolynomial p = dropWhile (`elem` " +") $ foldl f "" (map show p) +-- where f s "" = s +-- f s (c:cs) +-- | c == '-' = s ++ " - " ++ cs +-- | otherwise = s ++ " + " ++ (c:cs) +-- +-- +-- filterNull :: Polynomial -> Polynomial +-- filterNull = filter (\t -> coefficient t /= 0) +-- +-- equationMap :: (Polynomial -> Polynomial) -> Equation -> Equation +-- equationMap f (Equation l r) = Equation (f l) (f r) +-- +-- degree :: Polynomial -> Int +-- degree [] = 0 +-- degree p = Equation.exponent (maximum p) +-- +-- reduce :: Equation -> Equation +-- reduce equ = Equation (merge (left stdForm) (right stdForm)) [] +-- where stdForm = equationMap (\a -> (reducePolynomial $ sort a)) equ +-- merge [] rs = rs +-- merge ls [] = ls +-- merge (l:ls) (r:rs) +-- | l == r = (subTerm l r) : merge ls rs +-- | l < r = l : merge ls (r:rs) +-- | r < l = r : merge (l:ls) rs +-- where subTerm (Term c1 e) (Term c2 _) = Term (c1 - c2) e +-- reducePolynomial [] = [] +-- reducePolynomial [t] = [t] +-- reducePolynomial (t1:t2:ts) +-- | t1 == t2 = (addTerm t1 t2) : reducePolynomial ts +-- | otherwise = t1 : reducePolynomial (t2:ts) +-- where addTerm (Term c1 e) (Term c2 _) = Term (c1 + c2) e +-- +-- solveDegree2 :: Float -> Float -> Float -> [Float] +-- solveDegree2 a b c +-- | phi < 0 = [] +-- | phi == 0 = [(-b) / (2.0 * a)] +-- | phi > 0 = [ (-b + mySqrt phi) / (2.0 * a) -- not alowed +-- , (-b - mySqrt phi) / (2.0 * a) +-- ] +-- where phi = b * b - 4.0 * a * c +-- +-- solveDegree1 :: Float -> Float -> Float +-- solveDegree1 b c = -c / b +-- +-- solve :: Polynomial -> [Float] +-- solve [t0] = [] +-- solve [t0, t1] = [solveDegree1 (coefficient t1) (coefficient t0)] +-- solve [t0, t1, t2] = solveDegree2 (coefficient t2) (coefficient t1) (coefficient t0) +-- solve _ = undefined +-- +-- mySqrt :: Float -> Float +-- mySqrt n +-- | n < 0 = undefined +-- | otherwise = mySqrt' (n / 2) +-- where mySqrt' x = if abs (x * x - n) < 0.01 +-- then x +-- else mySqrt' xn +-- where xn = b - (a * a) / (2 * b) +-- where a = (n - x * x) / (2 * x) +-- b = x + a diff --git a/src/Statement.hs b/src/Statement.hs new file mode 100644 index 0000000..75dfdb4 --- /dev/null +++ b/src/Statement.hs @@ -0,0 +1,14 @@ +module Statement where + +import Assignment +import Expr + + +data Statement + = SAssignment Assignment + | SExpr Expr + +instance Show Statement where + show (SAssignment a) = show a + show (SExpr e) = show e + diff --git a/src/assignment.hs b/src/assignment.hs deleted file mode 100644 index c086280..0000000 --- a/src/assignment.hs +++ /dev/null @@ -1,11 +0,0 @@ -module Assignment where - -import qualified Expr as E - -data Assignment - = Variable String E.Expr - | Function String String E.Expr - -instance Show Assignment where - show (Variable name e) = name ++ " = " ++ show e - show (Function name arg e) = name ++ "(" ++ arg ++ ") = " ++ show e diff --git a/src/atom.hs b/src/atom.hs deleted file mode 100644 index 5f1b42c..0000000 --- a/src/atom.hs +++ /dev/null @@ -1,49 +0,0 @@ -module Atom where - - -data Atom - = ARational Float - | AImaginary Float - -infixl 6 +? -(+?) :: Atom -> Atom -> Maybe Atom -(ARational a) +? (ARational b) = Just $ ARational (a + b) -(AImaginary a) +? (AImaginary b) = Just $ AImaginary (a + b) -_ +? _ = Nothing - -infixl 6 -? -(-?) :: Atom -> Atom -> Maybe Atom -(ARational a) -? (ARational b) = Just $ ARational (a - b) -(AImaginary a) -? (AImaginary b) = Just $ AImaginary (a - b) -_ -? _ = Nothing - -infixl 7 *? -(*?) :: Atom -> Atom -> Maybe Atom -(ARational a) *? (ARational b) = Just $ ARational (a * b) -(ARational a) *? (AImaginary b) = Just $ AImaginary (a * b) -(AImaginary a) *? (AImaginary b) = (AImaginary (a * b)) ^? ARational 2 -_ *? _ = Nothing - -infixl 7 /? -(/?) :: Atom -> Atom -> Maybe Atom -_ /? (ARational 0) = Nothing -(ARational a) /? (ARational b) = Just $ ARational (a / b) -_ /? _ = Nothing - -infixl 7 %? -(%?) :: Atom -> Atom -> Maybe Atom -_ %? _ = Nothing - -infixr 8 ^? -(^?) :: Atom -> Atom -> Maybe Atom -(ARational a) ^? (ARational b) = Just $ ARational (a ** b) -(AImaginary a) ^? (ARational 0) = Just $ ARational a -(AImaginary a) ^? (ARational 1) = Just $ AImaginary a -(AImaginary a) ^? (ARational 2) = Just $ ARational (-a) -(AImaginary a) ^? (ARational 3) = Just $ AImaginary (-a) -(AImaginary a) ^? (ARational b) = AImaginary a ^? (ARational (b - 4)) -_ ^? _ = Nothing - -instance Show Atom where - show (ARational r) = show r - show (AImaginary i) = show i ++ "i" diff --git a/src/expr.hs b/src/expr.hs deleted file mode 100644 index e6f1f25..0000000 --- a/src/expr.hs +++ /dev/null @@ -1,43 +0,0 @@ -module Expr where - -import Atom - - -data Expr - = EAtom Atom - | Add Expr Expr - | Sub Expr Expr - | Mul Expr Expr - | Div Expr Expr - | Mod Expr Expr - | Exp Expr Expr - | Variable String - | Function String Expr - - - -eval :: Expr -> Maybe Atom -eval (EAtom a) = Just a -eval (Add e1 e2) = evalInfix e1 e2 (+?) -eval (Sub e1 e2) = evalInfix e1 e2 (-?) -eval (Mul e1 e2) = evalInfix e1 e2 (*?) -eval (Div e1 e2) = evalInfix e1 e2 (/?) -eval (Mod e1 e2) = evalInfix e1 e2 (%?) -eval (Exp e1 e2) = evalInfix e1 e2 (^?) -eval _ = Nothing - -evalInfix :: Expr -> Expr -> (Atom -> Atom -> Maybe Atom) -> Maybe Atom -evalInfix e1 e2 f = do a <- eval e1 - b <- eval e2 - f a b - -instance Show Expr where - show (EAtom a) = show a - show (Add e1 e2) = show e1 ++ " + " ++ show e2 - show (Sub e1 e2) = show e1 ++ " - " ++ show e2 - show (Mul e1 e2) = show e1 ++ " * " ++ show e2 - show (Div e1 e2) = show e1 ++ " / " ++ show e2 - show (Mod e1 e2) = show e1 ++ " % " ++ show e2 - show (Exp e1 e2) = show e1 ++ " ^ " ++ show e2 - show (Variable name) = name - show (Function name e) = name ++ "(" ++ show e ++ ")" diff --git a/src/main.hs b/src/main.hs new file mode 100644 index 0000000..34a190a --- /dev/null +++ b/src/main.hs @@ -0,0 +1,25 @@ +import System.IO +import Statement +import Parser.Statement +import Parser.Core + + +main = do + line <- prompt + loop line + +loop :: String -> IO () +loop "exit" = return () +loop line = do s <- parseIO line + putStrLn $ show s + main + +prompt :: IO String +prompt = do putStr "> " + hFlush stdout + getLine + +parseIO :: String -> IO Statement +parseIO input = case parseStrict statementP input of + Nothing -> fail "Couldn't parse input" + Just s -> return s diff --git a/src/manifest b/src/manifest deleted file mode 100644 index 7216fa7..0000000 --- a/src/manifest +++ /dev/null @@ -1,96 +0,0 @@ -Data struct: - - expression - - matrix - - complex - - - polynomial - -State Data struct: - - function - - variable - - - -Instruction/line: - if is '?' evaluate label else declare label. - -instruction ::=