From ae80d076cba678169dbddac4a53edd2cb1e091fb Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Sat, 18 May 2019 16:53:40 +0100 Subject: [PATCH] Start parsing expressions This starts off with defining not the AST, but just what expressions we want to be able to parse. So far we just handle numbers, and addition involving 2 numbers. We use the built-in ReadPrec parser combinators, which allow us to recursively parse the binary op of addition, and even allow us to reuse the Read instance on Int! prec and step are needed since without them, parseAdd will just get stuck repeatedly trying to parse the left expression (a). --- AST.hs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 AST.hs diff --git a/AST.hs b/AST.hs new file mode 100644 index 0000000..5628e7c --- /dev/null +++ b/AST.hs @@ -0,0 +1,23 @@ +module AST where + +import Text.Read +import Text.ParserCombinators.ReadP hiding ((+++)) + +data Expr = Num Float + | Add Expr Expr + deriving Show + +instance Read Expr where + readPrec = parseNum +++ parseAdd + where parseNum = Num <$> readPrec + -- use 'prec 1' and 'step' so that parsing 'a' + -- can only go one step deep, to prevent ininfite + -- recursion + parseAdd = prec 1 $ do + a <- step readPrec + lift $ do + skipSpaces + char '+' + skipSpaces + b <- readPrec + return (Add a b) -- 2.30.2