Start parsing expressions
authorLuke Lau <luke_lau@icloud.com>
Sat, 18 May 2019 15:53:40 +0000 (16:53 +0100)
committerLuke Lau <luke_lau@icloud.com>
Sat, 18 May 2019 15:53:40 +0000 (16:53 +0100)
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 [new file with mode: 0644]

diff --git a/AST.hs b/AST.hs
new file mode 100644 (file)
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)