First (aborted) shot at marking declarations

This commit is contained in:
Adam Sampson 2006-10-02 13:28:36 +00:00
parent f7651664ae
commit f1a63732b1
4 changed files with 74 additions and 21 deletions

View File

@ -5,23 +5,67 @@ module PhaseIntermediate (phaseIntermediate) where
import Tree
import Pass
import BaseTransforms
import Control.Monad.State
import Data.Map as Map
bases = [baseTransformOc, baseTransformInt]
phaseIntermediate
= (Phase "Intermediate mangling"
[
("Gather declarations", makePass () gatherDecls bases)
("Mark declarations", makePass () markDecls bases)
-- , ("Unique identifiers", makePass (0, Map.empty) uniqueIdentifiers bases)
])
gatherDecls :: Transform ()
gatherDecls next top node
nestDecls :: [(Node, Node)] -> Node -> Node
nestDecls l n = foldl (\a b -> b a) n [IntDecl n d | (OcName n, d) <- l]
markDecls :: Transform ()
markDecls next top node
= case node of
OcDecl d c -> do
c' <- top c
d' <- top d
return $ case c' of
IntDeclSet ds cs -> IntDeclSet (d':ds) cs
_ -> IntDeclSet [d'] c'
OcDecl (OcProc nn@(OcName n) args code) body -> do
body' <- top body
code' <- top code
let pdecl = nestDecls [(n, d) | d@(OcFormal _ n) <- args] (OcProc nn args code')
return $ IntDecl n pdecl body'
OcDecl (OcFunc nn@(OcName n) args rets code) body -> do
error "blah"
body' <- top body
code' <- top code
let pdecl = nestDecls [(n, d) | d@(OcFormal _ n) <- args] (OcFunc nn args rets code')
return $ IntDecl n pdecl body'
-- FIXME same for functions
OcDecl d body -> do
body' <- top body
return $ case d of
OcVars t ns -> nestDecls [(n, t) | n <- ns] body'
OcIs (OcName n) _ -> IntDecl n d body'
OcIsType (OcName n) _ _ -> IntDecl n d body'
OcValIs (OcName n) _ -> IntDecl n d body'
OcValIsType (OcName n) _ _ -> IntDecl n d body'
OcDataType (OcName n) _ -> IntDecl n d body'
OcProtocol (OcName n) _ -> IntDecl n d body'
OcFuncIs (OcName n) _ _ _ -> IntDecl n d body'
OcRetypes (OcName n) _ _ -> IntDecl n d body'
OcValRetypes (OcName n) _ _ -> IntDecl n d body'
OcReshapes (OcName n) _ _ -> IntDecl n d body'
OcValReshapes (OcName n) _ _ -> IntDecl n d body'
_ -> error ("Unhandled type of declaration: " ++ (show d))
_ -> next node
uniqueIdentifiers :: Transform (Int, Map.Map String String)
uniqueIdentifiers next top node
= case node of
IntDecl name def body -> do
(n, ids) <- get
let newname = name ++ "_" ++ (show n)
put (n + 1, Map.insert name newname ids)
def' <- top def
body' <- top body
modify (\(n, _) -> (n, ids))
return $ IntDecl newname def' body'
OcName s -> do
(_, ids) <- get
return $ if Map.member s ids then OcName (Map.findWithDefault "" s ids) else error ("Unknown identifier: " ++ s)
_ -> next node

View File

@ -12,22 +12,20 @@ bases = [baseTransformOc]
phaseSource
= (Phase "Source rewriting"
[
("C-ify identifiers", makePass () cifyIdentifiers bases),
("Number identifiers", makePass 0 numberIdentifiers bases)
("Simplify", makePass () simplify bases),
("C-ify identifiers", makePass () cifyIdentifiers bases)
])
simplify :: Transform ()
simplify next top node
= case node of
-- FIXME rewrite stuff like OcFuncIs -> OcFunc
-- FIXME could we even rewrite procs and functions to the same thing?
_ -> next node
cifyIdentifiers :: Transform ()
cifyIdentifiers next top node
= case node of
OcName n -> return $ OcName [if c == '.' then '_' else c | c <- n]
_ -> next node
numberIdentifiers :: Transform Int
numberIdentifiers next top node
= case node of
OcName n -> do
i <- get
put $ i + 1
return $ OcName (n ++ "." ++ (show i))
_ -> next node

View File

@ -139,7 +139,7 @@ data Node =
-- }}} END
-- {{{ BEGIN baseTransformInt
| IntDeclSet [Node] Node
| IntDecl String Node Node
-- }}} END
-- {{{ BEGIN baseTransformC

View File

@ -1,3 +1,13 @@
PROC p (VAL INT x, y, INT z)
z := x + y
:
INT FUNCTION f (VAL INT x, y)
VALOF
SKIP
RESULT x + y
:
PROC test.expressions ()
INT a:
INT b:
@ -7,4 +17,5 @@ PROC test.expressions ()
b := 2
c := 3
c := (42 * a) + (b - (72 / c))
p (a, b, c)
: