From af50529dc127f04204bcdf5bc6c27de8b5e75c61 Mon Sep 17 00:00:00 2001 From: sudoer777 Date: Fri, 8 Sep 2023 00:53:11 -0500 Subject: [PATCH] Add solving expressions --- README.md | 1 + app/Eval/Expression.hs | 13 +++++++++++++ app/Main.hs | 19 +++++++++++++++---- app/Objects/Expression.hs | 19 +++++++++++++++++++ app/Parser/{Equation.hs => Expression.hs} | 23 +++++++++-------------- 5 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 app/Eval/Expression.hs create mode 100644 app/Objects/Expression.hs rename app/Parser/{Equation.hs => Expression.hs} (65%) diff --git a/README.md b/README.md index 55dc53d..486427a 100644 --- a/README.md +++ b/README.md @@ -27,3 +27,4 @@ Main repo: https://git.sudoer.ch/me/really-bad-compiler-in-haskell - IDE: VSCodium - Git platform: Forgejo - AI: Phind +- Search: Kagi, Stack Overflow diff --git a/app/Eval/Expression.hs b/app/Eval/Expression.hs new file mode 100644 index 0000000..325afdf --- /dev/null +++ b/app/Eval/Expression.hs @@ -0,0 +1,13 @@ +module Eval.Expression (evalExpr) where + +import Objects.Expression + +eval :: Expr -> Int +eval (Lit x) = x +eval (Add x y) = eval x + eval y +eval (Sub x y) = eval x - eval y +eval (Mul x y) = eval x * eval y +eval (Div x y) = eval x `div` eval y + +evalExpr :: Expr -> Int +evalExpr = eval \ No newline at end of file diff --git a/app/Main.hs b/app/Main.hs index 7ae4b5f..ad095b4 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -1,10 +1,21 @@ module Main (main) where -import Parser.Equation +import Data.Either +import Eval.Expression +import Objects.Expression +import Parser.Expression import System.Environment import Text.Megaparsec --- main :: IO () +parseResult :: ParseResult +parseResult = parseExpr "2+3*4" + +getRight :: ParseResult -> Expr +getRight (Right r) = r + +expr = getRight parseResult + +result = evalExpr expr + main = do - input <- fmap head getArgs - parseTest equationParser input \ No newline at end of file + print result \ No newline at end of file diff --git a/app/Objects/Expression.hs b/app/Objects/Expression.hs new file mode 100644 index 0000000..932df82 --- /dev/null +++ b/app/Objects/Expression.hs @@ -0,0 +1,19 @@ +module Objects.Expression + ( Expr + ( Lit, + Add, + Sub, + Mul, + Div + ), + -- solve, + ) +where + +data Expr + = Lit Int + | Add Expr Expr + | Sub Expr Expr + | Mul Expr Expr + | Div Expr Expr + deriving (Show) \ No newline at end of file diff --git a/app/Parser/Equation.hs b/app/Parser/Expression.hs similarity index 65% rename from app/Parser/Equation.hs rename to app/Parser/Expression.hs index 4f39b1c..0d323ff 100644 --- a/app/Parser/Equation.hs +++ b/app/Parser/Expression.hs @@ -1,21 +1,14 @@ -module Parser.Equation (equationParser) where +module Parser.Expression (parseExpr, ParseResult) where import Control.Monad.Combinators.Expr import Data.Void (Void) -import Text.Megaparsec +import Objects.Expression +import Text.Megaparsec as MP import Text.Megaparsec.Char as C import Text.Megaparsec.Char.Lexer as L type Parser = Parsec Void String -data Expr - = Int Int - | Add Expr Expr - | Sub Expr Expr - | Mul Expr Expr - | Div Expr Expr - deriving (Show) - lexemeParser :: Parser a -> Parser a lexemeParser = L.lexeme C.space @@ -26,7 +19,7 @@ intParser :: Parser Int intParser = lexemeParser L.decimal term :: Parser Expr -term = Int <$> intParser +term = Lit <$> intParser table :: [[Operator Parser Expr]] table = @@ -43,7 +36,9 @@ binaryOp name f = InfixL (f <$ symbolParser name) expr :: Parser Expr expr = makeExprParser term table -parseExpr :: String -> Either (ParseErrorBundle String Void) Expr -parseExpr = parse (C.space *> expr <* eof) "" +type ParseResult = Either (ParseErrorBundle String Void) Expr -equationParser = expr \ No newline at end of file +parseExpr :: String -> ParseResult +parseExpr = MP.parse (C.space *> expr <* eof) "" + +-- parseE = parseExpr \ No newline at end of file