revamped expressions
This commit is contained in:
parent
6dda64b0cf
commit
81feb1aee3
@ -16,26 +16,54 @@
|
|||||||
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
|
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
|
||||||
|
|
||||||
module SimpleParser
|
module SimpleParser
|
||||||
( eval, Expr (..) )
|
( eval, Expr (..), BinaryOp (..), UnaryOp (..) ) -- literalParser
|
||||||
where
|
where
|
||||||
import Text.Megaparsec
|
import Text.Megaparsec
|
||||||
import Data.Void (Void)
|
import Data.Void (Void)
|
||||||
|
import Text.Megaparsec.Byte.Lexer (decimal)
|
||||||
|
import Control.Concurrent (yield)
|
||||||
|
|
||||||
type Parser = Parsec Void String
|
type Parser = Parsec Void String
|
||||||
|
|
||||||
|
data BinaryOp = Add | Subtract | Multiply | Divide
|
||||||
|
|
||||||
|
data UnaryOp = Negate
|
||||||
|
|
||||||
data Expr =
|
data Expr =
|
||||||
Add Expr Expr |
|
BinaryExpr BinaryOp Expr Expr |
|
||||||
Subtract Expr Expr |
|
UnaryExpr UnaryOp Expr |
|
||||||
Multiply Expr Expr |
|
|
||||||
Divide Expr Expr |
|
|
||||||
Negate Expr |
|
|
||||||
Literal Int
|
Literal Int
|
||||||
|
|
||||||
|
lookUpBinaryOp :: BinaryOp -> Int -> Int -> Int
|
||||||
|
lookUpBinaryOp Add = (+)
|
||||||
|
lookUpBinaryOp Subtract = (-)
|
||||||
|
lookUpBinaryOp Multiply = (*)
|
||||||
|
lookUpBinaryOp Divide = div
|
||||||
|
|
||||||
|
lookUpUnaryOp :: UnaryOp -> Int -> Int
|
||||||
|
lookUpUnaryOp Negate x = -x
|
||||||
|
|
||||||
eval :: Expr -> Int
|
eval :: Expr -> Int
|
||||||
eval (Literal n) = n
|
eval (Literal n) = n
|
||||||
eval (Add a b) = (eval a) + (eval b)
|
eval (BinaryExpr binOp a b) = lookUpBinaryOp binOp (eval a) (eval b)
|
||||||
eval (Subtract a b) = (eval a) - (eval b)
|
eval (UnaryExpr unaryOp a) = lookUpUnaryOp unaryOp (eval a)
|
||||||
eval (Multiply a b) = (eval a) * (eval b)
|
|
||||||
eval (Divide a b) = (eval a) `div` (eval b)
|
|
||||||
eval (Negate a) = -(eval a)
|
|
||||||
|
|
||||||
|
|
||||||
|
-- parseExpr :: Parser Expr
|
||||||
|
-- parseExpr = choice [
|
||||||
|
-- literalParser,
|
||||||
|
-- expressionParser
|
||||||
|
-- -- bracketedExpParser,
|
||||||
|
-- -- negatedExp
|
||||||
|
-- ]
|
||||||
|
|
||||||
|
-- literalParser :: Parser Expr
|
||||||
|
-- literalParser = Literal <$> decimal
|
||||||
|
|
||||||
|
-- expressionParser :: Parser Expr
|
||||||
|
-- expressionParser = do
|
||||||
|
-- parseExpr
|
||||||
|
-- parseOp
|
||||||
|
-- parseExpr
|
||||||
|
|
||||||
|
-- parseOp :: Parser Expr
|
||||||
@ -18,13 +18,16 @@ spec :: Spec
|
|||||||
spec = do
|
spec = do
|
||||||
describe "evaluate expressions" $ do
|
describe "evaluate expressions" $ do
|
||||||
it "arithmetic on literals" $ do
|
it "arithmetic on literals" $ do
|
||||||
eval (Add (Literal 2) (Literal 3) ) `shouldBe` 5
|
eval (BinaryExpr Add (Literal 2) (Literal 3) ) `shouldBe` 5
|
||||||
eval (Subtract (Literal 2) (Literal 3) ) `shouldBe` -1
|
eval (BinaryExpr Subtract (Literal 2) (Literal 3) ) `shouldBe` -1
|
||||||
eval (Multiply (Literal 2) (Literal 3) ) `shouldBe` 6
|
eval (BinaryExpr Multiply (Literal 2) (Literal 3) ) `shouldBe` 6
|
||||||
eval (Divide (Literal 7) (Literal 3) ) `shouldBe` 2
|
eval (BinaryExpr Divide (Literal 7) (Literal 3) ) `shouldBe` 2
|
||||||
eval (Negate (Literal 7) ) `shouldBe` -7
|
eval (UnaryExpr Negate (Literal 7) ) `shouldBe` -7
|
||||||
it "more complex arithmetic on literals" $ do
|
it "more complex arithmetic on literals" $ do
|
||||||
eval (Add (Negate (Literal 1)) (Divide (Literal 7) (Literal 3))) `shouldBe` 1
|
eval (BinaryExpr Add
|
||||||
|
(UnaryExpr Negate (Literal 1))
|
||||||
|
(BinaryExpr Divide (Literal 7) (Literal 3))
|
||||||
|
) `shouldBe` 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
29
untitled/.gitignore
vendored
Normal file
29
untitled/.gitignore
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
### IntelliJ IDEA ###
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Mac OS ###
|
||||||
|
.DS_Store
|
||||||
Loading…
x
Reference in New Issue
Block a user