Parser: store and update only accept node and vars.

This commit is contained in:
Andor Penzes 2018-03-19 19:57:23 +01:00
parent edccfe9aea
commit 81322fe8cb
8 changed files with 60 additions and 64 deletions

View File

@ -1,10 +1,10 @@
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TupleSections, LambdaCase #-}
module ParseGrin (parseGrin, parseDef, parseExpr) where
import Data.Void
import Control.Applicative (empty)
import Control.Monad (void)
import Control.Monad (void, mzero)
import Text.Megaparsec
import qualified Text.Megaparsec.Char.Lexer as L
import Text.Megaparsec.Char as C
@ -75,11 +75,17 @@ ifThenElse i = do
]
simpleExp i = SReturn <$ kw "pure" <*> value <|>
SStore <$ kw "store" <*> value <|>
SStore <$ kw "store" <*> satisfyM nodeOrVar value <|>
SFetchI <$ kw "fetch" <*> var <*> optional (between (char '[') (char ']') $ fromIntegral <$> integer) <|>
SUpdate <$ kw "update" <*> var <*> value <|>
SUpdate <$ kw "update" <*> var <*> satisfyM nodeOrVar value <|>
SBlock <$ kw "do" <*> (L.indentGuard sc GT i >>= expr) <|>
SApp <$> primNameOrDefName <*> some simpleValue
where
nodeOrVar = \case
ConstTagNode _ _ -> True
VarTagNode _ _ -> True
Var _ -> True
_ -> False
primNameOrDefName = ('_':) <$ char '_' <*> var <|> var
@ -107,6 +113,14 @@ literal = (try $ LFloat . realToFrac <$> signedFloat) <|>
LInt64 . fromIntegral <$> signedInteger <|>
LBool <$> (True <$ kw "#True" <|> False <$ kw "#False")
satisfyM :: (a -> Bool) -> Parser a -> Parser a
satisfyM pred parser = do
x <- parser
if pred x
then pure x
else mzero
grinModule :: Parser Exp
grinModule = Program <$> some def <* sc <* eof

View File

