@minduscript/compiler 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.npmignore +2 -0
  2. package/dist/asm/gen-asm.d.ts +2 -0
  3. package/dist/asm/gen-asm.js +432 -0
  4. package/dist/counter.d.ts +5 -0
  5. package/dist/counter.js +13 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +17 -0
  8. package/dist/ir/build-ir.d.ts +3 -0
  9. package/dist/ir/build-ir.js +1057 -0
  10. package/dist/ir/gather-macros.d.ts +8 -0
  11. package/dist/ir/gather-macros.js +204 -0
  12. package/dist/ir/ir.d.ts +478 -0
  13. package/dist/ir/ir.js +120 -0
  14. package/dist/ir/project.d.ts +24 -0
  15. package/dist/ir/project.js +339 -0
  16. package/dist/ir/symbol-table.d.ts +19 -0
  17. package/dist/ir/symbol-table.js +385 -0
  18. package/dist/macro/check-macro.d.ts +14 -0
  19. package/dist/macro/check-macro.js +136 -0
  20. package/dist/macro/expand-macros.d.ts +6 -0
  21. package/dist/macro/expand-macros.js +285 -0
  22. package/dist/optimizer/default-passes.d.ts +2 -0
  23. package/dist/optimizer/default-passes.js +20 -0
  24. package/dist/optimizer/merge-labels.d.ts +2 -0
  25. package/dist/optimizer/merge-labels.js +45 -0
  26. package/dist/optimizer/optimizer.d.ts +4 -0
  27. package/dist/optimizer/optimizer.js +26 -0
  28. package/dist/optimizer/passes/constant-folding.d.ts +2 -0
  29. package/dist/optimizer/passes/constant-folding.js +160 -0
  30. package/dist/optimizer/passes/control-flow.d.ts +5 -0
  31. package/dist/optimizer/passes/control-flow.js +138 -0
  32. package/dist/optimizer/passes/copy-propagation.d.ts +2 -0
  33. package/dist/optimizer/passes/copy-propagation.js +127 -0
  34. package/dist/optimizer/passes/dead-code.d.ts +2 -0
  35. package/dist/optimizer/passes/dead-code.js +200 -0
  36. package/dist/optimizer/passes/merge-labels-pass.d.ts +2 -0
  37. package/dist/optimizer/passes/merge-labels-pass.js +14 -0
  38. package/dist/optimizer/types.d.ts +10 -0
  39. package/dist/optimizer/types.js +3 -0
  40. package/dist/test.d.ts +1 -0
  41. package/dist/test.js +14 -0
  42. package/package.json +22 -0
