@@ -4,15 +4,15 @@ import Prelude hiding (init)
4
4
5
5
import qualified Data.Set as Set
6
6
7
- import PPA.Lang.While.Internal.Syntax
7
+ import PPA.Lang.While.Internal
8
8
9
9
data Block = BAssign Var AExp Lab | BSkip Lab | BBExp BExp Lab deriving (Eq , Ord )
10
10
11
11
instance Show Block where
12
12
show (BAssign x a l) = " (" ++ (show l) ++ " ) " ++ (show $ SAssign x a l)
13
13
show (BSkip l) = " (" ++ (show l) ++ " ) " ++ (show $ SSkip l)
14
14
show (BBExp b l) = " (" ++ (show l) ++ " ) " ++ (show b)
15
-
15
+ -- 2.1, p. 36
16
16
init :: Stmt -> Lab
17
17
init (SAssign _ _ l) = l
18
18
init (SSkip l) = l
@@ -23,6 +23,7 @@ init (SSeq ss) = init s_1
23
23
init (SIf _ l _ _) = l
24
24
init (SWhile _ l _) = l
25
25
26
+ -- 2.1, p. 36
26
27
final :: Stmt -> Set. Set Lab
27
28
final (SAssign _ _ l) = Set. singleton l
28
29
final (SSkip l) = Set. singleton l
@@ -33,6 +34,7 @@ final (SSeq ss) = final s_n
33
34
final (SIf _ _ s1 s2) = Set. unions [(final s1), (final s2)]
34
35
final (SWhile _ l _) = Set. singleton l
35
36
37
+ -- 2.1, p. 36
36
38
blocks :: Stmt -> Set. Set Block
37
39
blocks (SAssign x a l) = Set. singleton $ BAssign x a l
38
40
blocks (SSkip l) = Set. singleton $ BSkip l
@@ -43,32 +45,15 @@ blocks (SSeq ss) = Set.unions $ bs
43
45
blocks (SIf b l s1 s2) = Set. unions [Set. singleton $ BBExp b l, blocks s1, blocks s2]
44
46
blocks (SWhile b l s) = Set. unions [Set. singleton $ BBExp b l, blocks s]
45
47
48
+ -- 2.1, p. 37
46
49
labels :: Stmt -> Set. Set Lab
47
50
labels s = Set. map getLabel $ blocks s
48
51
where
49
52
getLabel (BAssign _ _ l) = l
50
53
getLabel (BSkip l) = l
51
54
getLabel (BBExp _ l) = l
52
55
53
- fvA :: AExp -> Set. Set Var
54
- fvA (AVar x) = Set. singleton x
55
- fvA (ANum _) = Set. empty
56
- fvA (AOpA _ a1 a2) = Set. unions [fvA a1, fvA a2]
57
-
58
- fvB :: BExp -> Set. Set Var
59
- fvB (BTrue ) = Set. empty
60
- fvB (BFalse ) = Set. empty
61
- fvB (BNot b) = fvB b
62
- fvB (BOpB _ b1 b2) = Set. unions [fvB b1, fvB b2]
63
- fvB (BOpR _ a1 a2) = Set. unions [fvA a1, fvA a2]
64
-
65
- fv :: Stmt -> Set. Set Var
66
- fv (SAssign x a _) = Set. unions [Set. singleton x, fvA a]
67
- fv (SSkip _) = Set. empty
68
- fv (SSeq ss) = Set. unions $ map fv ss
69
- fv (SIf b _ s1 s2) = Set. unions [fvB b, fv s1, fv s2]
70
- fv (SWhile b _ s) = Set. unions [fvB b, fv s]
71
-
56
+ -- 2.1, p. 37
72
57
flow :: Stmt -> Set. Set (Lab , Lab )
73
58
flow (SAssign _ _ _) = Set. empty
74
59
flow (SSkip _) = Set. empty
@@ -101,6 +86,29 @@ flow (SWhile _ l s) = Set.unions [subflows, bodyflows]
101
86
bodyflows :: Set. Set (Lab , Lab )
102
87
bodyflows = Set. unions [Set. singleton (l, init s), Set. map (\ l' -> (l', l)) $ final s]
103
88
89
+ -- 2.1, p. 38
104
90
flowReverse :: Stmt -> Set. Set (Lab , Lab )
105
91
flowReverse s = Set. map (\ (l, l') -> (l', l)) $ flow s
106
92
93
+ fvA :: AExp -> Set. Set Var
94
+ fvA (AVar x) = Set. singleton x
95
+ fvA (ANum _) = Set. empty
96
+ fvA (AOpA _ a1 a2) = Set. unions [fvA a1, fvA a2]
97
+
98
+ fvB :: BExp -> Set. Set Var
99
+ fvB (BTrue ) = Set. empty
100
+ fvB (BFalse ) = Set. empty
101
+ fvB (BNot b) = fvB b
102
+ fvB (BOpB _ b1 b2) = Set. unions [fvB b1, fvB b2]
103
+ fvB (BOpR _ a1 a2) = Set. unions [fvA a1, fvA a2]
104
+
105
+ -- 2.1, p. 38
106
+ -- NOTE: Referenced, but not defined
107
+ fv :: Stmt -> Set. Set Var
108
+ fv (SAssign x a _) = Set. unions [Set. singleton x, fvA a]
109
+ fv (SSkip _) = Set. empty
110
+ fv (SSeq ss) = Set. unions $ map fv ss
111
+ fv (SIf b _ s1 s2) = Set. unions [fvB b, fv s1, fv s2]
112
+ fv (SWhile b _ s) = Set. unions [fvB b, fv s]
113
+
114
+
0 commit comments