-
Notifications
You must be signed in to change notification settings - Fork 0
/
operation.ts
98 lines (85 loc) · 1.55 KB
/
operation.ts
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
import { Token } from "./lexing/token";
import { Register } from "./register";
export type OpString =
| "set"
| "push"
| "pop"
| "cp"
| "cpgt"
| "cplt"
| "cpeq"
| "add"
| "sub"
| "mul"
| "div"
| "mod"
| "wrt"
| "wrts"
| "wrtc"
| "wrtsc"
| "swap"
export type OperationType =
| "Noop"
| "NoArg"
| "UnaryArg"
| "BinaryArg"
| "QuadArg"
| "ConditionalCopy"
| "Set"
export type OperationAction =
| "Noop"
| "Set"
| "Push"
| "Pop"
| "Copy"
| "ConditionalCopy"
| "Add"
| "Sub"
| "Mul"
| "Div"
| "Mod"
| "Write"
| "WriteStack"
| "WriteChar"
| "WriteStackChars"
| "Swap"
export type Condition =
| "GT"
| "LT"
| "EQ";
export type Literal = { type: "Literal", value: number };
export type Data = Literal | Register;
export interface Operation {
type: OperationType;
action: OperationAction;
rootCommandToken: Token;
}
export interface Zero extends Operation {
type: "NoArg"
}
export interface Unary extends Operation {
type: "UnaryArg",
v1: Data;
}
export interface Binary extends Operation {
type: "BinaryArg",
v1: Data;
v2: Data;
}
export interface Copy extends Binary {
v1: Register;
v2: Register;
}
export interface Quad extends Operation {
type: "QuadArg",
v1: Data;
v2: Data;
v3: Data;
v4: Data;
}
export interface ConditionalCopy extends Quad {
action: "ConditionalCopy";
condition: Condition;
v1: Register;
v2: Register;
}