diff options
author | Joe Crayne <joe@jerkface.net> | 2019-03-19 20:38:16 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-03-19 20:38:16 -0400 |
commit | 2226c41531a68797901b21407ea27046be542757 (patch) | |
tree | 3db31e132d6815878d8cd176df0a1fa609e010c4 | |
parent | dd869e9bb65298a69a7a55bcb77990cebce210a7 (diff) |
expression-statements and increment statement.
-rw-r--r-- | monkeypatch.hs | 33 |
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 | } |
288 | grokExpression (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 | ||
288 | grokExpression _ = Nothing | 296 | grokExpression _ = 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 | 385 | grokStatement (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 | } | ||
378 | grokStatement (CBlockStmt (CExpr mexpr _)) = do | 399 | grokStatement (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 |
386 | grokStatement (CBlockDecl (CDecl (t:ts) (v:vs) _)) = do | 405 | grokStatement (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 |