summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-03-19 20:38:16 -0400
committerJoe Crayne <joe@jerkface.net>2019-03-19 20:38:16 -0400
commit2226c41531a68797901b21407ea27046be542757 (patch)
tree3db31e132d6815878d8cd176df0a1fa609e010c4
parentdd869e9bb65298a69a7a55bcb77990cebce210a7 (diff)
expression-statements and increment statement.
-rw-r--r--monkeypatch.hs33
1 files changed, 26 insertions, 7 deletions
diff --git a/monkeypatch.hs b/monkeypatch.hs
index 54b9f47..eefc525 100644
--- a/monkeypatch.hs
+++ b/monkeypatch.hs
@@ -285,6 +285,14 @@ grokExpression (C.CCall (CVar fn _) exps _) = do
285 , compIntro = Map.empty 285 , compIntro = Map.empty
286 , comp = hsvar hv 286 , comp = hsvar hv
287 } 287 }
288grokExpression (CStatExpr (CCompound idents xs _) _) = do
289 let (y,ys) = splitAt 1 (reverse xs)
290 y' <- case y of
291 [CBlockStmt (CExpr mexp ni)] -> Just $ CBlockStmt (CReturn mexp ni)
292 _ -> Just (head y) -- Nothing FIXME
293 gs <- mapM grokStatement (reverse $ y' : ys)
294 let s = foldr applyComputation (Computation Map.empty Map.empty hsopUnit) gs
295 return $ (,) [] $ fmap (\xp -> Paren () xp) s
288grokExpression _ = Nothing 296grokExpression _ = Nothing
289 297
290 298
@@ -374,13 +382,24 @@ grokStatement (CBlockStmt (CIf exp (CCompound [] stmts _) Nothing _)) = do
374 , compIntro = compIntro s 382 , compIntro = compIntro s
375 , comp = Lambda () [hspvar k] $ If () (comp x) (comp s) (hsvar k) 383 , comp = Lambda () [hspvar k] $ If () (comp x) (comp s) (hsvar k)
376 } 384 }
377-- TODO CStatExpr 385grokStatement (CBlockStmt (CExpr (Just (CUnary CPostIncOp (CMember (CVar cv0 _) fld True _) _)) _)) = do
386 let k1 = uniqIdentifier "go" (varmap [fieldlbl,v])
387 fieldlbl = identToString fld
388 v = identToString cv0
389 return Computation
390 { compFree = varmap [v]
391 , compIntro = Map.empty
392 , comp = Lambda () [hspvar k1]
393 $ infixOp
394 (App () (App () (App () (hsvar "modify")
395 (TypeApp () (TyPromoted () (PromotedString () fieldlbl fieldlbl))))
396 (hsvar v))
397 (hsvar "succ")) ">>" (hsvar k1)
398 }
378grokStatement (CBlockStmt (CExpr mexpr _)) = do 399grokStatement (CBlockStmt (CExpr mexpr _)) = do
379 let (ss,pre) = fromMaybe ([],Computation Map.empty Map.empty id) $ do 400 (ss,pre) <- maybe (Just $ (,) [] $ Computation Map.empty Map.empty id)
380 expr <- mexpr 401 (fmap (second (fmap (\e -> infixFn e "seq"))) . grokExpression) mexpr
381 (ss,x) <- grokExpression expr 402 let k = uniqIdentifier "go" (compFree s)
382 return (ss, fmap (\e -> infixFn e "seq") x)
383 k = uniqIdentifier "go" (compFree s)
384 s = foldr applyComputation (fmap ($ hsvar k) pre) ss 403 s = foldr applyComputation (fmap ($ hsvar k) pre) ss
385 return $ fmap (Lambda () [hspvar k]) s 404 return $ fmap (Lambda () [hspvar k]) s
386grokStatement (CBlockDecl (CDecl (t:ts) (v:vs) _)) = do 405grokStatement (CBlockDecl (CDecl (t:ts) (v:vs) _)) = do
@@ -440,7 +459,7 @@ transpile o fname incs (CTranslUnit edecls _) = do
440 forM_ bdy $ \d -> putStrLn $ ppShow $ cleanTree d 459 forM_ bdy $ \d -> putStrLn $ ppShow $ cleanTree d
441 else do 460 else do
442 let mhask = do 461 let mhask = do
443 xs <- sequence $ map grokStatement bdy 462 xs <- mapM grokStatement bdy
444 return $ foldr applyComputation (Computation Map.empty Map.empty hsopUnit) xs 463 return $ foldr applyComputation (Computation Map.empty Map.empty hsopUnit) xs
445 case mhask of 464 case mhask of
446 Just hask -> do printHeader 465 Just hask -> do printHeader