package/.npmignore ADDED
@@ -0,0 +1,2 @@
1
+ .tsbuildinfo
2
+ *.map
@@ -0,0 +1,2 @@
1
+ import type { IRNode } from '../ir/ir';
2
+ export declare const genASM: (ir: IRNode[]) => string;
@@ -0,0 +1,432 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.genASM = void 0;
4
+ const parser_1 = require("@minduscript/parser");
5
+ const ir_1 = require("../ir/ir");
6
+ const transformValue = (value) => {
7
+ if (!value.isLiteral) {
8
+ return value.name;
9
+ }
10
+ if (value.value === false) {
11
+ return 'false';
12
+ }
13
+ if (!value.value) {
14
+ return 'null';
15
+ }
16
+ return value.value.toString();
17
+ };
18
+ const transformRadarCondition = (condition) => {
19
+ switch (condition) {
20
+ case parser_1.RadarCondition.ANY:
21
+ return 'any';
22
+ case parser_1.RadarCondition.ENEMY:
23
+ return 'enemy';
24
+ case parser_1.RadarCondition.ALLY:
25
+ return 'ally';
26
+ case parser_1.RadarCondition.PLAYER:
27
+ return 'player';
28
+ case parser_1.RadarCondition.ATTACKER:
29
+ return 'attacker';
30
+ case parser_1.RadarCondition.FLYING:
31
+ return 'flying';
32
+ case parser_1.RadarCondition.BOSS:
33
+ return 'boss';
34
+ default:
35
+ return 'ground';
36
+ }
37
+ };
38
+ const transformRadarSortConfig = (config) => {
39
+ switch (config) {
40
+ case parser_1.RadarSortConfig.DISTANCE:
41
+ return 'distance';
42
+ case parser_1.RadarSortConfig.HEALTH:
43
+ return 'health';
44
+ case parser_1.RadarSortConfig.SHIELD:
45
+ return 'shield';
46
+ case parser_1.RadarSortConfig.ARMOR:
47
+ return 'armor';
48
+ default:
49
+ return 'maxHealth';
50
+ }
51
+ };
52
+ const transformNormalNode = (node) => {
53
+ switch (node.type) {
54
+ case ir_1.IRNodeType.READ: {
55
+ return `read ${node.output} ${transformValue(node.memoryName)} ${transformValue(node.memoryIndex)}`;
56
+ }
57
+ case ir_1.IRNodeType.WRITE: {
58
+ return `write ${transformValue(node.value)} ${transformValue(node.memoryName)} ${transformValue(node.memoryIndex)}`;
59
+ }
60
+ case ir_1.IRNodeType.DRAW_CLEAR: {
61
+ return `draw clear ${transformValue(node.r)} ${transformValue(node.g)} ${transformValue(node.b)}`;
62
+ }
63
+ case ir_1.IRNodeType.DRAW_COLOR: {
64
+ return `draw color ${transformValue(node.r)} ${transformValue(node.g)} ${transformValue(node.b)} ${transformValue(node.a)}`;
65
+ }
66
+ case ir_1.IRNodeType.DRAW_COL: {
67
+ return `draw col ${transformValue(node.color)}`;
68
+ }
69
+ case ir_1.IRNodeType.DRAW_STROKE: {
70
+ return `draw stroke ${transformValue(node.width)}`;
71
+ }
72
+ case ir_1.IRNodeType.DRAW_LINE: {
73
+ return `draw line ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.x2)} ${transformValue(node.y2)}`;
74
+ }
75
+ case ir_1.IRNodeType.DRAW_RECT: {
76
+ return `draw rect ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.width)} ${transformValue(node.height)}`;
77
+ }
78
+ case ir_1.IRNodeType.DRAW_LINE_RECT: {
79
+ return `draw lineRect ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.width)} ${transformValue(node.height)}`;
80
+ }
81
+ case ir_1.IRNodeType.DRAW_POLY: {
82
+ return `draw poly ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.sides)} ${transformValue(node.radius)} ${transformValue(node.rotation)}`;
83
+ }
84
+ case ir_1.IRNodeType.DRAW_LINE_POLY: {
85
+ return `draw linePoly ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.sides)} ${transformValue(node.radius)} ${transformValue(node.rotation)}`;
86
+ }
87
+ case ir_1.IRNodeType.DRAW_TRIANGLE: {
88
+ return `draw triangle ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.x2)} ${transformValue(node.y2)} ${transformValue(node.x3)} ${transformValue(node.y3)}`;
89
+ }
90
+ case ir_1.IRNodeType.DRAW_IMAGE: {
91
+ return `draw image ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.image)} ${transformValue(node.size)} ${transformValue(node.rotation)}`;
92
+ }
93
+ case ir_1.IRNodeType.PRINT: {
94
+ return `print ${transformValue(node.value)}`;
95
+ }
96
+ case ir_1.IRNodeType.DRAW_FLUSH: {
97
+ return `drawflush ${transformValue(node.target)}`;
98
+ }
99
+ case ir_1.IRNodeType.PRINT_FLUSH: {
100
+ return `printflush ${transformValue(node.target)}`;
101
+ }
102
+ case ir_1.IRNodeType.GET_LINK: {
103
+ return `getLink ${node.result} ${transformValue(node.id)}`;
104
+ }
105
+ case ir_1.IRNodeType.SET_ENABLED: {
106
+ return `control enabled ${transformValue(node.building)} ${transformValue(node.enabled)}`;
107
+ }
108
+ case ir_1.IRNodeType.SET_SHOOT: {
109
+ return `control shoot ${transformValue(node.building)} ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.shoot)}`;
110
+ }
111
+ case ir_1.IRNodeType.SET_SHOOT_P: {
112
+ return `control shootp ${transformValue(node.building)} ${transformValue(node.unit)} ${transformValue(node.shoot)}`;
113
+ }
114
+ case ir_1.IRNodeType.SET_CONFIG: {
115
+ return `control config ${transformValue(node.building)} ${transformValue(node.config)}`;
116
+ }
117
+ case ir_1.IRNodeType.SET_COLOR: {
118
+ return `control color ${transformValue(node.building)} ${transformValue(node.color)}`;
119
+ }
120
+ case ir_1.IRNodeType.RADAR: {
121
+ return `radar ${transformRadarCondition(node.condition1)} ${transformRadarCondition(node.condition2)} ${transformRadarCondition(node.condition3)} ${transformRadarSortConfig(node.sort)} ${transformValue(node.building)} ${transformValue(node.order)} ${node.result}`;
122
+ }
123
+ case ir_1.IRNodeType.SENSOR: {
124
+ return `sensor ${node.result} ${transformValue(node.building)} ${transformValue(node.target)}`;
125
+ }
126
+ case ir_1.IRNodeType.ASSIGN: {
127
+ return `set ${node.target} ${transformValue(node.value)}`;
128
+ }
129
+ case ir_1.IRNodeType.ADD: {
130
+ return `op add ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
131
+ }
132
+ case ir_1.IRNodeType.SUB: {
133
+ return `op sub ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
134
+ }
135
+ case ir_1.IRNodeType.MUL: {
136
+ return `op mul ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
137
+ }
138
+ case ir_1.IRNodeType.DIV: {
139
+ return `op div ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
140
+ }
141
+ case ir_1.IRNodeType.IDIV: {
142
+ return `op idiv ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
143
+ }
144
+ case ir_1.IRNodeType.MOD: {
145
+ return `op mod ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
146
+ }
147
+ case ir_1.IRNodeType.POW: {
148
+ return `op pow ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
149
+ }
150
+ case ir_1.IRNodeType.EQ: {
151
+ return `op equal ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
152
+ }
153
+ case ir_1.IRNodeType.NE: {
154
+ return `op notEqual ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
155
+ }
156
+ case ir_1.IRNodeType.AND: {
157
+ return `op land ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
158
+ }
159
+ case ir_1.IRNodeType.LESS: {
160
+ return `op lessThan ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
161
+ }
162
+ case ir_1.IRNodeType.LE: {
163
+ return `op lessThanEq ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
164
+ }
165
+ case ir_1.IRNodeType.GREATER: {
166
+ return `op greaterThan ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
167
+ }
168
+ case ir_1.IRNodeType.GE: {
169
+ return `op greaterThanEq ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
170
+ }
171
+ case ir_1.IRNodeType.STRICT_EQ: {
172
+ return `op strictEqual ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
173
+ }
174
+ case ir_1.IRNodeType.SHL: {
175
+ return `op shl ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
176
+ }
177
+ case ir_1.IRNodeType.SHR: {
178
+ return `op shr ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
179
+ }
180
+ case ir_1.IRNodeType.BITOR: {
181
+ return `op or ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
182
+ }
183
+ case ir_1.IRNodeType.BITAND: {
184
+ return `op and ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
185
+ }
186
+ case ir_1.IRNodeType.XOR: {
187
+ return `op xor ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
188
+ }
189
+ case ir_1.IRNodeType.FLIP: {
190
+ return `op not ${node.target} ${transformValue(node.value)}`;
191
+ }
192
+ case ir_1.IRNodeType.MAX: {
193
+ return `op max ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
194
+ }
195
+ case ir_1.IRNodeType.MIN: {
196
+ return `op min ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
197
+ }
198
+ case ir_1.IRNodeType.ANGLE: {
199
+ return `op angle ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
200
+ }
201
+ case ir_1.IRNodeType.ANGLE_DIFF: {
202
+ return `op angleDiff ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
203
+ }
204
+ case ir_1.IRNodeType.LEN: {
205
+ return `op len ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
206
+ }
207
+ case ir_1.IRNodeType.NOISE: {
208
+ return `op noise ${node.target} ${transformValue(node.left)} ${transformValue(node.right)}`;
209
+ }
210
+ case ir_1.IRNodeType.ABS: {
211
+ return `op abs ${node.target} ${transformValue(node.value)}`;
212
+ }
213
+ case ir_1.IRNodeType.LOG: {
214
+ return `op log ${node.target} ${transformValue(node.value)}`;
215
+ }
216
+ case ir_1.IRNodeType.LOG10: {
217
+ return `op log10 ${node.target} ${transformValue(node.value)}`;
218
+ }
219
+ case ir_1.IRNodeType.FLOOR: {
220
+ return `op floor ${node.target} ${transformValue(node.value)}`;
221
+ }
222
+ case ir_1.IRNodeType.CEIL: {
223
+ return `op ceil ${node.target} ${transformValue(node.value)}`;
224
+ }
225
+ case ir_1.IRNodeType.SQRT: {
226
+ return `op sqrt ${node.target} ${transformValue(node.value)}`;
227
+ }
228
+ case ir_1.IRNodeType.RAND: {
229
+ return `op rand ${node.target} ${transformValue(node.value)}`;
230
+ }
231
+ case ir_1.IRNodeType.SIN: {
232
+ return `op sin ${node.target} ${transformValue(node.value)}`;
233
+ }
234
+ case ir_1.IRNodeType.COS: {
235
+ return `op cos ${node.target} ${transformValue(node.value)}`;
236
+ }
237
+ case ir_1.IRNodeType.TAN: {
238
+ return `op tan ${node.target} ${transformValue(node.value)}`;
239
+ }
240
+ case ir_1.IRNodeType.ASIN: {
241
+ return `op asin ${node.target} ${transformValue(node.value)}`;
242
+ }
243
+ case ir_1.IRNodeType.ACOS: {
244
+ return `op acos ${node.target} ${transformValue(node.value)}`;
245
+ }
246
+ case ir_1.IRNodeType.ATAN: {
247
+ return `op atan ${node.target} ${transformValue(node.value)}`;
248
+ }
249
+ case ir_1.IRNodeType.PACK_COLOR: {
250
+ return `packcolor ${node.result} ${transformValue(node.r)} ${transformValue(node.g)} ${transformValue(node.b)} ${transformValue(node.a)}`;
251
+ }
252
+ case ir_1.IRNodeType.WAIT: {
253
+ return `wait ${transformValue(node.time)}`;
254
+ }
255
+ case ir_1.IRNodeType.CPU_STOP: {
256
+ return 'stop';
257
+ }
258
+ case ir_1.IRNodeType.UNIT_BIND: {
259
+ return `ubind ${node.unit}`;
260
+ }
261
+ case ir_1.IRNodeType.IDLE: {
262
+ return 'ucontrol idle';
263
+ }
264
+ case ir_1.IRNodeType.STOP: {
265
+ return 'ucontrol stop';
266
+ }
267
+ case ir_1.IRNodeType.MOVE: {
268
+ return `ucontrol move ${transformValue(node.x)} ${transformValue(node.y)}`;
269
+ }
270
+ case ir_1.IRNodeType.APPROACH: {
271
+ return `ucontrol approach ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.distance)}`;
272
+ }
273
+ case ir_1.IRNodeType.PATH_FIND: {
274
+ return `ucontrol pathfind ${transformValue(node.x)} ${transformValue(node.y)}`;
275
+ }
276
+ case ir_1.IRNodeType.AUTO_PATH_FIND: {
277
+ return 'ucontrol autoPathfind';
278
+ }
279
+ case ir_1.IRNodeType.BOOST: {
280
+ return `ucontrol boost ${transformValue(node.enabled)}`;
281
+ }
282
+ case ir_1.IRNodeType.TARGET: {
283
+ return `ucontrol target ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.shoot)}`;
284
+ }
285
+ case ir_1.IRNodeType.TARGET_P: {
286
+ return `ucontrol targetp ${transformValue(node.unit)} ${transformValue(node.shoot)}`;
287
+ }
288
+ case ir_1.IRNodeType.ITEM_DROP: {
289
+ return `ucontrol itemDrop ${transformValue(node.building)} ${transformValue(node.amount)}`;
290
+ }
291
+ case ir_1.IRNodeType.ITEM_TAKE: {
292
+ return `ucontrol itemTake ${transformValue(node.building)} ${transformValue(node.item)} ${transformValue(node.amount)}`;
293
+ }
294
+ case ir_1.IRNodeType.PAY_DROP: {
295
+ return 'ucontrol payDrop';
296
+ }
297
+ case ir_1.IRNodeType.PAY_TAKE: {
298
+ return `ucontrol payTake ${transformValue(node.takeUnits)}`;
299
+ }
300
+ case ir_1.IRNodeType.PAY_ENTER: {
301
+ return 'ucontrol payEnter';
302
+ }
303
+ case ir_1.IRNodeType.MINE: {
304
+ return `ucontrol mine ${transformValue(node.x)} ${transformValue(node.y)}`;
305
+ }
306
+ case ir_1.IRNodeType.FLAG: {
307
+ return `ucontrol flag ${transformValue(node.flag)}`;
308
+ }
309
+ case ir_1.IRNodeType.BUILD: {
310
+ return `ucontrol build ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.block)} ${transformValue(node.rotation)} ${transformValue(node.config)}`;
311
+ }
312
+ case ir_1.IRNodeType.GET_BLOCK: {
313
+ return `ucontrol getBlock ${transformValue(node.x)} ${transformValue(node.y)} ${node.outType} ${node.building} ${node.floor}`;
314
+ }
315
+ case ir_1.IRNodeType.WITHIN: {
316
+ return `ucontrol within ${transformValue(node.x)} ${transformValue(node.y)} ${transformValue(node.radius)} ${node.result}`;
317
+ }
318
+ case ir_1.IRNodeType.UNBIND: {
319
+ return 'ucontrol unbind';
320
+ }
321
+ case ir_1.IRNodeType.UNIT_RADAR: {
322
+ return `uradar ${transformRadarCondition(node.condition1)} ${transformRadarCondition(node.condition2)} ${transformRadarCondition(node.condition3)} ${transformRadarSortConfig(node.sort)} 0 ${transformValue(node.order)} ${node.result}`;
323
+ }
324
+ case ir_1.IRNodeType.UNIT_LOCATE_ORE: {
325
+ return `ulocate ore core true ${transformValue(node.target)} ${node.outX} ${node.outY} ${node.found}`;
326
+ }
327
+ case ir_1.IRNodeType.UNIT_LOCATE_BUILDING: {
328
+ let group;
329
+ switch (node.group) {
330
+ case parser_1.UnitLocateBuildingGroup.CORE:
331
+ group = 'core';
332
+ break;
333
+ case parser_1.UnitLocateBuildingGroup.STORAGE:
334
+ group = 'storage';
335
+ break;
336
+ case parser_1.UnitLocateBuildingGroup.GENERATOR:
337
+ group = 'generator';
338
+ break;
339
+ case parser_1.UnitLocateBuildingGroup.TURRET:
340
+ group = 'turret';
341
+ break;
342
+ case parser_1.UnitLocateBuildingGroup.FACTORY:
343
+ group = 'factory';
344
+ break;
345
+ case parser_1.UnitLocateBuildingGroup.REPAIR:
346
+ group = 'repair';
347
+ break;
348
+ case parser_1.UnitLocateBuildingGroup.BATTERY:
349
+ group = 'battery';
350
+ break;
351
+ default:
352
+ group = 'reactor';
353
+ }
354
+ return `ulocate building ${group} ${transformValue(node.enemy)} @copper ${node.outX} ${node.outY} ${node.found} ${node.building}`;
355
+ }
356
+ case ir_1.IRNodeType.UNIT_LOCATE_SPAWN: {
357
+ return `ulocate spawn core true @copper ${node.outX} ${node.outY} ${node.found} ${node.building}`;
358
+ }
359
+ default: {
360
+ return `ulocate damaged core true @copper ${node.outX} ${node.outY} ${node.found} ${node.building}`;
361
+ }
362
+ }
363
+ };
364
+ const transformJumpNode = (node, labelMap) => {
365
+ switch (node.type) {
366
+ case ir_1.IRNodeType.JUMP: {
367
+ return `jump ${labelMap[node.label]} always`;
368
+ }
369
+ default: {
370
+ let condition;
371
+ switch (node.condition) {
372
+ case ir_1.JumpCondition.EQ:
373
+ condition = 'equal';
374
+ break;
375
+ case ir_1.JumpCondition.NE:
376
+ condition = 'notEqual';
377
+ break;
378
+ case ir_1.JumpCondition.LESS:
379
+ condition = 'lessThan';
380
+ break;
381
+ case ir_1.JumpCondition.LE:
382
+ condition = 'lessThanEq';
383
+ break;
384
+ case ir_1.JumpCondition.GREATER:
385
+ condition = 'greaterThan';
386
+ break;
387
+ case ir_1.JumpCondition.GE:
388
+ condition = 'greaterThanEq';
389
+ break;
390
+ default:
391
+ condition = 'strictEqual';
392
+ }
393
+ return `jump ${labelMap[node.label]} ${condition} ${transformValue(node.left)} ${transformValue(node.right)}`;
394
+ }
395
+ }
396
+ };
397
+ const genASM = (ir) => {
398
+ const labelMap = {};
399
+ let instructionLine = 0;
400
+ for (const node of ir) {
401
+ if (node.type === ir_1.IRNodeType.LABEL) {
402
+ labelMap[node.name] = instructionLine;
403
+ continue;
404
+ }
405
+ instructionLine += 1;
406
+ }
407
+ const asmLines = [];
408
+ for (const node of ir) {
409
+ if (node.type === ir_1.IRNodeType.LABEL ||
410
+ node.type === ir_1.IRNodeType.MACRO_CALL ||
411
+ node.type === ir_1.IRNodeType.MACRO_CALL_ASSIGN ||
412
+ node.type === ir_1.IRNodeType.BIND) {
413
+ continue;
414
+ }
415
+ if (node.type === ir_1.IRNodeType.JUMP || node.type === ir_1.IRNodeType.CONDITIONAL_JUMP) {
416
+ asmLines.push(transformJumpNode(node, labelMap));
417
+ continue;
418
+ }
419
+ asmLines.push(transformNormalNode(node));
420
+ }
421
+ const trailingLabels = Object.keys(labelMap).filter((name) => labelMap[name] === asmLines.length);
422
+ if (trailingLabels.length > 0) {
423
+ const nopLine = asmLines.length;
424
+ asmLines.push('noop');
425
+ for (const name of trailingLabels) {
426
+ labelMap[name] = nopLine;
427
+ }
428
+ }
429
+ return asmLines.join('\n');
430
+ };
431
+ exports.genASM = genASM;
432
+ //# sourceMappingURL=gen-asm.js.map
@@ -0,0 +1,5 @@
1
+ export declare const counter: {
2
+ value: number;
3
+ reset(): void;
4
+ next(): number;
5
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.counter = void 0;
4
+ exports.counter = {
5
+ value: 0,
6
+ reset() {
7
+ this.value = 0;
8
+ },
9
+ next() {
10
+ return ++this.value;
11
+ },
12
+ };
13
+ //# sourceMappingURL=counter.js.map
@@ -0,0 +1 @@
1
+ export declare const compile: (entryFilePath: string, projectRoot?: string) => string;
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compile = void 0;
4
+ const gen_asm_1 = require("./asm/gen-asm");
5
+ const build_ir_1 = require("./ir/build-ir");
6
+ const project_1 = require("./ir/project");
7
+ const expand_macros_1 = require("./macro/expand-macros");
8
+ const optimizer_1 = require("./optimizer/optimizer");
9
+ const compile = (entryFilePath, projectRoot) => {
10
+ const project = (0, project_1.parseProject)(entryFilePath, projectRoot);
11
+ const ir = (0, build_ir_1.buildIR)(project);
12
+ const optimized = (0, optimizer_1.optimizeIR)((0, expand_macros_1.expandMacros)(ir));
13
+ const asm = (0, gen_asm_1.genASM)(optimized.body);
14
+ return asm;
15
+ };
16
+ exports.compile = compile;
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ import { type IRProgram } from './ir';
2
+ import type { Project } from './project';
3
+ export declare const buildIR: (project: Project) => IRProgram;