@ -22,7 +22,7 @@ spec = do
(newVar "y'" int64_t) <>
(newVar "x'" int64_t)
let before = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
case v of
(Ffoo a) -> y' <- foo a
@ -36,7 +36,7 @@ spec = do
let teAfter = extend teBefore $
newVar "v'" int64_t
let after = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
v' <- do
case v of
@ -57,7 +57,7 @@ spec = do
(newVar "y'" int64_t) <>
(newVar "x'" int64_t)
let before = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
case v of
(Ffoo a) -> y' <- foo a
@ -68,7 +68,7 @@ spec = do
pure m0
|]
let after = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
case v of
(Ffoo a) -> y' <- foo a
@ -89,7 +89,7 @@ spec = do
(newVar "y1'" int64_t) <>
(newVar "x1'" int64_t)
let before = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
case v of
(Ffoo a) -> y' <- foo a
@ -110,7 +110,7 @@ spec = do
newVar "v'" int64_t <>
newVar "v1'" int64_t
let after = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
v' <- do
case v of
@ -142,7 +142,7 @@ spec = do
newVar "z1'" float_t <>
newVar "x1'" int64_t
let before = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
case v of
(Ffoo a) -> y' <- foo a
@ -162,7 +162,7 @@ spec = do
let teAfter = extend teBefore $
newVar "v'" int64_t
let after = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
v' <- do
case v of
@ -192,7 +192,7 @@ spec = do
newVar "z1'" int64_t <>
newVar "x1'" int64_t
let before = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
case v of
(Ffoo a) -> y' <- foo a
@ -212,7 +212,7 @@ spec = do
let teAfter = extend teBefore $
newVar "v1'" int64_t
let after = [expr|
m0 <- store 3
m0 <- store (CNone)
u <- do
case v of
(Ffoo a) -> y' <- foo a

View File

@ -15,24 +15,6 @@ import Assertions
spec :: Spec
spec = do
describe "constant folding" $ do
it "inside bind" $ do
let before =
[expr|
x <- store a
y <- store b
u <- pure 5
store u
pure u
|]
let after =
[expr|
x <- store a
y <- store b
store 5
pure 5
|]
constantFolding before `sameAs` after
it "last bind" $ do
let before =
[expr|
@ -52,13 +34,13 @@ spec = do
it "unused variable" $ do
let before =
[expr|
x <- store 3
x <- store (CNone)
u <- pure 4
pure 5
|]
let after =
[expr|
x <- store 3
x <- store (CNone)
pure 5
|]
constantFolding before `sameAs` after

View File

@ -33,7 +33,7 @@ spec = do
it "Example from Figure 4.11" $ do
let before =
[expr|
l1 <- store 3
l1 <- store (CNone)
case (t a1 a2) of
CNil -> pure 3
(CCons x xs) -> store x
@ -42,7 +42,7 @@ spec = do
|]
let after =
[expr|
l1 <- store 3
l1 <- store (CNone)
case t of
CNil -> pure 3
CCons -> store a1

View File

@ -18,26 +18,26 @@ spec = do
it "Example from Figure 4.17" $ do
let before = [expr|
l1 <- store 0
l1 <- store (CNone)
p <- store (CCons a b)
u' <- foo 1 3
q <- store (CInt u')
x <- pure (CCons q p)
l2 <- store 1
l2 <- store (CNone)
pure 2
|]
let after = [expr|
l1 <- store 0
l1 <- store (CNone)
t1 <- pure CCons
p <- store (t1 a b)
x' <- store 1
y' <- store 3
x' <- pure 1
y' <- pure 3
u' <- foo x' y'
t2 <- pure CInt
q <- store (t2 u')
t3 <- pure CCons
x <- pure (t3 q p)
l2 <- store 1
l2 <- store (CNone)
pure 2
|]
registerIntroduction 0 before `sameAs` after

View File

@ -15,31 +15,31 @@ spec :: Spec
spec = do
it "Example from Figure 4.16" $ do
let before = [expr|
l0 <- store 0
l0 <- store (CNone)
p <- store (CCons 1 2)
t <- fetch p[0]
a1 <- fetch p[1]
a2 <- fetch p[2]
l1 <- store 1
l1 <- store (CNone)
case t of
CNil -> l3 <- store 2
CNil -> l3 <- store (CNone)
unit 2
CCons -> l4 <- store 3
CCons -> l4 <- store (CNone)
l5 <- store a1
l6 <- store a2
pure 3
|]
let after = [expr|
l0 <- store 0
l0 <- store (CNone)
p <- store (CCons 1 2)
t <- fetch p[0]
l1 <- store 1
l1 <- store (CNone)
case t of
CNil -> l3 <- store 2
CNil -> l3 <- store (CNone)
pure 2
CCons -> a1a1 <- fetch p[1]
a2a1 <- fetch p[2]
l4 <- store 3
l4 <- store (CNone)
l5 <- store a1a1
l6 <- store a2a1
pure 3

View File

@ -17,33 +17,33 @@ spec :: Spec
spec = do
it "Example from Figure 4.13" $ do
let before = [expr|
l1 <- store 3
l1 <- store (CNone)
(t a1 a2 a3) <- fetch p
l2 <- store 4
l2 <- store (CNone)
pure 5
|]
let after = [expr|
l1 <- store 3
l1 <- store (CNone)
t <- fetch p[0]
a1 <- fetch p[1]
a2 <- fetch p[2]
a3 <- fetch p[3]
l2 <- store 4
l2 <- store (CNone)
pure 5
|]
splitFetch before `sameAs` after
it "Example from Figure 4.14" $ do
let before = [expr|
l1 <- store 3
l1 <- store (CNone)
(CInt x) <- fetch p
l2 <- store 4
l2 <- store (CNone)
pure 5
|]
let after = [expr|
l1 <- store 3
l1 <- store (CNone)
x <- fetch p[1]
l2 <- store 4
l2 <- store (CNone)
pure 5
|]
splitFetch before `sameAs` after
@ -51,17 +51,17 @@ spec = do
it "Example from Figure 4.15" $ do
-- TODO Include hpt-result with t \elem { CPair }
let before = [expr|
l1 <- store 3
l1 <- store (CNone)
(t a1 a2) <- fetch p
l2 <- store 4
l2 <- store (CNone)
pure 5
|]
let after = [expr|
l1 <- store 3
l1 <- store (CNone)
t <- pure CPair
a1 <- fetch p[1]
a2 <- fetch p[2]
l2 <- store 4
l2 <- store (CNone)
pure 5
|]
splitFetch before `sameAs` after

View File

@ -35,13 +35,13 @@ spec = do
mempty
let before = [expr|
l0 <- store 0
l0 <- store (CNone)
v <- pure (Cq p1 p2)
l1 <- store v
pure 1
|]
let after = [expr|
l0 <- store 0
l0 <- store (CNone)
(v0 v1 v2) <- pure (Cq p1 p2)
l1 <- store (v0 v1 v2)
pure 1