From 98897ccc44795260735bafc5124e0e14052247f2 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Sun, 10 Mar 2019 12:57:20 +0000 Subject: [PATCH] Extend AST for functions, calls and variables --- AST.hs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/AST.hs b/AST.hs index 424cfbe..2bea002 100644 --- a/AST.hs +++ b/AST.hs @@ -1,21 +1,51 @@ module AST where +import Data.Char import Text.Read import Text.ParserCombinators.ReadP hiding ((+++), choice) -data BinOpType = Add | Sub | Mul +data AST = Function String [String] Expr + | Eval Expr deriving Show data Expr = Num Float | BinOp BinOpType Expr Expr + | Var String + | Call String [Expr] + deriving Show +data BinOpType = Add | Sub | Mul deriving Show +instance Read AST where + readPrec = parseFunction +++ (Eval <$> readPrec) + where parseFunction = lift $ do + skipSpaces + string "def" + skipSpaces + name <- munch1 isAlpha + params <- between (char '(') (char ')') $ + sepBy (munch1 isAlpha) skipSpaces + skipSpaces + body <- between (char '{') (char '}') $ + readS_to_P reads + skipSpaces + return (Function name params body) + instance Read Expr where readPrec = choice [ parseNum + , parseVar + , parseCall , parseBinOp '+' Add , parseBinOp '-' Sub , parseBinOp '*' Mul ] where parseNum = Num <$> readPrec + parseVar = Var <$> lift (munch1 isAlpha) + parseCall = do + func <- lift (munch1 isAlpha) + params <- lift $ between (char '(') (char ')') $ + sepBy (readS_to_P reads) + (skipSpaces >> char ',' >> skipSpaces) + return (Call func params) parseBinOp c typ = step $ do a <- prec 11 readPrec lift $ do -- 2.30.2