@cuxt/sandboxjs 0.1.1 → 0.1.3
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.
- package/LICENSE +21 -21
- package/README.md +198 -185
- package/{build → dist/cjs}/Sandbox.d.ts +15 -6
- package/dist/cjs/Sandbox.js +126 -0
- package/dist/{SandboxExec.d.ts → cjs/SandboxExec.d.ts} +8 -17
- package/dist/cjs/SandboxExec.js +227 -0
- package/{build/eval.d.ts → dist/cjs/eval/index.d.ts} +10 -2
- package/dist/cjs/eval/index.js +233 -0
- package/dist/cjs/executor/executorUtils.d.ts +161 -0
- package/dist/cjs/executor/executorUtils.js +930 -0
- package/dist/cjs/executor/index.d.ts +1 -0
- package/dist/cjs/executor/index.js +2 -0
- package/dist/cjs/executor/ops/assignment.d.ts +1 -0
- package/dist/cjs/executor/ops/assignment.js +88 -0
- package/dist/cjs/executor/ops/call.d.ts +1 -0
- package/dist/cjs/executor/ops/call.js +160 -0
- package/dist/cjs/executor/ops/comparison.d.ts +1 -0
- package/dist/cjs/executor/ops/comparison.js +36 -0
- package/dist/cjs/executor/ops/control.d.ts +1 -0
- package/dist/cjs/executor/ops/control.js +203 -0
- package/dist/cjs/executor/ops/functions.d.ts +1 -0
- package/dist/cjs/executor/ops/functions.js +55 -0
- package/dist/cjs/executor/ops/index.d.ts +0 -0
- package/dist/cjs/executor/ops/index.js +11 -0
- package/dist/cjs/executor/ops/literals.d.ts +1 -0
- package/dist/cjs/executor/ops/literals.js +45 -0
- package/dist/cjs/executor/ops/misc.d.ts +1 -0
- package/dist/cjs/executor/ops/misc.js +25 -0
- package/dist/cjs/executor/ops/object.d.ts +1 -0
- package/dist/cjs/executor/ops/object.js +51 -0
- package/dist/cjs/executor/ops/prop.d.ts +1 -0
- package/dist/cjs/executor/ops/prop.js +70 -0
- package/dist/cjs/executor/ops/unary.d.ts +1 -0
- package/dist/cjs/executor/ops/unary.js +48 -0
- package/dist/cjs/executor/ops/variables.d.ts +1 -0
- package/dist/cjs/executor/ops/variables.js +16 -0
- package/dist/cjs/executor/opsRegistry.d.ts +33 -0
- package/dist/cjs/executor/opsRegistry.js +8 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/parser/index.d.ts +3 -0
- package/dist/cjs/parser/index.js +1 -0
- package/dist/{parser.d.ts → cjs/parser/lisp.d.ts} +29 -42
- package/dist/cjs/parser/lispTypes/conditionals.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/conditionals.js +135 -0
- package/dist/cjs/parser/lispTypes/control.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/control.js +204 -0
- package/dist/cjs/parser/lispTypes/declarations.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/declarations.js +99 -0
- package/dist/cjs/parser/lispTypes/index.d.ts +3 -0
- package/dist/cjs/parser/lispTypes/index.js +17 -0
- package/dist/cjs/parser/lispTypes/operators.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/operators.js +252 -0
- package/dist/cjs/parser/lispTypes/shared.d.ts +38 -0
- package/dist/cjs/parser/lispTypes/structures.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/structures.js +188 -0
- package/dist/cjs/parser/lispTypes/values.d.ts +2 -0
- package/dist/cjs/parser/lispTypes/values.js +89 -0
- package/dist/cjs/parser/parserUtils.d.ts +34 -0
- package/dist/cjs/parser/parserUtils.js +968 -0
- package/dist/cjs/utils/CodeString.d.ts +16 -0
- package/dist/cjs/utils/CodeString.js +64 -0
- package/dist/cjs/utils/ExecContext.d.ts +34 -0
- package/dist/cjs/utils/ExecContext.js +171 -0
- package/dist/cjs/utils/Prop.d.ts +16 -0
- package/dist/cjs/utils/Prop.js +81 -0
- package/dist/cjs/utils/Scope.d.ts +47 -0
- package/dist/cjs/utils/Scope.js +127 -0
- package/dist/cjs/utils/errors.d.ts +10 -0
- package/dist/cjs/utils/errors.js +12 -0
- package/dist/cjs/utils/functionReplacements.d.ts +11 -0
- package/dist/cjs/utils/functionReplacements.js +362 -0
- package/dist/cjs/utils/index.d.ts +7 -0
- package/dist/cjs/utils/index.js +7 -0
- package/dist/cjs/utils/types.d.ts +221 -0
- package/dist/cjs/utils/types.js +164 -0
- package/dist/cjs/utils/unraw.js +145 -0
- package/dist/{node → esm}/Sandbox.d.ts +15 -6
- package/dist/esm/Sandbox.js +115 -0
- package/dist/esm/Sandbox.js.map +1 -0
- package/{build → dist/esm}/SandboxExec.d.ts +8 -17
- package/dist/esm/SandboxExec.js +224 -0
- package/dist/esm/SandboxExec.js.map +1 -0
- package/dist/{eval.d.ts → esm/eval/index.d.ts} +10 -2
- package/dist/esm/eval/index.js +235 -0
- package/dist/esm/eval/index.js.map +1 -0
- package/dist/esm/executor/executorUtils.d.ts +161 -0
- package/dist/esm/executor/executorUtils.js +898 -0
- package/dist/esm/executor/executorUtils.js.map +1 -0
- package/dist/esm/executor/index.d.ts +1 -0
- package/dist/esm/executor/index.js +2 -0
- package/dist/esm/executor/ops/assignment.d.ts +1 -0
- package/dist/esm/executor/ops/assignment.js +90 -0
- package/dist/esm/executor/ops/assignment.js.map +1 -0
- package/dist/esm/executor/ops/call.d.ts +1 -0
- package/dist/esm/executor/ops/call.js +162 -0
- package/dist/esm/executor/ops/call.js.map +1 -0
- package/dist/esm/executor/ops/comparison.d.ts +1 -0
- package/dist/esm/executor/ops/comparison.js +38 -0
- package/dist/esm/executor/ops/comparison.js.map +1 -0
- package/dist/esm/executor/ops/control.d.ts +1 -0
- package/dist/esm/executor/ops/control.js +205 -0
- package/dist/esm/executor/ops/control.js.map +1 -0
- package/dist/esm/executor/ops/functions.d.ts +1 -0
- package/dist/esm/executor/ops/functions.js +57 -0
- package/dist/esm/executor/ops/functions.js.map +1 -0
- package/dist/esm/executor/ops/index.d.ts +0 -0
- package/dist/esm/executor/ops/index.js +11 -0
- package/dist/esm/executor/ops/literals.d.ts +1 -0
- package/dist/esm/executor/ops/literals.js +47 -0
- package/dist/esm/executor/ops/literals.js.map +1 -0
- package/dist/esm/executor/ops/misc.d.ts +1 -0
- package/dist/esm/executor/ops/misc.js +27 -0
- package/dist/esm/executor/ops/misc.js.map +1 -0
- package/dist/esm/executor/ops/object.d.ts +1 -0
- package/dist/esm/executor/ops/object.js +53 -0
- package/dist/esm/executor/ops/object.js.map +1 -0
- package/dist/esm/executor/ops/prop.d.ts +1 -0
- package/dist/esm/executor/ops/prop.js +72 -0
- package/dist/esm/executor/ops/prop.js.map +1 -0
- package/dist/esm/executor/ops/unary.d.ts +1 -0
- package/dist/esm/executor/ops/unary.js +50 -0
- package/dist/esm/executor/ops/unary.js.map +1 -0
- package/dist/esm/executor/ops/variables.d.ts +1 -0
- package/dist/esm/executor/ops/variables.js +18 -0
- package/dist/esm/executor/ops/variables.js.map +1 -0
- package/dist/esm/executor/opsRegistry.d.ts +33 -0
- package/dist/esm/executor/opsRegistry.js +9 -0
- package/dist/esm/executor/opsRegistry.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/parser/index.d.ts +3 -0
- package/dist/esm/parser/index.js +1 -0
- package/{build/parser.d.ts → dist/esm/parser/lisp.d.ts} +29 -42
- package/dist/esm/parser/lispTypes/conditionals.d.ts +2 -0
- package/dist/esm/parser/lispTypes/conditionals.js +137 -0
- package/dist/esm/parser/lispTypes/conditionals.js.map +1 -0
- package/dist/esm/parser/lispTypes/control.d.ts +2 -0
- package/dist/esm/parser/lispTypes/control.js +206 -0
- package/dist/esm/parser/lispTypes/control.js.map +1 -0
- package/dist/esm/parser/lispTypes/declarations.d.ts +2 -0
- package/dist/esm/parser/lispTypes/declarations.js +101 -0
- package/dist/esm/parser/lispTypes/declarations.js.map +1 -0
- package/dist/esm/parser/lispTypes/index.d.ts +3 -0
- package/dist/esm/parser/lispTypes/index.js +19 -0
- package/dist/esm/parser/lispTypes/index.js.map +1 -0
- package/dist/esm/parser/lispTypes/operators.d.ts +2 -0
- package/dist/esm/parser/lispTypes/operators.js +254 -0
- package/dist/esm/parser/lispTypes/operators.js.map +1 -0
- package/dist/esm/parser/lispTypes/shared.d.ts +38 -0
- package/dist/esm/parser/lispTypes/structures.d.ts +2 -0
- package/dist/esm/parser/lispTypes/structures.js +190 -0
- package/dist/esm/parser/lispTypes/structures.js.map +1 -0
- package/dist/esm/parser/lispTypes/values.d.ts +2 -0
- package/dist/esm/parser/lispTypes/values.js +91 -0
- package/dist/esm/parser/lispTypes/values.js.map +1 -0
- package/dist/esm/parser/parserUtils.d.ts +34 -0
- package/dist/esm/parser/parserUtils.js +959 -0
- package/dist/esm/parser/parserUtils.js.map +1 -0
- package/dist/esm/utils/CodeString.d.ts +16 -0
- package/dist/esm/utils/CodeString.js +66 -0
- package/dist/esm/utils/CodeString.js.map +1 -0
- package/dist/esm/utils/ExecContext.d.ts +34 -0
- package/dist/esm/utils/ExecContext.js +168 -0
- package/dist/esm/utils/ExecContext.js.map +1 -0
- package/dist/esm/utils/Prop.d.ts +16 -0
- package/dist/esm/utils/Prop.js +80 -0
- package/dist/esm/utils/Prop.js.map +1 -0
- package/dist/esm/utils/Scope.d.ts +47 -0
- package/dist/esm/utils/Scope.js +122 -0
- package/dist/esm/utils/Scope.js.map +1 -0
- package/dist/esm/utils/errors.d.ts +10 -0
- package/dist/esm/utils/errors.js +10 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/functionReplacements.d.ts +11 -0
- package/dist/esm/utils/functionReplacements.js +361 -0
- package/dist/esm/utils/functionReplacements.js.map +1 -0
- package/dist/esm/utils/index.d.ts +7 -0
- package/dist/esm/utils/index.js +7 -0
- package/dist/esm/utils/types.d.ts +221 -0
- package/dist/esm/utils/types.js +160 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/dist/esm/utils/unraw.js +147 -0
- package/dist/esm/utils/unraw.js.map +1 -0
- package/dist/umd/Sandbox.min.js +2 -0
- package/dist/umd/Sandbox.min.js.map +1 -0
- package/dist/umd/SandboxExec.min.js +2 -0
- package/dist/umd/SandboxExec.min.js.map +1 -0
- package/package.json +11 -9
- package/build/Sandbox.js +0 -62
- package/build/SandboxExec.js +0 -214
- package/build/eval.js +0 -205
- package/build/executor.d.ts +0 -124
- package/build/executor.js +0 -1554
- package/build/parser.js +0 -1527
- package/build/unraw.js +0 -168
- package/build/utils.d.ts +0 -264
- package/build/utils.js +0 -362
- package/dist/Sandbox.d.ts +0 -25
- package/dist/Sandbox.js +0 -270
- package/dist/Sandbox.js.map +0 -1
- package/dist/Sandbox.min.js +0 -2
- package/dist/Sandbox.min.js.map +0 -1
- package/dist/SandboxExec.js +0 -218
- package/dist/SandboxExec.js.map +0 -1
- package/dist/SandboxExec.min.js +0 -2
- package/dist/SandboxExec.min.js.map +0 -1
- package/dist/executor.d.ts +0 -124
- package/dist/executor.js +0 -1558
- package/dist/executor.js.map +0 -1
- package/dist/node/Sandbox.js +0 -277
- package/dist/node/SandboxExec.d.ts +0 -66
- package/dist/node/SandboxExec.js +0 -225
- package/dist/node/eval.d.ts +0 -27
- package/dist/node/executor.d.ts +0 -124
- package/dist/node/executor.js +0 -1575
- package/dist/node/parser.d.ts +0 -154
- package/dist/node/parser.js +0 -1704
- package/dist/node/utils.d.ts +0 -264
- package/dist/node/utils.js +0 -385
- package/dist/parser.js +0 -1690
- package/dist/parser.js.map +0 -1
- package/dist/unraw.d.ts +0 -11
- package/dist/utils.d.ts +0 -264
- package/dist/utils.js +0 -365
- package/dist/utils.js.map +0 -1
- /package/{build → dist/cjs/utils}/unraw.d.ts +0 -0
- /package/dist/{node → esm/utils}/unraw.d.ts +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { CodeString } from "../../utils/CodeString.js";
|
|
2
|
+
import { LispType } from "../../utils/types.js";
|
|
3
|
+
import { isLisp } from "../../utils/ExecContext.js";
|
|
4
|
+
import "../../utils/index.js";
|
|
5
|
+
//#region src/parser/lispTypes/operators.ts
|
|
6
|
+
function registerOperatorLispTypes({ createLisp, expandDestructure, expectTypes, getDestructurePatternSource, lispifyBlock, restOfExp, lispify, lispifyExpr, setLispType }) {
|
|
7
|
+
const inlineIfElse = /^:/;
|
|
8
|
+
const modifierTypes = {
|
|
9
|
+
inverse: LispType.Inverse,
|
|
10
|
+
not: LispType.Not,
|
|
11
|
+
positive: LispType.Positive,
|
|
12
|
+
negative: LispType.Negative,
|
|
13
|
+
typeof: LispType.Typeof,
|
|
14
|
+
delete: LispType.Delete
|
|
15
|
+
};
|
|
16
|
+
setLispType([
|
|
17
|
+
"inverse",
|
|
18
|
+
"not",
|
|
19
|
+
"negative",
|
|
20
|
+
"positive",
|
|
21
|
+
"typeof",
|
|
22
|
+
"delete"
|
|
23
|
+
], (ctx) => {
|
|
24
|
+
const { constants, type, part, res, expect } = ctx;
|
|
25
|
+
const extract = restOfExp(constants, part.substring(res[0].length), [/^([^\s.?\w$]|\?[^.])/]);
|
|
26
|
+
if (part.substring(extract.length + res[0].length).trim().toString().startsWith("**")) throw new SyntaxError("Unary operator used immediately before exponentiation expression. Parenthesis must be used to disambiguate operator precedence");
|
|
27
|
+
ctx.lispTree = lispify(constants, part.substring(extract.length + res[0].length), restOfExp.next, createLisp({
|
|
28
|
+
op: modifierTypes[type],
|
|
29
|
+
a: ctx.lispTree,
|
|
30
|
+
b: lispify(constants, extract, expectTypes[expect].next)
|
|
31
|
+
}), false, ctx);
|
|
32
|
+
});
|
|
33
|
+
setLispType(["taggedTemplate"], (ctx) => {
|
|
34
|
+
const { constants, part, res, expect } = ctx;
|
|
35
|
+
const literalIndex = res[1];
|
|
36
|
+
const [, templateStr, jsExprs] = constants.literals[parseInt(literalIndex)];
|
|
37
|
+
const stringParts = [];
|
|
38
|
+
const expressions = [];
|
|
39
|
+
let currentStr = "";
|
|
40
|
+
let i = 0;
|
|
41
|
+
while (i < templateStr.length) if (templateStr.substring(i, i + 2) === "${") {
|
|
42
|
+
let j = i + 2;
|
|
43
|
+
let exprIndex = "";
|
|
44
|
+
let isValidPlaceholder = false;
|
|
45
|
+
while (j < templateStr.length && templateStr[j] !== "}") {
|
|
46
|
+
exprIndex += templateStr[j];
|
|
47
|
+
j++;
|
|
48
|
+
}
|
|
49
|
+
if (j < templateStr.length && templateStr[j] === "}" && /^\d+$/.test(exprIndex)) isValidPlaceholder = true;
|
|
50
|
+
if (isValidPlaceholder) {
|
|
51
|
+
stringParts.push(currentStr);
|
|
52
|
+
currentStr = "";
|
|
53
|
+
expressions.push(jsExprs[parseInt(exprIndex)]);
|
|
54
|
+
i = j + 1;
|
|
55
|
+
} else {
|
|
56
|
+
currentStr += templateStr[i];
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
currentStr += templateStr[i];
|
|
61
|
+
i++;
|
|
62
|
+
}
|
|
63
|
+
stringParts.push(currentStr);
|
|
64
|
+
const stringsArray = stringParts.map((str) => createLisp({
|
|
65
|
+
op: LispType.StringIndex,
|
|
66
|
+
a: LispType.None,
|
|
67
|
+
b: String(constants.strings.push(str) - 1)
|
|
68
|
+
}));
|
|
69
|
+
const stringsArrayLisp = createLisp({
|
|
70
|
+
op: LispType.CreateArray,
|
|
71
|
+
a: createLisp({
|
|
72
|
+
op: LispType.None,
|
|
73
|
+
a: LispType.None,
|
|
74
|
+
b: LispType.None
|
|
75
|
+
}),
|
|
76
|
+
b: stringsArray
|
|
77
|
+
});
|
|
78
|
+
ctx.lispTree = lispify(constants, part.substring(res[0].length), expectTypes[expect].next, createLisp({
|
|
79
|
+
op: LispType.Call,
|
|
80
|
+
a: ctx.lispTree,
|
|
81
|
+
b: [stringsArrayLisp, ...expressions]
|
|
82
|
+
}), false, ctx);
|
|
83
|
+
});
|
|
84
|
+
const incrementTypes = {
|
|
85
|
+
"++$": LispType.IncrementBefore,
|
|
86
|
+
"--$": LispType.DecrementBefore,
|
|
87
|
+
"$++": LispType.IncrementAfter,
|
|
88
|
+
"$--": LispType.DecrementAfter
|
|
89
|
+
};
|
|
90
|
+
setLispType(["incrementerBefore"], (ctx) => {
|
|
91
|
+
const { constants, part, res } = ctx;
|
|
92
|
+
const extract = restOfExp(constants, part.substring(2), [/^[^\s.\w$]/]);
|
|
93
|
+
ctx.lispTree = lispify(constants, part.substring(extract.length + 2), restOfExp.next, createLisp({
|
|
94
|
+
op: incrementTypes[res[0] + "$"],
|
|
95
|
+
a: lispify(constants, extract, expectTypes.incrementerBefore.next),
|
|
96
|
+
b: LispType.None
|
|
97
|
+
}), false, ctx);
|
|
98
|
+
});
|
|
99
|
+
setLispType(["incrementerAfter"], (ctx) => {
|
|
100
|
+
const { constants, part, res, expect } = ctx;
|
|
101
|
+
if (ctx.lispTree[0] === LispType.Number || ctx.lispTree[0] === LispType.BigInt || ctx.lispTree[0] === LispType.GlobalSymbol || ctx.lispTree[0] === LispType.StringIndex || ctx.lispTree[0] === LispType.LiteralIndex || ctx.lispTree[0] === LispType.RegexIndex) throw new SyntaxError("Invalid left-hand side expression in postfix operation");
|
|
102
|
+
ctx.lispTree = lispify(constants, part.substring(res[0].length), expectTypes[expect].next, createLisp({
|
|
103
|
+
op: incrementTypes["$" + res[0]],
|
|
104
|
+
a: ctx.lispTree,
|
|
105
|
+
b: LispType.None
|
|
106
|
+
}), false, ctx);
|
|
107
|
+
});
|
|
108
|
+
const adderTypes = {
|
|
109
|
+
"&&": LispType.And,
|
|
110
|
+
"||": LispType.Or,
|
|
111
|
+
"??": LispType.NullishCoalescing,
|
|
112
|
+
instanceof: LispType.Instanceof,
|
|
113
|
+
in: LispType.In,
|
|
114
|
+
"=": LispType.Assign,
|
|
115
|
+
"-=": LispType.SubractEquals,
|
|
116
|
+
"+=": LispType.AddEquals,
|
|
117
|
+
"/=": LispType.DivideEquals,
|
|
118
|
+
"**=": LispType.PowerEquals,
|
|
119
|
+
"*=": LispType.MultiplyEquals,
|
|
120
|
+
"%=": LispType.ModulusEquals,
|
|
121
|
+
"^=": LispType.BitNegateEquals,
|
|
122
|
+
"&=": LispType.BitAndEquals,
|
|
123
|
+
"|=": LispType.BitOrEquals,
|
|
124
|
+
">>>=": LispType.UnsignedShiftRightEquals,
|
|
125
|
+
"<<=": LispType.ShiftLeftEquals,
|
|
126
|
+
">>=": LispType.ShiftRightEquals,
|
|
127
|
+
"&&=": LispType.AndEquals,
|
|
128
|
+
"||=": LispType.OrEquals,
|
|
129
|
+
"??=": LispType.NullishCoalescingEquals
|
|
130
|
+
};
|
|
131
|
+
setLispType([
|
|
132
|
+
"assign",
|
|
133
|
+
"assignModify",
|
|
134
|
+
"nullishCoalescing"
|
|
135
|
+
], (ctx) => {
|
|
136
|
+
const { constants, type, part, res } = ctx;
|
|
137
|
+
if (type !== "nullishCoalescing" && isLisp(ctx.lispTree) && (ctx.lispTree[0] === LispType.PropOptional || ctx.lispTree[0] === LispType.CallOptional)) throw new SyntaxError("Invalid left-hand side in assignment");
|
|
138
|
+
if (res[0] === "=") {
|
|
139
|
+
const patternStr = getDestructurePatternSource(ctx.lispTree);
|
|
140
|
+
if (patternStr) {
|
|
141
|
+
const rhsStr = part.substring(res[0].length).toString();
|
|
142
|
+
const tempName = `$$_da${Math.random().toString(36).slice(2)}`;
|
|
143
|
+
const expandedCode = `internal ${tempName} = (${rhsStr}); ${expandDestructure("", patternStr, tempName)}; ${tempName}`;
|
|
144
|
+
ctx.lispTree = createLisp({
|
|
145
|
+
op: LispType.InternalBlock,
|
|
146
|
+
a: lispifyBlock(new CodeString(expandedCode), constants, false, ctx),
|
|
147
|
+
b: LispType.None
|
|
148
|
+
});
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
ctx.lispTree = createLisp({
|
|
153
|
+
op: adderTypes[res[0]],
|
|
154
|
+
a: ctx.lispTree,
|
|
155
|
+
b: lispify(constants, part.substring(res[0].length), expectTypes.assignment.next, void 0, false, {
|
|
156
|
+
...ctx,
|
|
157
|
+
lispDepth: ctx.lispDepth + 1
|
|
158
|
+
})
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
const opTypes = {
|
|
162
|
+
"&": LispType.BitAnd,
|
|
163
|
+
"|": LispType.BitOr,
|
|
164
|
+
"^": LispType.BitNegate,
|
|
165
|
+
"<<": LispType.BitShiftLeft,
|
|
166
|
+
">>": LispType.BitShiftRight,
|
|
167
|
+
">>>": LispType.BitUnsignedShiftRight,
|
|
168
|
+
"<=": LispType.SmallerEqualThan,
|
|
169
|
+
">=": LispType.LargerEqualThan,
|
|
170
|
+
"<": LispType.SmallerThan,
|
|
171
|
+
">": LispType.LargerThan,
|
|
172
|
+
"!==": LispType.StrictNotEqual,
|
|
173
|
+
"!=": LispType.NotEqual,
|
|
174
|
+
"===": LispType.StrictEqual,
|
|
175
|
+
"==": LispType.Equal,
|
|
176
|
+
"+": LispType.Plus,
|
|
177
|
+
"-": LispType.Minus,
|
|
178
|
+
"/": LispType.Divide,
|
|
179
|
+
"**": LispType.Power,
|
|
180
|
+
"*": LispType.Multiply,
|
|
181
|
+
"%": LispType.Modulus,
|
|
182
|
+
"&&": LispType.And,
|
|
183
|
+
"||": LispType.Or,
|
|
184
|
+
instanceof: LispType.Instanceof,
|
|
185
|
+
in: LispType.In
|
|
186
|
+
};
|
|
187
|
+
setLispType([
|
|
188
|
+
"power",
|
|
189
|
+
"opHigh",
|
|
190
|
+
"op",
|
|
191
|
+
"comparitor",
|
|
192
|
+
"bitwiseShift",
|
|
193
|
+
"bitwiseAnd",
|
|
194
|
+
"bitwiseXor",
|
|
195
|
+
"bitwiseOr",
|
|
196
|
+
"boolOpAnd",
|
|
197
|
+
"boolOpOr"
|
|
198
|
+
], (ctx) => {
|
|
199
|
+
const { constants, type, part, res } = ctx;
|
|
200
|
+
const next = [expectTypes.inlineIf.types.inlineIf, inlineIfElse];
|
|
201
|
+
switch (type) {
|
|
202
|
+
case "power": break;
|
|
203
|
+
case "opHigh": next.push(expectTypes.splitter.types.opHigh);
|
|
204
|
+
case "op": next.push(expectTypes.splitter.types.op);
|
|
205
|
+
case "comparitor": next.push(expectTypes.splitter.types.comparitor);
|
|
206
|
+
case "bitwiseShift": next.push(expectTypes.splitter.types.bitwiseShift);
|
|
207
|
+
case "bitwiseAnd": next.push(expectTypes.splitter.types.bitwiseAnd);
|
|
208
|
+
case "bitwiseXor": next.push(expectTypes.splitter.types.bitwiseXor);
|
|
209
|
+
case "bitwiseOr": next.push(expectTypes.splitter.types.bitwiseOr);
|
|
210
|
+
case "boolOpAnd": next.push(expectTypes.splitter.types.boolOpAnd);
|
|
211
|
+
case "boolOpOr": next.push(expectTypes.splitter.types.boolOpOr);
|
|
212
|
+
}
|
|
213
|
+
const extract = restOfExp(constants, part.substring(res[0].length), next);
|
|
214
|
+
ctx.lispTree = lispify(constants, part.substring(extract.length + res[0].length), restOfExp.next, createLisp({
|
|
215
|
+
op: opTypes[res[0]],
|
|
216
|
+
a: ctx.lispTree,
|
|
217
|
+
b: lispify(constants, extract, expectTypes.splitter.next)
|
|
218
|
+
}), false, ctx);
|
|
219
|
+
});
|
|
220
|
+
setLispType(["inlineIf"], (ctx) => {
|
|
221
|
+
const { constants, part, res } = ctx;
|
|
222
|
+
let found = false;
|
|
223
|
+
const extract = part.substring(0, 0);
|
|
224
|
+
let quoteCount = 1;
|
|
225
|
+
while (!found && extract.length < part.length) {
|
|
226
|
+
extract.end = restOfExp(constants, part.substring(extract.length + 1), [expectTypes.inlineIf.types.inlineIf, inlineIfElse]).end;
|
|
227
|
+
if (part.char(extract.length) === "?") quoteCount++;
|
|
228
|
+
else quoteCount--;
|
|
229
|
+
if (!quoteCount) found = true;
|
|
230
|
+
}
|
|
231
|
+
extract.start = part.start + 1;
|
|
232
|
+
const falseExpr = part.substring(res[0].length + extract.length + 1);
|
|
233
|
+
if (!falseExpr.trimStart().length) throw new SyntaxError("Unexpected end of expression");
|
|
234
|
+
ctx.lispTree = createLisp({
|
|
235
|
+
op: LispType.InlineIf,
|
|
236
|
+
a: ctx.lispTree,
|
|
237
|
+
b: createLisp({
|
|
238
|
+
op: LispType.InlineIfCase,
|
|
239
|
+
a: lispifyExpr(constants, extract, void 0, {
|
|
240
|
+
...ctx,
|
|
241
|
+
lispDepth: ctx.lispDepth + 1
|
|
242
|
+
}),
|
|
243
|
+
b: lispifyExpr(constants, falseExpr, void 0, {
|
|
244
|
+
...ctx,
|
|
245
|
+
lispDepth: ctx.lispDepth + 1
|
|
246
|
+
})
|
|
247
|
+
})
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
//#endregion
|
|
252
|
+
export { registerOperatorLispTypes };
|
|
253
|
+
|
|
254
|
+
//# sourceMappingURL=operators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators.js","names":[],"sources":["../../../../src/parser/lispTypes/operators.ts"],"sourcesContent":["import { CodeString, isLisp, LispType } from '../../utils';\nimport type {\n AddEquals,\n And,\n AndEquals,\n Assigns,\n BigInt as BigIntLisp,\n BitAnd,\n BitAndEquals,\n BitNegate,\n BitNegateEquals,\n BitOr,\n BitOrEquals,\n BitShiftLeft,\n BitShiftRight,\n BitUnsignedShiftRight,\n Call,\n CreateArray,\n DecrementAfter,\n DecrementBefore,\n Delete,\n Divide,\n DivideEquals,\n Equal,\n GlobalSymbol,\n In,\n IncrementAfter,\n IncrementBefore,\n InlineIf,\n InlineIfCase,\n Instanceof,\n InternalCode,\n Inverse,\n LargerEqualThan,\n LargerThan,\n Lisp,\n Minus,\n Modulus,\n ModulusEquals,\n Multiply,\n MultiplyEquals,\n Negative,\n Not,\n NotEqual,\n NullishCoalescing,\n NullishCoalescingEquals,\n Number as NumberLisp,\n Or,\n OrEquals,\n Plus,\n Positive,\n Power,\n PowerEquals,\n ShiftLeftEquals,\n ShiftRightEquals,\n SmallerEqualThan,\n SmallerThan,\n StrictEqual,\n StrictNotEqual,\n StringIndex,\n SubractEquals,\n Typeof,\n UnsignedShiftRightEquals,\n} from '../lisp';\nimport type { RegisterLispTypesDeps } from './shared';\n\nexport function registerOperatorLispTypes({\n createLisp,\n expandDestructure,\n expectTypes,\n getDestructurePatternSource,\n lispifyBlock,\n restOfExp,\n lispify,\n lispifyExpr,\n setLispType,\n}: RegisterLispTypesDeps) {\n const inlineIfElse = /^:/;\n\n const modifierTypes = {\n inverse: LispType.Inverse,\n not: LispType.Not,\n positive: LispType.Positive,\n negative: LispType.Negative,\n typeof: LispType.Typeof,\n delete: LispType.Delete,\n } as const;\n\n setLispType(['inverse', 'not', 'negative', 'positive', 'typeof', 'delete'] as const, (ctx) => {\n const { constants, type, part, res, expect } = ctx;\n const extract = restOfExp(constants, part.substring(res[0].length), [/^([^\\s.?\\w$]|\\?[^.])/]);\n const remainingAfterOperand = part.substring(extract.length + res[0].length);\n const remainingStr = remainingAfterOperand.trim().toString();\n if (remainingStr.startsWith('**')) {\n throw new SyntaxError(\n 'Unary operator used immediately before exponentiation expression. Parenthesis must be used to disambiguate operator precedence',\n );\n }\n\n ctx.lispTree = lispify(\n constants,\n part.substring(extract.length + res[0].length),\n restOfExp.next,\n createLisp<Inverse | Not | Negative | Positive | Typeof | Delete>({\n op: modifierTypes[type],\n a: ctx.lispTree,\n b: lispify(constants, extract, expectTypes[expect].next),\n }),\n false,\n ctx,\n );\n });\n\n setLispType(['taggedTemplate'] as const, (ctx) => {\n const { constants, part, res, expect } = ctx;\n const literalIndex = res[1];\n const literal = constants.literals[parseInt(literalIndex)];\n const [, templateStr, jsExprs] = literal;\n const stringParts: string[] = [];\n const expressions: Lisp[] = [];\n let currentStr = '';\n let i = 0;\n\n while (i < templateStr.length) {\n if (templateStr.substring(i, i + 2) === '${') {\n let j = i + 2;\n let exprIndex = '';\n let isValidPlaceholder = false;\n while (j < templateStr.length && templateStr[j] !== '}') {\n exprIndex += templateStr[j];\n j++;\n }\n if (j < templateStr.length && templateStr[j] === '}' && /^\\d+$/.test(exprIndex)) {\n isValidPlaceholder = true;\n }\n\n if (isValidPlaceholder) {\n stringParts.push(currentStr);\n currentStr = '';\n expressions.push(jsExprs[parseInt(exprIndex)]);\n i = j + 1;\n } else {\n currentStr += templateStr[i];\n i++;\n }\n } else {\n currentStr += templateStr[i];\n i++;\n }\n }\n stringParts.push(currentStr);\n\n const stringsArray = stringParts.map((str) =>\n createLisp<StringIndex>({\n op: LispType.StringIndex,\n a: LispType.None,\n b: String(constants.strings.push(str) - 1),\n }),\n );\n\n const stringsArrayLisp = createLisp<CreateArray>({\n op: LispType.CreateArray,\n a: createLisp({\n op: LispType.None,\n a: LispType.None,\n b: LispType.None,\n }),\n b: stringsArray,\n });\n\n ctx.lispTree = lispify(\n constants,\n part.substring(res[0].length),\n expectTypes[expect].next,\n createLisp<Call>({\n op: LispType.Call,\n a: ctx.lispTree,\n b: [stringsArrayLisp, ...expressions],\n }),\n false,\n ctx,\n );\n });\n\n const incrementTypes = {\n '++$': LispType.IncrementBefore,\n '--$': LispType.DecrementBefore,\n '$++': LispType.IncrementAfter,\n '$--': LispType.DecrementAfter,\n } as any;\n\n setLispType(['incrementerBefore'] as const, (ctx) => {\n const { constants, part, res } = ctx;\n const extract = restOfExp(constants, part.substring(2), [/^[^\\s.\\w$]/]);\n ctx.lispTree = lispify(\n constants,\n part.substring(extract.length + 2),\n restOfExp.next,\n createLisp<IncrementBefore | DecrementBefore>({\n op: incrementTypes[res[0] + '$'],\n a: lispify(constants, extract, expectTypes.incrementerBefore.next),\n b: LispType.None,\n }),\n false,\n ctx,\n );\n });\n\n setLispType(['incrementerAfter'] as const, (ctx) => {\n const { constants, part, res, expect } = ctx;\n if (\n ctx.lispTree[0] === LispType.Number ||\n ctx.lispTree[0] === LispType.BigInt ||\n ctx.lispTree[0] === LispType.GlobalSymbol ||\n ctx.lispTree[0] === LispType.StringIndex ||\n ctx.lispTree[0] === LispType.LiteralIndex ||\n ctx.lispTree[0] === LispType.RegexIndex\n ) {\n throw new SyntaxError('Invalid left-hand side expression in postfix operation');\n }\n ctx.lispTree = lispify(\n constants,\n part.substring(res[0].length),\n expectTypes[expect].next,\n createLisp<IncrementAfter | DecrementAfter>({\n op: incrementTypes['$' + res[0]],\n a: ctx.lispTree,\n b: LispType.None,\n }),\n false,\n ctx,\n );\n });\n\n const adderTypes = {\n '&&': LispType.And,\n '||': LispType.Or,\n '??': LispType.NullishCoalescing,\n instanceof: LispType.Instanceof,\n in: LispType.In,\n '=': LispType.Assign,\n '-=': LispType.SubractEquals,\n '+=': LispType.AddEquals,\n '/=': LispType.DivideEquals,\n '**=': LispType.PowerEquals,\n '*=': LispType.MultiplyEquals,\n '%=': LispType.ModulusEquals,\n '^=': LispType.BitNegateEquals,\n '&=': LispType.BitAndEquals,\n '|=': LispType.BitOrEquals,\n '>>>=': LispType.UnsignedShiftRightEquals,\n '<<=': LispType.ShiftLeftEquals,\n '>>=': LispType.ShiftRightEquals,\n '&&=': LispType.AndEquals,\n '||=': LispType.OrEquals,\n '??=': LispType.NullishCoalescingEquals,\n } as any;\n\n setLispType(['assign', 'assignModify', 'nullishCoalescing'] as const, (ctx) => {\n const { constants, type, part, res } = ctx;\n if (\n type !== 'nullishCoalescing' &&\n isLisp(ctx.lispTree) &&\n (ctx.lispTree[0] === LispType.PropOptional || ctx.lispTree[0] === LispType.CallOptional)\n ) {\n throw new SyntaxError('Invalid left-hand side in assignment');\n }\n if (res[0] === '=') {\n const patternStr = getDestructurePatternSource(ctx.lispTree);\n if (patternStr) {\n const rhsStr = part.substring(res[0].length).toString();\n const tempName = `$$_da${Math.random().toString(36).slice(2)}`;\n const expandedCode = `internal ${tempName} = (${rhsStr}); ${expandDestructure('', patternStr, tempName)}; ${tempName}`;\n ctx.lispTree = createLisp<InternalCode>({\n op: LispType.InternalBlock,\n a: lispifyBlock(new CodeString(expandedCode), constants, false, ctx),\n b: LispType.None,\n });\n return;\n }\n }\n ctx.lispTree = createLisp<\n | NullishCoalescing\n | Assigns\n | SubractEquals\n | AddEquals\n | DivideEquals\n | PowerEquals\n | MultiplyEquals\n | ModulusEquals\n | BitNegateEquals\n | BitAndEquals\n | BitOrEquals\n | UnsignedShiftRightEquals\n | ShiftLeftEquals\n | ShiftRightEquals\n | AndEquals\n | OrEquals\n | NullishCoalescingEquals\n >({\n op: adderTypes[res[0]],\n a: ctx.lispTree,\n b: lispify(\n constants,\n part.substring(res[0].length),\n expectTypes.assignment.next,\n undefined,\n false,\n { ...ctx, lispDepth: ctx.lispDepth + 1 },\n ),\n });\n });\n\n const opTypes = {\n '&': LispType.BitAnd,\n '|': LispType.BitOr,\n '^': LispType.BitNegate,\n '<<': LispType.BitShiftLeft,\n '>>': LispType.BitShiftRight,\n '>>>': LispType.BitUnsignedShiftRight,\n '<=': LispType.SmallerEqualThan,\n '>=': LispType.LargerEqualThan,\n '<': LispType.SmallerThan,\n '>': LispType.LargerThan,\n '!==': LispType.StrictNotEqual,\n '!=': LispType.NotEqual,\n '===': LispType.StrictEqual,\n '==': LispType.Equal,\n '+': LispType.Plus,\n '-': LispType.Minus,\n '/': LispType.Divide,\n '**': LispType.Power,\n '*': LispType.Multiply,\n '%': LispType.Modulus,\n '&&': LispType.And,\n '||': LispType.Or,\n instanceof: LispType.Instanceof,\n in: LispType.In,\n } as any;\n\n setLispType(\n [\n 'power',\n 'opHigh',\n 'op',\n 'comparitor',\n 'bitwiseShift',\n 'bitwiseAnd',\n 'bitwiseXor',\n 'bitwiseOr',\n 'boolOpAnd',\n 'boolOpOr',\n ] as const,\n (ctx) => {\n const { constants, type, part, res } = ctx;\n const next = [expectTypes.inlineIf.types.inlineIf, inlineIfElse];\n switch (type) {\n case 'power':\n break;\n case 'opHigh':\n next.push(expectTypes.splitter.types.opHigh);\n case 'op':\n next.push(expectTypes.splitter.types.op);\n case 'comparitor':\n next.push(expectTypes.splitter.types.comparitor);\n case 'bitwiseShift':\n next.push(expectTypes.splitter.types.bitwiseShift);\n case 'bitwiseAnd':\n next.push(expectTypes.splitter.types.bitwiseAnd);\n case 'bitwiseXor':\n next.push(expectTypes.splitter.types.bitwiseXor);\n case 'bitwiseOr':\n next.push(expectTypes.splitter.types.bitwiseOr);\n case 'boolOpAnd':\n next.push(expectTypes.splitter.types.boolOpAnd);\n case 'boolOpOr':\n next.push(expectTypes.splitter.types.boolOpOr);\n }\n const extract = restOfExp(constants, part.substring(res[0].length), next);\n ctx.lispTree = lispify(\n constants,\n part.substring(extract.length + res[0].length),\n restOfExp.next,\n createLisp<\n | BitAnd\n | BitOr\n | BitNegate\n | BitShiftLeft\n | BitShiftRight\n | BitUnsignedShiftRight\n | SmallerEqualThan\n | LargerEqualThan\n | SmallerThan\n | LargerThan\n | StrictNotEqual\n | NotEqual\n | StrictEqual\n | Equal\n | Plus\n | Minus\n | Divide\n | Power\n | Multiply\n | Modulus\n | And\n | Or\n | Instanceof\n | In\n >({\n op: opTypes[res[0]],\n a: ctx.lispTree,\n b: lispify(constants, extract, expectTypes.splitter.next),\n }),\n false,\n ctx,\n );\n },\n );\n\n setLispType(['inlineIf'] as const, (ctx) => {\n const { constants, part, res } = ctx;\n let found = false;\n const extract = part.substring(0, 0);\n let quoteCount = 1;\n while (!found && extract.length < part.length) {\n extract.end = restOfExp(constants, part.substring(extract.length + 1), [\n expectTypes.inlineIf.types.inlineIf,\n inlineIfElse,\n ]).end;\n if (part.char(extract.length) === '?') {\n quoteCount++;\n } else {\n quoteCount--;\n }\n if (!quoteCount) {\n found = true;\n }\n }\n extract.start = part.start + 1;\n const falseExpr = part.substring(res[0].length + extract.length + 1);\n if (!falseExpr.trimStart().length) {\n throw new SyntaxError('Unexpected end of expression');\n }\n ctx.lispTree = createLisp<InlineIf>({\n op: LispType.InlineIf,\n a: ctx.lispTree,\n b: createLisp<InlineIfCase>({\n op: LispType.InlineIfCase,\n a: lispifyExpr(constants, extract, undefined, { ...ctx, lispDepth: ctx.lispDepth + 1 }),\n b: lispifyExpr(constants, falseExpr, undefined, { ...ctx, lispDepth: ctx.lispDepth + 1 }),\n }),\n });\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CodeString } from '../../utils';
|
|
2
|
+
import { ExtractLispA, ExtractLispB, ExtractLispOp, IConstants, Lisp, LispCallback, LispDepthCtx, LispItem, None, Return } from '../lisp';
|
|
3
|
+
export interface RegisterLispTypesDeps {
|
|
4
|
+
NullLisp: None;
|
|
5
|
+
ParseError: new (message: string, code: string) => Error;
|
|
6
|
+
createLisp: <L extends Lisp>(obj: {
|
|
7
|
+
op: ExtractLispOp<L>;
|
|
8
|
+
a: ExtractLispA<L>;
|
|
9
|
+
b: ExtractLispB<L>;
|
|
10
|
+
}) => L;
|
|
11
|
+
emptyString: CodeString;
|
|
12
|
+
expectTypes: Record<string, {
|
|
13
|
+
types: Record<string, RegExp>;
|
|
14
|
+
next: string[];
|
|
15
|
+
}>;
|
|
16
|
+
expandDestructure: (keyword: string, patternStr: string, rhsStr: string) => string;
|
|
17
|
+
expandFunctionParamDestructure: (args: string[], funcBody: string) => {
|
|
18
|
+
args: string[];
|
|
19
|
+
body: string;
|
|
20
|
+
};
|
|
21
|
+
extractStatementLabels: (prefix?: string) => string[];
|
|
22
|
+
findPatternEndIdx: (s: string) => number;
|
|
23
|
+
getDestructurePatternSource: (tree: LispItem) => string | null;
|
|
24
|
+
insertSemicolons: (constants: IConstants, str: CodeString) => CodeString;
|
|
25
|
+
lispify: (constants: IConstants, part: CodeString, expected?: readonly string[], lispTree?: Lisp, topLevel?: boolean, depthCtx?: LispDepthCtx) => Lisp;
|
|
26
|
+
lispifyBlock: (str: CodeString, constants: IConstants, expression?: boolean, depthCtx?: LispDepthCtx) => Lisp[];
|
|
27
|
+
lispifyExpr: (constants: IConstants, str: CodeString, expected?: readonly string[], depthCtx?: LispDepthCtx) => Lisp;
|
|
28
|
+
lispifyFunction: (str: CodeString, constants: IConstants, expression?: boolean, depthCtx?: LispDepthCtx) => Lisp[];
|
|
29
|
+
lispifyReturnExpr: (constants: IConstants, str: CodeString) => Return;
|
|
30
|
+
restOfExp: ((constants: IConstants, part: CodeString, tests?: RegExp[], quote?: string, firstOpening?: string, closingsTests?: RegExp[], details?: any, depth?: number) => CodeString) & {
|
|
31
|
+
next: string[];
|
|
32
|
+
};
|
|
33
|
+
semiColon: RegExp;
|
|
34
|
+
setLispType: <T extends readonly string[]>(types: T, fn: LispCallback<T[number]>) => void;
|
|
35
|
+
splitByCommasDestructure: (s: string) => string[];
|
|
36
|
+
startingExecpted: readonly string[];
|
|
37
|
+
wrapLabeledStatement: <T extends Lisp>(labels: string[], statement: T) => Lisp;
|
|
38
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { RegisterLispTypesDeps } from './shared';
|
|
2
|
+
export declare function registerStructureLispTypes({ NullLisp, createLisp, emptyString, expectTypes, expandDestructure, findPatternEndIdx, lispify, lispifyBlock, lispifyExpr, restOfExp, setLispType, }: RegisterLispTypesDeps): void;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { CodeString } from "../../utils/CodeString.js";
|
|
2
|
+
import { LispType, reservedWords } from "../../utils/types.js";
|
|
3
|
+
import { isLisp } from "../../utils/ExecContext.js";
|
|
4
|
+
import "../../utils/index.js";
|
|
5
|
+
//#region src/parser/lispTypes/structures.ts
|
|
6
|
+
function registerStructureLispTypes({ NullLisp, createLisp, emptyString, expectTypes, expandDestructure, findPatternEndIdx, lispify, lispifyBlock, lispifyExpr, restOfExp, setLispType }) {
|
|
7
|
+
const closingsCreate = {
|
|
8
|
+
createArray: /^\]/,
|
|
9
|
+
createObject: /^\}/,
|
|
10
|
+
group: /^\)/,
|
|
11
|
+
arrayProp: /^\]/,
|
|
12
|
+
call: /^\)/
|
|
13
|
+
};
|
|
14
|
+
const typesCreate = {
|
|
15
|
+
createArray: LispType.CreateArray,
|
|
16
|
+
createObject: LispType.CreateObject,
|
|
17
|
+
group: LispType.Group,
|
|
18
|
+
arrayProp: LispType.ArrayProp,
|
|
19
|
+
call: LispType.Call,
|
|
20
|
+
prop: LispType.Prop,
|
|
21
|
+
"?prop": LispType.PropOptional,
|
|
22
|
+
"?call": LispType.CallOptional
|
|
23
|
+
};
|
|
24
|
+
setLispType([
|
|
25
|
+
"createArray",
|
|
26
|
+
"createObject",
|
|
27
|
+
"group",
|
|
28
|
+
"arrayProp",
|
|
29
|
+
"call"
|
|
30
|
+
], (ctx) => {
|
|
31
|
+
const { constants, type, part, res, expect } = ctx;
|
|
32
|
+
let extract = emptyString;
|
|
33
|
+
const arg = [];
|
|
34
|
+
const argIsHole = [];
|
|
35
|
+
let end = false;
|
|
36
|
+
let i = res[0].length;
|
|
37
|
+
const start = i;
|
|
38
|
+
while (i < part.length && !end) {
|
|
39
|
+
extract = restOfExp(constants, part.substring(i), [closingsCreate[type], /^,/]);
|
|
40
|
+
i += extract.length;
|
|
41
|
+
if (extract.trim().length) {
|
|
42
|
+
arg.push(extract);
|
|
43
|
+
argIsHole.push(false);
|
|
44
|
+
} else if (type === "createArray" && part.char(i) === ",") {
|
|
45
|
+
arg.push(extract);
|
|
46
|
+
argIsHole.push(true);
|
|
47
|
+
}
|
|
48
|
+
if (part.char(i) !== ",") end = true;
|
|
49
|
+
else {
|
|
50
|
+
if (!extract.trim().length && type === "call") throw new SyntaxError("Unexpected end of expression");
|
|
51
|
+
if (!extract.trim().length && type === "createObject") throw new SyntaxError("Unexpected token ,");
|
|
52
|
+
i++;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const next = type === "createArray" || type === "createObject" || type === "group" ? [
|
|
56
|
+
"value",
|
|
57
|
+
"modifier",
|
|
58
|
+
"prop",
|
|
59
|
+
"incrementerBefore",
|
|
60
|
+
"assignment",
|
|
61
|
+
"expEnd"
|
|
62
|
+
] : [
|
|
63
|
+
"value",
|
|
64
|
+
"modifier",
|
|
65
|
+
"prop",
|
|
66
|
+
"incrementerBefore",
|
|
67
|
+
"expEnd"
|
|
68
|
+
];
|
|
69
|
+
let l;
|
|
70
|
+
let funcFound;
|
|
71
|
+
switch (type) {
|
|
72
|
+
case "group": {
|
|
73
|
+
const groupContentStr = part.substring(start, i).trim().toString();
|
|
74
|
+
if (groupContentStr.startsWith("{") || groupContentStr.startsWith("[")) {
|
|
75
|
+
const patternEnd = findPatternEndIdx(groupContentStr);
|
|
76
|
+
const patternStr = groupContentStr.slice(0, patternEnd).trim();
|
|
77
|
+
const afterPattern = groupContentStr.slice(patternEnd).trimStart();
|
|
78
|
+
if (afterPattern.startsWith("=")) {
|
|
79
|
+
const rhsStr = afterPattern.slice(1).trim();
|
|
80
|
+
const tempName = `$$_da${Math.random().toString(36).slice(2)}`;
|
|
81
|
+
const expandedCode = `internal ${tempName} = (${rhsStr}); ${expandDestructure("", patternStr, tempName)}; ${tempName}`;
|
|
82
|
+
l = createLisp({
|
|
83
|
+
op: LispType.InternalBlock,
|
|
84
|
+
a: lispifyBlock(new CodeString(expandedCode), constants, false, ctx),
|
|
85
|
+
b: LispType.None
|
|
86
|
+
});
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
case "arrayProp": {
|
|
92
|
+
const arrayPropExpr = part.substring(start, i);
|
|
93
|
+
if (!arrayPropExpr.trimStart().length) throw new SyntaxError("Unexpected end of expression");
|
|
94
|
+
l = lispifyExpr(constants, arrayPropExpr, void 0, {
|
|
95
|
+
...ctx,
|
|
96
|
+
lispDepth: ctx.lispDepth + 1
|
|
97
|
+
});
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case "call":
|
|
101
|
+
l = arg.map((e) => lispify(constants, e, [...next, "spreadArray"], void 0, false, ctx));
|
|
102
|
+
break;
|
|
103
|
+
case "createArray":
|
|
104
|
+
l = arg.map((e, idx) => argIsHole[idx] ? createLisp({
|
|
105
|
+
op: LispType.Hole,
|
|
106
|
+
a: LispType.None,
|
|
107
|
+
b: LispType.None
|
|
108
|
+
}) : lispify(constants, e, [...next, "spreadArray"], void 0, false, ctx));
|
|
109
|
+
break;
|
|
110
|
+
case "createObject":
|
|
111
|
+
l = arg.map((str) => {
|
|
112
|
+
str = str.trimStart();
|
|
113
|
+
let value;
|
|
114
|
+
let key = "";
|
|
115
|
+
if (str.char(0) === "[") {
|
|
116
|
+
const innerExpr = restOfExp(constants, str.substring(1), [], "[");
|
|
117
|
+
const afterBracket = str.substring(1 + innerExpr.length + 1).trimStart();
|
|
118
|
+
key = lispify(constants, innerExpr, next);
|
|
119
|
+
if (afterBracket.length > 0 && afterBracket.char(0) === ":") value = lispify(constants, afterBracket.substring(1));
|
|
120
|
+
else if (afterBracket.length > 0 && afterBracket.char(0) === "(") value = lispify(constants, new CodeString("function" + afterBracket.toString()));
|
|
121
|
+
else throw new SyntaxError("Unexpected token in computed property");
|
|
122
|
+
return createLisp({
|
|
123
|
+
op: LispType.KeyVal,
|
|
124
|
+
a: key,
|
|
125
|
+
b: value
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
funcFound = expectTypes.expFunction.types.function.exec("function " + str);
|
|
129
|
+
if (funcFound) {
|
|
130
|
+
key = funcFound[3].trimStart();
|
|
131
|
+
value = lispify(constants, new CodeString("function " + str.toString().replace(key, "")));
|
|
132
|
+
} else {
|
|
133
|
+
const extract = restOfExp(constants, str, [/^:/]);
|
|
134
|
+
key = lispify(constants, extract, [...next, "spreadObject"]);
|
|
135
|
+
if (isLisp(key) && key[0] === LispType.SpreadObject) value = NullLisp;
|
|
136
|
+
else {
|
|
137
|
+
if (key[0] === LispType.Prop) key = key[2];
|
|
138
|
+
if (str.length > extract.length && str.char(extract.length) === ":") value = lispify(constants, str.substring(extract.length + 1));
|
|
139
|
+
else value = lispify(constants, extract, next);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return createLisp({
|
|
143
|
+
op: LispType.KeyVal,
|
|
144
|
+
a: key,
|
|
145
|
+
b: value
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
const lisptype = type === "arrayProp" ? res[1] ? LispType.PropOptional : LispType.Prop : type === "call" ? res[1] ? LispType.CallOptional : LispType.Call : typesCreate[type];
|
|
151
|
+
const currentTree = createLisp({
|
|
152
|
+
op: lisptype,
|
|
153
|
+
a: ctx.lispTree,
|
|
154
|
+
b: l
|
|
155
|
+
});
|
|
156
|
+
if (lisptype === LispType.Group || lisptype === LispType.CreateArray || lisptype === LispType.CreateObject) currentTree.source = part.substring(start, i).toString();
|
|
157
|
+
ctx.lispTree = lispify(constants, part.substring(i + 1), expectTypes[expect].next, currentTree, false, ctx);
|
|
158
|
+
});
|
|
159
|
+
setLispType(["dot", "prop"], (ctx) => {
|
|
160
|
+
const { constants, type, part, res, expect } = ctx;
|
|
161
|
+
let prop = res[0];
|
|
162
|
+
let index = res[0].length;
|
|
163
|
+
let op = "prop";
|
|
164
|
+
if (type === "dot") {
|
|
165
|
+
if (res[1]) op = "?prop";
|
|
166
|
+
const matches = part.substring(res[0].length).toString().match(expectTypes.prop.types.prop);
|
|
167
|
+
if (matches && matches.length) {
|
|
168
|
+
prop = matches[0];
|
|
169
|
+
index = prop.length + res[0].length;
|
|
170
|
+
} else throw new SyntaxError("Hanging dot");
|
|
171
|
+
} else if (reservedWords.has(prop) && prop !== "this") throw new SyntaxError(`Unexpected token '${prop}'`);
|
|
172
|
+
ctx.lispTree = lispify(constants, part.substring(index), expectTypes[expect].next, createLisp({
|
|
173
|
+
op: typesCreate[op],
|
|
174
|
+
a: ctx.lispTree,
|
|
175
|
+
b: prop
|
|
176
|
+
}), false, ctx);
|
|
177
|
+
});
|
|
178
|
+
setLispType(["spreadArray", "spreadObject"], (ctx) => {
|
|
179
|
+
const { constants, type, part, res, expect } = ctx;
|
|
180
|
+
ctx.lispTree = createLisp({
|
|
181
|
+
op: type === "spreadArray" ? LispType.SpreadArray : LispType.SpreadObject,
|
|
182
|
+
a: LispType.None,
|
|
183
|
+
b: lispify(constants, part.substring(res[0].length), expectTypes[expect].next)
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//#endregion
|
|
188
|
+
export { registerStructureLispTypes };
|
|
189
|
+
|
|
190
|
+
//# sourceMappingURL=structures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structures.js","names":[],"sources":["../../../../src/parser/lispTypes/structures.ts"],"sourcesContent":["import { CodeString, isLisp, LispType, reservedWords } from '../../utils';\nimport type {\n ArrayProp,\n Call,\n CallOptional,\n CreateArray,\n CreateObject,\n Group,\n InternalCode,\n KeyValLisp,\n Lisp,\n PropLisp,\n PropOptional,\n SpreadArrayLisp,\n SpreadObjectLisp,\n} from '../lisp';\nimport type { RegisterLispTypesDeps } from './shared';\n\nexport function registerStructureLispTypes({\n NullLisp,\n createLisp,\n emptyString,\n expectTypes,\n expandDestructure,\n findPatternEndIdx,\n lispify,\n lispifyBlock,\n lispifyExpr,\n restOfExp,\n setLispType,\n}: RegisterLispTypesDeps) {\n type LispWithSource = Lisp & { source?: string };\n\n const closingsCreate: { [type: string]: RegExp } = {\n createArray: /^\\]/,\n createObject: /^\\}/,\n group: /^\\)/,\n arrayProp: /^\\]/,\n call: /^\\)/,\n };\n\n const typesCreate = {\n createArray: LispType.CreateArray,\n createObject: LispType.CreateObject,\n group: LispType.Group,\n arrayProp: LispType.ArrayProp,\n call: LispType.Call,\n prop: LispType.Prop,\n '?prop': LispType.PropOptional,\n '?call': LispType.CallOptional,\n } as any;\n\n setLispType(['createArray', 'createObject', 'group', 'arrayProp', 'call'] as const, (ctx) => {\n const { constants, type, part, res, expect } = ctx;\n let extract = emptyString;\n const arg: CodeString[] = [];\n const argIsHole: boolean[] = [];\n let end = false;\n let i = res[0].length;\n const start = i;\n while (i < part.length && !end) {\n extract = restOfExp(constants, part.substring(i), [closingsCreate[type], /^,/]);\n i += extract.length;\n if (extract.trim().length) {\n arg.push(extract);\n argIsHole.push(false);\n } else if (type === 'createArray' && part.char(i) === ',') {\n arg.push(extract);\n argIsHole.push(true);\n }\n if (part.char(i) !== ',') {\n end = true;\n } else {\n if (!extract.trim().length && type === 'call') {\n throw new SyntaxError('Unexpected end of expression');\n }\n if (!extract.trim().length && type === 'createObject') {\n throw new SyntaxError('Unexpected token ,');\n }\n i++;\n }\n }\n const next =\n type === 'createArray' || type === 'createObject' || type === 'group'\n ? ['value', 'modifier', 'prop', 'incrementerBefore', 'assignment', 'expEnd']\n : ['value', 'modifier', 'prop', 'incrementerBefore', 'expEnd'];\n let l: Lisp | Lisp[];\n\n let funcFound: RegExpExecArray | null;\n switch (type) {\n case 'group': {\n const groupContent = part.substring(start, i).trim();\n const groupContentStr = groupContent.toString();\n if (groupContentStr.startsWith('{') || groupContentStr.startsWith('[')) {\n const patternEnd = findPatternEndIdx(groupContentStr);\n const patternStr = groupContentStr.slice(0, patternEnd).trim();\n const afterPattern = groupContentStr.slice(patternEnd).trimStart();\n if (afterPattern.startsWith('=')) {\n const rhsStr = afterPattern.slice(1).trim();\n const tempName = `$$_da${Math.random().toString(36).slice(2)}`;\n const expandedCode = `internal ${tempName} = (${rhsStr}); ${expandDestructure('', patternStr, tempName)}; ${tempName}`;\n l = createLisp<InternalCode>({\n op: LispType.InternalBlock,\n a: lispifyBlock(new CodeString(expandedCode), constants, false, ctx),\n b: LispType.None,\n });\n break;\n }\n }\n }\n case 'arrayProp': {\n const arrayPropExpr = part.substring(start, i);\n if (!arrayPropExpr.trimStart().length) {\n throw new SyntaxError('Unexpected end of expression');\n }\n l = lispifyExpr(constants, arrayPropExpr, undefined, {\n ...ctx,\n lispDepth: ctx.lispDepth + 1,\n });\n break;\n }\n case 'call':\n l = arg.map((e) => lispify(constants, e, [...next, 'spreadArray'], undefined, false, ctx));\n break;\n case 'createArray':\n l = arg.map((e, idx) =>\n argIsHole[idx]\n ? createLisp({ op: LispType.Hole, a: LispType.None, b: LispType.None })\n : lispify(constants, e, [...next, 'spreadArray'], undefined, false, ctx),\n );\n break;\n case 'createObject':\n l = arg.map((str) => {\n str = str.trimStart();\n let value: Lisp;\n let key: string | Lisp = '';\n if (str.char(0) === '[') {\n const innerExpr = restOfExp(constants, str.substring(1), [], '[');\n const afterBracket = str.substring(1 + innerExpr.length + 1).trimStart();\n key = lispify(constants, innerExpr, next);\n if (afterBracket.length > 0 && afterBracket.char(0) === ':') {\n value = lispify(constants, afterBracket.substring(1));\n } else if (afterBracket.length > 0 && afterBracket.char(0) === '(') {\n value = lispify(constants, new CodeString('function' + afterBracket.toString()));\n } else {\n throw new SyntaxError('Unexpected token in computed property');\n }\n return createLisp<KeyValLisp>({\n op: LispType.KeyVal,\n a: key,\n b: value,\n });\n }\n funcFound = expectTypes.expFunction.types.function.exec('function ' + str);\n if (funcFound) {\n key = funcFound[3].trimStart();\n value = lispify(\n constants,\n new CodeString('function ' + str.toString().replace(key, '')),\n );\n } else {\n const extract = restOfExp(constants, str, [/^:/]);\n key = lispify(constants, extract, [...next, 'spreadObject']) as PropLisp;\n\n if (isLisp(key) && key[0] === LispType.SpreadObject) {\n value = NullLisp;\n } else {\n if (key[0] === LispType.Prop) {\n key = (key as PropLisp)[2];\n }\n\n if (str.length > extract.length && str.char(extract.length) === ':') {\n value = lispify(constants, str.substring(extract.length + 1));\n } else {\n value = lispify(constants, extract, next);\n }\n }\n }\n return createLisp<KeyValLisp>({\n op: LispType.KeyVal,\n a: key,\n b: value,\n });\n });\n break;\n }\n const lisptype = (\n type === 'arrayProp'\n ? res[1]\n ? LispType.PropOptional\n : LispType.Prop\n : type === 'call'\n ? res[1]\n ? LispType.CallOptional\n : LispType.Call\n : typesCreate[type]\n ) as (typeof typesCreate)[keyof typeof typesCreate];\n const currentTree = createLisp<\n ArrayProp | PropLisp | Call | CreateObject | CreateArray | Group | PropOptional | CallOptional\n >({\n op: lisptype,\n a: ctx.lispTree,\n b: l,\n }) as LispWithSource;\n if (\n lisptype === LispType.Group ||\n lisptype === LispType.CreateArray ||\n lisptype === LispType.CreateObject\n ) {\n currentTree.source = part.substring(start, i).toString();\n }\n ctx.lispTree = lispify(\n constants,\n part.substring(i + 1),\n expectTypes[expect].next,\n currentTree,\n false,\n ctx,\n );\n });\n\n setLispType(['dot', 'prop'] as const, (ctx) => {\n const { constants, type, part, res, expect } = ctx;\n let prop = res[0];\n let index = res[0].length;\n let op = 'prop';\n if (type === 'dot') {\n if (res[1]) {\n op = '?prop';\n }\n const matches = part.substring(res[0].length).toString().match(expectTypes.prop.types.prop);\n if (matches && matches.length) {\n prop = matches[0];\n index = prop.length + res[0].length;\n } else {\n throw new SyntaxError('Hanging dot');\n }\n } else if (reservedWords.has(prop) && prop !== 'this') {\n throw new SyntaxError(`Unexpected token '${prop}'`);\n }\n ctx.lispTree = lispify(\n constants,\n part.substring(index),\n expectTypes[expect].next,\n createLisp<PropLisp | PropOptional>({\n op: typesCreate[op],\n a: ctx.lispTree,\n b: prop,\n }),\n false,\n ctx,\n );\n });\n\n setLispType(['spreadArray', 'spreadObject'] as const, (ctx) => {\n const { constants, type, part, res, expect } = ctx;\n ctx.lispTree = createLisp<SpreadArrayLisp | SpreadObjectLisp>({\n op: type === 'spreadArray' ? LispType.SpreadArray : LispType.SpreadObject,\n a: LispType.None,\n b: lispify(constants, part.substring(res[0].length), expectTypes[expect].next),\n });\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { LispType } from "../../utils/types.js";
|
|
2
|
+
import "../../utils/index.js";
|
|
3
|
+
//#region src/parser/lispTypes/values.ts
|
|
4
|
+
function registerValueLispTypes({ createLisp, expectTypes, lispify, lispifyExpr, restOfExp, semiColon, setLispType }) {
|
|
5
|
+
setLispType(["return", "throw"], (ctx) => {
|
|
6
|
+
const { constants, type, part, res } = ctx;
|
|
7
|
+
const expr = part.substring(res[0].length);
|
|
8
|
+
if (type === "throw" && !expr.trimStart().length) throw new SyntaxError("Unexpected end of expression");
|
|
9
|
+
ctx.lispTree = createLisp({
|
|
10
|
+
op: type === "return" ? LispType.Return : LispType.Throw,
|
|
11
|
+
a: LispType.None,
|
|
12
|
+
b: lispifyExpr(constants, expr, void 0, ctx)
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
setLispType([
|
|
16
|
+
"number",
|
|
17
|
+
"boolean",
|
|
18
|
+
"null",
|
|
19
|
+
"und",
|
|
20
|
+
"NaN",
|
|
21
|
+
"Infinity"
|
|
22
|
+
], (ctx) => {
|
|
23
|
+
const { constants, type, part, res, expect } = ctx;
|
|
24
|
+
ctx.lispTree = lispify(constants, part.substring(res[0].length), expectTypes[expect].next, createLisp({
|
|
25
|
+
op: type === "number" ? res[12] ? LispType.BigInt : LispType.Number : LispType.GlobalSymbol,
|
|
26
|
+
a: LispType.None,
|
|
27
|
+
b: res[12] ? res[1] : res[0]
|
|
28
|
+
}), false, ctx);
|
|
29
|
+
});
|
|
30
|
+
setLispType([
|
|
31
|
+
"string",
|
|
32
|
+
"literal",
|
|
33
|
+
"regex"
|
|
34
|
+
], (ctx) => {
|
|
35
|
+
const { constants, type, part, res, expect } = ctx;
|
|
36
|
+
ctx.lispTree = lispify(constants, part.substring(res[0].length), expectTypes[expect].next, createLisp({
|
|
37
|
+
op: type === "string" ? LispType.StringIndex : type === "literal" ? LispType.LiteralIndex : LispType.RegexIndex,
|
|
38
|
+
a: LispType.None,
|
|
39
|
+
b: res[1]
|
|
40
|
+
}), false, ctx);
|
|
41
|
+
});
|
|
42
|
+
setLispType(["void", "await"], (ctx) => {
|
|
43
|
+
const { constants, type, part, res, expect } = ctx;
|
|
44
|
+
const extract = restOfExp(constants, part.substring(res[0].length), [/^([^\s.?\w$]|\?[^.])/]);
|
|
45
|
+
if (!extract.trimStart().length) throw new SyntaxError("Unexpected end of expression");
|
|
46
|
+
ctx.lispTree = lispify(constants, part.substring(res[0].length + extract.length), expectTypes[expect].next, createLisp({
|
|
47
|
+
op: type === "void" ? LispType.Void : LispType.Await,
|
|
48
|
+
a: lispify(constants, extract),
|
|
49
|
+
b: LispType.None
|
|
50
|
+
}), false, ctx);
|
|
51
|
+
});
|
|
52
|
+
setLispType(["yield"], (ctx) => {
|
|
53
|
+
const { constants, part, res, expect, generatorDepth } = ctx;
|
|
54
|
+
if (generatorDepth === 0) throw new SyntaxError("Unexpected token");
|
|
55
|
+
const isDelegate = res[0].trimEnd().endsWith("*");
|
|
56
|
+
const extract = restOfExp(constants, part.substring(res[0].length), [/^([^\s.?\w$]|\?[^.])/]);
|
|
57
|
+
if (isDelegate && !extract.trimStart().length) throw new SyntaxError("Unexpected end of expression");
|
|
58
|
+
ctx.lispTree = lispify(constants, part.substring(res[0].length + extract.length), expectTypes[expect].next, createLisp({
|
|
59
|
+
op: isDelegate ? LispType.YieldDelegate : LispType.Yield,
|
|
60
|
+
a: lispify(constants, extract),
|
|
61
|
+
b: LispType.None
|
|
62
|
+
}), false, ctx);
|
|
63
|
+
});
|
|
64
|
+
setLispType(["new"], (ctx) => {
|
|
65
|
+
const { constants, part, res } = ctx;
|
|
66
|
+
let i = res[0].length;
|
|
67
|
+
const obj = restOfExp(constants, part.substring(i), [], void 0, "(");
|
|
68
|
+
if (!obj.trimStart().length) throw new SyntaxError("Unexpected end of expression");
|
|
69
|
+
i += obj.length + 1;
|
|
70
|
+
const args = [];
|
|
71
|
+
if (part.char(i - 1) === "(") {
|
|
72
|
+
const argsString = restOfExp(constants, part.substring(i), [], "(");
|
|
73
|
+
i += argsString.length + 1;
|
|
74
|
+
let found;
|
|
75
|
+
let j = 0;
|
|
76
|
+
while ((found = restOfExp(constants, argsString.substring(j), [/^,/])).length) {
|
|
77
|
+
j += found.length + 1;
|
|
78
|
+
args.push(found.trim());
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
ctx.lispTree = lispify(constants, part.substring(i), expectTypes.expEdge.next, createLisp({
|
|
82
|
+
op: LispType.New,
|
|
83
|
+
a: lispify(constants, obj, expectTypes.initialize.next),
|
|
84
|
+
b: args.map((arg) => lispify(constants, arg, expectTypes.initialize.next))
|
|
85
|
+
}), false, ctx);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { registerValueLispTypes };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=values.js.map
|