From 51aeade75d5289fff417414b04bae5be0862fd8f Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Sun, 10 Mar 2019 12:37:36 +0000 Subject: [PATCH] Add support for more binary ops --- AST.hs | 18 ++++++++++++------ Main.hs | 8 ++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/AST.hs b/AST.hs index 6528215..424cfbe 100644 --- a/AST.hs +++ b/AST.hs @@ -1,20 +1,26 @@ module AST where import Text.Read -import Text.ParserCombinators.ReadP hiding ((+++)) +import Text.ParserCombinators.ReadP hiding ((+++), choice) +data BinOpType = Add | Sub | Mul + deriving Show data Expr = Num Float - | Add Expr Expr + | BinOp BinOpType Expr Expr deriving Show instance Read Expr where - readPrec = parseNum +++ parseAdd + readPrec = choice [ parseNum + , parseBinOp '+' Add + , parseBinOp '-' Sub + , parseBinOp '*' Mul + ] where parseNum = Num <$> readPrec - parseAdd = step $ do + parseBinOp c typ = step $ do a <- prec 11 readPrec lift $ do skipSpaces - char '+' + char c skipSpaces b <- readPrec - return (Add a b) + return (BinOp typ a b) diff --git a/Main.hs b/Main.hs index 2d838d3..8f4610a 100644 --- a/Main.hs +++ b/Main.hs @@ -35,7 +35,11 @@ main = do build :: AST.Expr -> IRBuilderT ModuleBuilder Operand build (AST.Num a) = pure $ ConstantOperand (Float (Single a)) -build (AST.Add a b) = do +build (AST.BinOp op a b) = do va <- build a vb <- build b - fadd va vb + let instr = case op of + AST.Add -> fadd + AST.Sub -> fsub + AST.Mul -> fmul + instr va vb -- 2.30.2