This module contains an implementation of a case lifter, i.e., an operation which lifts all nested cases (and also nested lets) in a FlatCurry program into new operations.
NOTE: the new operations contain nonsense types, i.e., this transformation should only be used if the actual function types are irrelevant!
Author: Michael Hanus
Version: November 2020
defaultLiftOpts
:: LiftOptions Default options for lifting all nested case/let/free expressions. |
defaultNoLiftOpts
:: LiftOptions Default options for lifting no nested case/let/free expression. |
getOpts
:: StateT LiftState Identity LiftOptions |
genFuncName
:: String -> StateT LiftState Identity (String,String) |
addFun2State
:: FuncDecl -> LiftState -> LiftState |
liftProg
:: LiftOptions -> Prog -> Prog Lift nested cases/lets/free in a FlatCurry program (w.r.t. |
liftTopFun
:: FuncDecl -> StateT LiftState Identity [FuncDecl] |
liftNewFun
:: FuncDecl -> StateT LiftState Identity FuncDecl |
liftRule
:: Rule -> StateT LiftState Identity Rule |
liftExp
:: Bool -> Expr -> StateT LiftState Identity Expr |
unboundVars
:: Expr -> [Int] Find all variables which are not bound in an expression. |
unboundVarsInBranch
:: BranchExpr -> [Int] |
unionMap
:: Eq a => (b -> [a]) -> [b] -> [a] |
Options for case/let/free lifting.
Constructors:
LiftOptions
:: Bool -> Bool -> LiftOptions
Fields:
liftCase
:: Bool
liftCArg
:: Bool
Options for case/let/free lifting.
Constructors:
LiftState
:: LiftOptions -> String -> [String] -> [FuncDecl] -> String -> Int -> LiftState
Fields:
liftOpts
:: LiftOptions
currMod
:: String
topFuncs
:: [String]
liftFuncs
:: [FuncDecl]
currFunc
:: String
currIndex
:: Int
Type synonym: LiftingState a = State LiftState a
Default options for lifting all nested case/let/free expressions.
|
Default options for lifting no nested case/let/free expression.
|
|
|
Lift nested cases/lets/free in a FlatCurry program (w.r.t. options). |
Find all variables which are not bound in an expression. |
|
|