-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathParser.vy
264 lines (240 loc) · 4.11 KB
/
Parser.vy
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
%{
Require Import String.
Require Import Word.
Require Import Memory.
Definition W : Type := word 32 % type.
Definition B : Type := word 8 % type.
Parameter terminal : Type.
Inductive solo_op :=
| RetA
| XStoreA
| AStoreX
| AddX
| SubX
| MulX
| DivX
| AndX
| OrX
| SLX
| SRX
| LdXHdrLen
| LdLen
| LdXLen.
Inductive imm_op :=
| RetK
| LdImm
| AddImm
| SubImm
| MulImm
| DivImm
| AndImm
| OrImm
| SLImm
| SRImm
| Neg
| JmpImm
| LdXImm.
Inductive mem_op :=
| LdMem
| LdXMem
| Store
| StoreX.
Inductive pkt_op :=
| LdWord
| LdHalf
| LdByte
| LdOfstWord
| LdOfstHalf
| LdXByte.
Inductive br_op :=
| JGTX
| JGEX
| JEqX
| JAndX.
Inductive imm_br_op :=
| JGTImm
| JGEImm
| JEqImm
| JAndImm.
Inductive instr :=
| SoloInstr : solo_op -> instr
| ImmInstr : imm_op -> W -> instr
| MemInstr : mem_op -> W -> instr
| PktInstr : pkt_op -> W -> instr
| BrInstr : br_op -> B -> B -> instr
| ImmBrInstr : imm_br_op -> W -> B -> B -> instr.
%}
(* We begin with all the opcode tokens *)
%token LD_WORD
%token LD_HALF
%token LD_BYTE
%token LD_OFST_WORD
%token LD_OFST_HALF
%token LDX_BYTE
%token LD_MEM
%token LDX_MEM
%token STORE
%token STORE_X
%token RET_A
%token RET_K
%token X_STORE_A
%token A_STORE_X
%token LDX_HDR_LEN
%token LD_IMM
%token ADD_IMM
%token SUB_IMM
%token MUL_IMM
%token DIV_IMM
%token AND_IMM
%token OR_IMM
%token SL_IMM
%token SR_IMM
%token ADD_X
%token SUB_X
%token MUL_X
%token DIV_X
%token AND_X
%token OR_X
%token SL_X
%token SR_X
%token NEG
%token JMP_IMM
%token LDX_IMM
%token JGT_IMM
%token JGE_IMM
%token JEQ_IMM
%token JAND_IMM
%token LD_LEN
%token LDX_LEN
%token JGT_X
%token JGE_X
%token JEQ_X
%token JAND_X
(* Represents both immediates and branch offsets *)
%token <nat> NUM
%token <nat> MEM_ADDR
%token <nat> PKT_ADDR
%token LINEBREAK EOF
%type <instr> pinstr
%type <solo_op> solo_op
%type <imm_op> imm_op
%type <br_op> br_op
%type <pkt_op> pkt_op
%type <mem_op> mem_op
%type <imm_br_op> imm_br_op
%start <list instr> pinstrs
%%
pinstrs:
| pinstr=pinstr; LINEBREAK; rest=pinstrs
{ (pinstr :: rest) }
| pinstr=pinstr; LINEBREAK; EOF;
{ (pinstr :: []) }
pinstr:
| opcode=solo_op
{ SoloInstr opcode }
| opcode=imm_op i=NUM
{ ImmInstr opcode (natToWord 32 i) }
| opcode=br_op b1=NUM b2=NUM
{ BrInstr opcode (natToWord 8 b1) (natToWord 8 b2) }
| opcode=pkt_op po=PKT_ADDR
{ PktInstr opcode (natToWord 32 po) }
| opcode=mem_op mo=MEM_ADDR
{ MemInstr opcode (natToWord 32 mo) }
| opcode=imm_br_op i=NUM b1=NUM b2=NUM
{ ImmBrInstr opcode (natToWord 32 i) (natToWord 8 b1) (natToWord 8 b2) }
pkt_op:
| LD_WORD
{ LdWord }
| LD_HALF
{ LdHalf }
| LD_BYTE
{ LdByte }
| LD_OFST_WORD
{ LdOfstWord }
| LD_OFST_HALF
{ LdOfstHalf }
| LDX_BYTE
{ LdXByte }
mem_op:
| LD_MEM
{ LdMem }
| LDX_MEM
{ LdXMem }
| STORE
{ Store }
| STORE_X
{ StoreX }
solo_op:
| RET_A
{ RetA }
| X_STORE_A
{ XStoreA }
| A_STORE_X
{ AStoreX }
| ADD_X
{ AddX }
| SUB_X
{ SubX }
| MUL_X
{ MulX }
| DIV_X
{ DivX }
| AND_X
{ AndX }
| OR_X
{ OrX }
| SL_X
{ SLX }
| SR_X
{ SRX }
| LDX_HDR_LEN
{ LdXHdrLen }
| LD_LEN
{ LdLen }
| LDX_LEN
{ LdXLen }
imm_op:
| RET_K
{ RetK }
| LD_IMM
{ LdImm }
| ADD_IMM
{ AddImm }
| SUB_IMM
{ SubImm }
| MUL_IMM
{ MulImm }
| DIV_IMM
{ DivImm }
| AND_IMM
{ AndImm }
| OR_IMM
{ OrImm }
| SL_IMM
{ SLImm }
| SR_IMM
{ SRImm }
| NEG
{ Neg }
| JMP_IMM
{ JmpImm }
| LDX_IMM
{ LdXImm }
imm_br_op:
| JGT_IMM
{ JGTImm }
| JGE_IMM
{ JGEImm }
| JEQ_IMM
{ JEqImm }
| JAND_IMM
{ JAndImm }
br_op:
| JGT_X
{ JGTX }
| JGE_X
{ JGEX }
| JEQ_X
{ JEqX }
| JAND_X
{ JAndX }