-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSimpleAsmGrammer.hs
154 lines (130 loc) · 3.98 KB
/
SimpleAsmGrammer.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
-- Define a structure representation of the opcodes.
module SimpleAsmGrammer(
AsmProgram(..),
AsmStatements,
AsmStatement(..),
Statement(..),
Operation(..),
Object(..),
Label,
Constant,
MemoryLocation,
Comment,
stmap,
opmap,
stopmap,
objLblMap,
objMemMap,
stLblMap,
stMemMap,
getOperation,
getObject,
getLabel,
getMemLocation,
getSObject,
getSLabel,
getSMemLocation
)where
import qualified SimpleAsmArchitecture as A
data AsmProgram = AsmProgram {
statements :: AsmStatements
} deriving Show
type AsmStatements = [AsmStatement]
data AsmStatement = AStatement {
statement :: Statement
} |
AStatementWComment {
statement :: Statement,
comment :: Comment
} |
ABlankLine |
AComment {
comment :: Comment
} deriving Show
data Statement = SVariable {
label :: Label
} |
SConstant {
label :: Label,
constant :: Constant
} |
SOperation {
operation :: Operation
} |
SLabeledOperation {
label :: Label,
operation :: Operation
} deriving Show
data Operation = Get |
Put |
Ld { object :: Object } |
St { object :: Object} |
Add { object :: Object} |
Sub { object :: Object} |
Jpos { object :: Object} |
Jz { object :: Object} |
J { object :: Object} |
Halt
deriving Show
data Object = OLabel { olabel :: Label } |
OMemLocation { omemLocation :: MemoryLocation }
deriving Show
type Label = String -- [_a-zA-Z]+[_0-9a-zA-Z]{,31}
type Constant = A.Word
type MemoryLocation = A.Word
type Comment = String
-- map a function on a Statement's operation if any, otherwise acts as "id"
stmap :: (Operation -> Operation) -> Statement -> Statement
stmap f (SLabeledOperation lbl op) = SLabeledOperation lbl $ f op
stmap f (SOperation op) = SOperation (f op)
stmap _ s = s
-- map a function on an Operation's object if any, otherwise acts as "id"
opmap :: (Object -> Object) -> Operation -> Operation
opmap _ Get = Get
opmap _ Put = Put
opmap _ Halt = Halt
opmap f (Ld obj) = Ld $ f obj
opmap f (St obj) = St $ f obj
opmap f (Add obj) = Add $ f obj
opmap f (Sub obj) = Sub $ f obj
opmap f (Jpos obj) = Jpos $ f obj
opmap f (Jz obj) = Jz $ f obj
opmap f (J obj) = J $ f obj
-- map a function on an Object's olabel if any, otherwise acts as "id"
objLblMap :: (Label -> Label) -> Object -> Object
objLblMap f (OLabel lbl) = OLabel $ f lbl
objLblMap _ obj = obj
-- map a function on an Object's omemLocation if any, otherwise acts as "id"
objMemMap :: (MemoryLocation -> MemoryLocation) -> Object -> Object
objMemMap f (OMemLocation mem) = OMemLocation $ f mem
objMemMap _ obj = obj
-- map a function on a Statement's Operation's object if any, otherwise acts as "id"
stopmap :: (Object -> Object) -> Statement -> Statement
stopmap = stmap . opmap
-- map a function on a Statement's Operation's Object's olabel if any, otherwise acts as "id"
stLblMap :: (Label -> Label) -> Statement -> Statement
stLblMap = stmap . opmap . objLblMap
-- map a function on a Statement's Operation's Object's omemLocation if any, otherwise acts as "id"
stMemMap :: (MemoryLocation -> MemoryLocation) -> Statement -> Statement
stMemMap = stmap . opmap . objMemMap
getOperation :: Statement -> Maybe Operation
getOperation (SOperation op) = Just op
getOperation (SLabeledOperation _ op) = Just op
getOperation _ = Nothing
getObject :: Operation -> Maybe Object
getObject Get = Nothing
getObject Put = Nothing
getObject Halt = Nothing
getObject op = Just $ object op
getLabel :: Object -> Maybe Label
getLabel (OLabel lbl) = Just lbl
getLabel _ = Nothing
getMemLocation :: Object -> Maybe MemoryLocation
getMemLocation (OMemLocation m) = Just m
getMemLocation _ = Nothing
getSObject :: Statement -> Maybe Object
getSObject s = getOperation s >>= getObject
getSLabel :: Statement -> Maybe Label
getSLabel s = getOperation s >>= getObject >>= getLabel
getSMemLocation :: Statement -> Maybe MemoryLocation
getSMemLocation s = getOperation s >>= getObject >>= getMemLocation