Refactored transformConstr to pull out some of its working into helper functions

This commit is contained in:
Neil Brown 2008-03-21 19:13:54 +00:00
parent 80ffc87f94
commit da5801ad03

View File

@ -214,19 +214,30 @@ transformConstr = doGeneric `ext1M` doStructured
let indexVar = A.Variable m'' indexName
scope' <- doGeneric scope
return $ A.Spec m (A.Specification m' n (A.Declaration m' t)) $ A.ProcThen m''
return $ declDest $ A.ProcThen m''
(A.Seq m'' $ A.Spec m'' indexVarSpec $ A.Several m'' [
A.Only m'' $ A.Assign m'' [indexVar] $ A.ExpressionList m'' [A.Literal m'' A.Int $ A.IntLiteral m'' "0"],
assignIndex0 indexVar,
A.Rep m'' rep $ A.Only m'' $ A.Seq m'' $ A.Several m''
[ A.Only m'' $ A.Assign m''
[A.SubscriptedVariable m'' (A.Subscript m'' A.NoCheck $ A.ExprVariable m'' indexVar) $ A.Variable m'' n]
$ A.ExpressionList m'' [exp]
, A.Only m'' $ A.Assign m'' [indexVar] $ A.ExpressionList m'' [A.Dyadic m'' A.Plus
(A.ExprVariable m'' indexVar)
(A.Literal m'' A.Int $ A.IntLiteral m'' "1")]
]
[ assignItem indexVar, incrementIndex indexVar ]
])
scope'
where
declDest :: Data a => A.Structured a -> A.Structured a
declDest = A.Spec m (A.Specification m' n (A.Declaration m' t))
assignIndex0 :: A.Variable -> A.Structured A.Process
assignIndex0 indexVar = A.Only m'' $ A.Assign m'' [indexVar] $
A.ExpressionList m'' [A.Literal m'' A.Int $ A.IntLiteral m'' "0"]
incrementIndex :: A.Variable -> A.Structured A.Process
incrementIndex indexVar = A.Only m'' $ A.Assign m'' [indexVar] $
A.ExpressionList m'' [addOne $ A.ExprVariable m'' indexVar]
assignItem :: A.Variable -> A.Structured A.Process
assignItem indexVar = A.Only m'' $ A.Assign m'' [A.SubscriptedVariable m''
(A.Subscript m'' A.NoCheck $ A.ExprVariable m'' indexVar) $
A.Variable m'' n] $ A.ExpressionList m'' [exp]
doStructured s = doGeneric s
-- | Find things that need to be moved up to their enclosing Structured, and do