meaoiu 0.1.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.
- package/LANGUAGE_GUIDE.md +511 -0
- package/LICENSE +21 -0
- package/README.md +336 -0
- package/dist/api/execution.d.ts +9 -0
- package/dist/api/execution.d.ts.map +1 -0
- package/dist/api/execution.js +17 -0
- package/dist/api/execution.js.map +1 -0
- package/dist/api/serviceState.d.ts +24 -0
- package/dist/api/serviceState.d.ts.map +1 -0
- package/dist/api/serviceState.js +53 -0
- package/dist/api/serviceState.js.map +1 -0
- package/dist/api/services/completions.d.ts +15 -0
- package/dist/api/services/completions.d.ts.map +1 -0
- package/dist/api/services/completions.js +48 -0
- package/dist/api/services/completions.js.map +1 -0
- package/dist/api/services/diagnostics.d.ts +9 -0
- package/dist/api/services/diagnostics.d.ts.map +1 -0
- package/dist/api/services/diagnostics.js +5 -0
- package/dist/api/services/diagnostics.js.map +1 -0
- package/dist/api/services/formatting.d.ts +2 -0
- package/dist/api/services/formatting.d.ts.map +1 -0
- package/dist/api/services/formatting.js +223 -0
- package/dist/api/services/formatting.js.map +1 -0
- package/dist/api/services/highlight.d.ts +14 -0
- package/dist/api/services/highlight.d.ts.map +1 -0
- package/dist/api/services/highlight.js +58 -0
- package/dist/api/services/highlight.js.map +1 -0
- package/dist/api/services/inlayHints.d.ts +22 -0
- package/dist/api/services/inlayHints.d.ts.map +1 -0
- package/dist/api/services/inlayHints.js +100 -0
- package/dist/api/services/inlayHints.js.map +1 -0
- package/dist/api/services/search.d.ts +17 -0
- package/dist/api/services/search.d.ts.map +1 -0
- package/dist/api/services/search.js +35 -0
- package/dist/api/services/search.js.map +1 -0
- package/dist/api/utils/astUtils.d.ts +11 -0
- package/dist/api/utils/astUtils.d.ts.map +1 -0
- package/dist/api/utils/astUtils.js +106 -0
- package/dist/api/utils/astUtils.js.map +1 -0
- package/dist/api/utils/lspUtils.d.ts +16 -0
- package/dist/api/utils/lspUtils.d.ts.map +1 -0
- package/dist/api/utils/lspUtils.js +5 -0
- package/dist/api/utils/lspUtils.js.map +1 -0
- package/dist/api/utils/symbolAnalyzer.d.ts +37 -0
- package/dist/api/utils/symbolAnalyzer.d.ts.map +1 -0
- package/dist/api/utils/symbolAnalyzer.js +440 -0
- package/dist/api/utils/symbolAnalyzer.js.map +1 -0
- package/dist/api/utils/symbolTable.d.ts +28 -0
- package/dist/api/utils/symbolTable.d.ts.map +1 -0
- package/dist/api/utils/symbolTable.js +3 -0
- package/dist/api/utils/symbolTable.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +92 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/tools/completer.d.ts +2 -0
- package/dist/cli/tools/completer.d.ts.map +1 -0
- package/dist/cli/tools/completer.js +24 -0
- package/dist/cli/tools/completer.js.map +1 -0
- package/dist/cli/tools/diagnoser.d.ts +2 -0
- package/dist/cli/tools/diagnoser.d.ts.map +1 -0
- package/dist/cli/tools/diagnoser.js +29 -0
- package/dist/cli/tools/diagnoser.js.map +1 -0
- package/dist/cli/tools/formatter.d.ts +2 -0
- package/dist/cli/tools/formatter.d.ts.map +1 -0
- package/dist/cli/tools/formatter.js +27 -0
- package/dist/cli/tools/formatter.js.map +1 -0
- package/dist/cli/tools/searcher.d.ts +4 -0
- package/dist/cli/tools/searcher.d.ts.map +1 -0
- package/dist/cli/tools/searcher.js +30 -0
- package/dist/cli/tools/searcher.js.map +1 -0
- package/dist/cli/tools/starter.d.ts +3 -0
- package/dist/cli/tools/starter.d.ts.map +1 -0
- package/dist/cli/tools/starter.js +23 -0
- package/dist/cli/tools/starter.js.map +1 -0
- package/dist/cli/tools/toolUtils.d.ts +8 -0
- package/dist/cli/tools/toolUtils.d.ts.map +1 -0
- package/dist/cli/tools/toolUtils.js +52 -0
- package/dist/cli/tools/toolUtils.js.map +1 -0
- package/dist/core/ast.d.ts +140 -0
- package/dist/core/ast.d.ts.map +1 -0
- package/dist/core/ast.js +3 -0
- package/dist/core/ast.js.map +1 -0
- package/dist/core/builtIns.d.ts +15 -0
- package/dist/core/builtIns.d.ts.map +1 -0
- package/dist/core/builtIns.js +175 -0
- package/dist/core/builtIns.js.map +1 -0
- package/dist/core/error.d.ts +41 -0
- package/dist/core/error.d.ts.map +1 -0
- package/dist/core/error.js +63 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/parser.d.ts +89 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +578 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/preprocessor.d.ts +2 -0
- package/dist/core/preprocessor.d.ts.map +1 -0
- package/dist/core/preprocessor.js +187 -0
- package/dist/core/preprocessor.js.map +1 -0
- package/dist/core/run/environment.d.ts +43 -0
- package/dist/core/run/environment.d.ts.map +1 -0
- package/dist/core/run/environment.js +192 -0
- package/dist/core/run/environment.js.map +1 -0
- package/dist/core/run/interpreter.d.ts +13 -0
- package/dist/core/run/interpreter.d.ts.map +1 -0
- package/dist/core/run/interpreter.js +415 -0
- package/dist/core/run/interpreter.js.map +1 -0
- package/dist/core/run/io.d.ts +18 -0
- package/dist/core/run/io.d.ts.map +1 -0
- package/dist/core/run/io.js +34 -0
- package/dist/core/run/io.js.map +1 -0
- package/dist/core/run/logger.d.ts +12 -0
- package/dist/core/run/logger.d.ts.map +1 -0
- package/dist/core/run/logger.js +17 -0
- package/dist/core/run/logger.js.map +1 -0
- package/dist/core/run/value.d.ts +41 -0
- package/dist/core/run/value.d.ts.map +1 -0
- package/dist/core/run/value.js +37 -0
- package/dist/core/run/value.js.map +1 -0
- package/dist/core/tokenizer.d.ts +82 -0
- package/dist/core/tokenizer.d.ts.map +1 -0
- package/dist/core/tokenizer.js +277 -0
- package/dist/core/tokenizer.js.map +1 -0
- package/dist/core/typedef.d.ts +32 -0
- package/dist/core/typedef.d.ts.map +1 -0
- package/dist/core/typedef.js +67 -0
- package/dist/core/typedef.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
// src/core/run/interpreter.ts
|
|
2
|
+
import { checkArgsForBuiltIn, isBuiltInFunctionName } from '../builtIns.js';
|
|
3
|
+
import { errorFrom, MeaoiuError } from '../error.js';
|
|
4
|
+
import { checkArithmeticOperation, checkComparisonOperation, getMeaoiuType, typeNames, } from '../typedef.js';
|
|
5
|
+
import { autoKey, Environment } from './environment.js';
|
|
6
|
+
import logger from './logger.js';
|
|
7
|
+
import { BREAK_SIGNAL, CONTINUE_SIGNAL, isReferenceLink, isSignal, LoopValue, ReturnValue, } from './value.js';
|
|
8
|
+
const ReturnOrAmbush = {
|
|
9
|
+
[5 /* NodeKind.ReturnStatement */]: {
|
|
10
|
+
emptySignal: new ReturnValue(null),
|
|
11
|
+
signalWith: value => new ReturnValue(value),
|
|
12
|
+
},
|
|
13
|
+
[6 /* NodeKind.AmbushStatement */]: {
|
|
14
|
+
emptySignal: CONTINUE_SIGNAL,
|
|
15
|
+
signalWith: value => new LoopValue(value),
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
const resolveValue = Environment.resolveValue;
|
|
19
|
+
const runtimeErrorFrom = (ele, message) => errorFrom(ele, message, 5 /* Phase.RUNTIME */);
|
|
20
|
+
export async function evaluate(node, env, builtIns, boundaryEnv, newEnvMode = 0 /* NewEnvMode.NORMAL */) {
|
|
21
|
+
try {
|
|
22
|
+
switch (node.kind) {
|
|
23
|
+
case 9 /* NodeKind.NumericLiteral */:
|
|
24
|
+
case 10 /* NodeKind.StringLiteral */:
|
|
25
|
+
case 11 /* NodeKind.BooleanLiteral */:
|
|
26
|
+
return node.value;
|
|
27
|
+
case 12 /* NodeKind.NullLiteral */:
|
|
28
|
+
return null;
|
|
29
|
+
case 13 /* NodeKind.Identifier */:
|
|
30
|
+
return env.lookup(node.symbol);
|
|
31
|
+
case 1 /* NodeKind.Program */: {
|
|
32
|
+
let lastEvaluatedInProgram = null;
|
|
33
|
+
for (const statement of node.body) {
|
|
34
|
+
lastEvaluatedInProgram = await evaluate(statement, env, builtIns, boundaryEnv);
|
|
35
|
+
}
|
|
36
|
+
return lastEvaluatedInProgram;
|
|
37
|
+
}
|
|
38
|
+
case 14 /* NodeKind.BlockExpression */: {
|
|
39
|
+
const { isCollection, body } = node;
|
|
40
|
+
const blockEnv = newEnvMode !== 0 /* NewEnvMode.NORMAL */ ? env : new Environment(env);
|
|
41
|
+
// --- 纸箱的特殊求值规则 ---
|
|
42
|
+
if (isCollection) {
|
|
43
|
+
let autoIndexCounter = 0; // 自动索引计数器
|
|
44
|
+
for (const stmt of body) {
|
|
45
|
+
// 声明语句
|
|
46
|
+
if (stmt.kind === 2 /* NodeKind.VariableDeclaration */)
|
|
47
|
+
await evaluate(stmt, blockEnv, builtIns, boundaryEnv);
|
|
48
|
+
// 调用辅助函数处理纯表达式
|
|
49
|
+
else if (stmt.kind === 8 /* NodeKind.ExpressionStatement */) {
|
|
50
|
+
autoIndexCounter = await _evaluateCollectionElement(stmt, blockEnv, builtIns, boundaryEnv, autoIndexCounter);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return blockEnv; // 返回纸箱的环境
|
|
54
|
+
}
|
|
55
|
+
// --- 普通 [##] 块的逻辑 ---
|
|
56
|
+
let lastEvaluated = null;
|
|
57
|
+
for (const stmt of body) {
|
|
58
|
+
lastEvaluated = await evaluate(stmt, blockEnv, builtIns, boundaryEnv);
|
|
59
|
+
if (isSignal(lastEvaluated))
|
|
60
|
+
return lastEvaluated;
|
|
61
|
+
}
|
|
62
|
+
if (newEnvMode !== 0 /* NewEnvMode.NORMAL */)
|
|
63
|
+
return null; // 非普通环境只靠信号返回
|
|
64
|
+
if (isReferenceLink(lastEvaluated) && lastEvaluated.scope === blockEnv) {
|
|
65
|
+
const lastStmtNode = body.at(-1) ?? node;
|
|
66
|
+
throw runtimeErrorFrom(lastStmtNode, `不能让里面玩具「${lastEvaluated.name}」跑出去喵!`);
|
|
67
|
+
}
|
|
68
|
+
return lastEvaluated;
|
|
69
|
+
}
|
|
70
|
+
case 22 /* NodeKind.MemberAccessExpression */: {
|
|
71
|
+
const { object: objectNode, property: propertyNode } = node;
|
|
72
|
+
const collection = resolveValue(await evaluate(objectNode, env, builtIns, boundaryEnv));
|
|
73
|
+
if (!(collection instanceof Environment)) {
|
|
74
|
+
throw runtimeErrorFrom(objectNode, `从${typeNames[5 /* MeaoiuType.COLLECTION */]}里拿东西才能用「@」喵!`);
|
|
75
|
+
}
|
|
76
|
+
const name = await _evaluateMemberName(propertyNode, env, builtIns, boundaryEnv, collection, index => {
|
|
77
|
+
throw runtimeErrorFrom(propertyNode, `喵呜!找不到「${index}」号玩具喵!`);
|
|
78
|
+
});
|
|
79
|
+
return collection.lookup(name);
|
|
80
|
+
}
|
|
81
|
+
case 19 /* NodeKind.SequenceExpression */: {
|
|
82
|
+
const { sections, operators } = node;
|
|
83
|
+
// 动态检查,可以 AnyScript 喵
|
|
84
|
+
let accVal = resolveValue(await evaluate(sections[0], env, builtIns, boundaryEnv));
|
|
85
|
+
for (let i = 0; i < operators.length; i++) {
|
|
86
|
+
const opToken = operators[i], op = opToken.value;
|
|
87
|
+
const nextVal = resolveValue(await evaluate(sections[i + 1], env, builtIns, boundaryEnv));
|
|
88
|
+
switch (op) {
|
|
89
|
+
case '==':
|
|
90
|
+
accVal = accVal === nextVal;
|
|
91
|
+
continue; // 计算完毕,继续下一次循环
|
|
92
|
+
case '!=':
|
|
93
|
+
accVal = accVal !== nextVal;
|
|
94
|
+
continue; // 计算完毕,继续下一次循环
|
|
95
|
+
}
|
|
96
|
+
const accType = getMeaoiuType(accVal);
|
|
97
|
+
const nextType = getMeaoiuType(nextVal);
|
|
98
|
+
const error = checkArithmeticOperation(op, accType, nextType);
|
|
99
|
+
if (error)
|
|
100
|
+
throw runtimeErrorFrom(opToken, `${error}`);
|
|
101
|
+
switch (op) {
|
|
102
|
+
case '+':
|
|
103
|
+
if (accType === 5 /* MeaoiuType.COLLECTION */)
|
|
104
|
+
accVal = accVal.createMergedView(nextVal);
|
|
105
|
+
else
|
|
106
|
+
accVal += nextVal;
|
|
107
|
+
break;
|
|
108
|
+
case '-':
|
|
109
|
+
accVal -= nextVal;
|
|
110
|
+
break;
|
|
111
|
+
case '*':
|
|
112
|
+
accVal *= nextVal;
|
|
113
|
+
break;
|
|
114
|
+
case '/':
|
|
115
|
+
accVal /= nextVal;
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
throw runtimeErrorFrom(opToken, `这个「${op}」这是什么节喵?`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return accVal;
|
|
122
|
+
}
|
|
123
|
+
case 17 /* NodeKind.ArithmeticExpression */: {
|
|
124
|
+
const { operator: op, left, right } = node;
|
|
125
|
+
const leftVal = resolveValue(await evaluate(left, env, builtIns, boundaryEnv));
|
|
126
|
+
const rightVal = resolveValue(await evaluate(right, env, builtIns, boundaryEnv));
|
|
127
|
+
const leftType = getMeaoiuType(leftVal);
|
|
128
|
+
const rightType = getMeaoiuType(rightVal);
|
|
129
|
+
const error = checkArithmeticOperation(op, leftType, rightType);
|
|
130
|
+
if (error)
|
|
131
|
+
throw runtimeErrorFrom(node, `${error}`);
|
|
132
|
+
switch (op) {
|
|
133
|
+
case '+':
|
|
134
|
+
return leftType === 5 /* MeaoiuType.COLLECTION */ ? leftVal.createMergedView(rightVal) : leftVal + rightVal;
|
|
135
|
+
case '-':
|
|
136
|
+
return leftVal - rightVal;
|
|
137
|
+
case '*':
|
|
138
|
+
return leftVal * rightVal;
|
|
139
|
+
case '/':
|
|
140
|
+
return leftVal / rightVal;
|
|
141
|
+
}
|
|
142
|
+
throw runtimeErrorFrom(node, `「${op}」是两块钱的运算符喵?`);
|
|
143
|
+
}
|
|
144
|
+
case 21 /* NodeKind.ComparisonExpression */: {
|
|
145
|
+
const { expressions, operators } = node;
|
|
146
|
+
let overallResult = true, currentLeftVal = resolveValue(await evaluate(expressions[0], env, builtIns, boundaryEnv));
|
|
147
|
+
for (let i = 0; i < operators.length; i++) {
|
|
148
|
+
const opToken = operators[i], op = opToken.value;
|
|
149
|
+
const currentRightVal = resolveValue(await evaluate(expressions[i + 1], env, builtIns, boundaryEnv));
|
|
150
|
+
const leftType = getMeaoiuType(currentLeftVal);
|
|
151
|
+
const rightType = getMeaoiuType(currentRightVal);
|
|
152
|
+
const error = checkComparisonOperation(op, leftType, rightType);
|
|
153
|
+
if (error)
|
|
154
|
+
throw runtimeErrorFrom(opToken, `${error}`);
|
|
155
|
+
// --- 执行单个比较 ---
|
|
156
|
+
let currentResult = false;
|
|
157
|
+
switch (op) {
|
|
158
|
+
case '==':
|
|
159
|
+
currentResult = currentLeftVal === currentRightVal;
|
|
160
|
+
break;
|
|
161
|
+
case '!=':
|
|
162
|
+
currentResult = currentLeftVal !== currentRightVal;
|
|
163
|
+
break;
|
|
164
|
+
case '>':
|
|
165
|
+
currentResult = currentLeftVal > currentRightVal;
|
|
166
|
+
break;
|
|
167
|
+
case '<':
|
|
168
|
+
currentResult = currentLeftVal < currentRightVal;
|
|
169
|
+
break;
|
|
170
|
+
case '>=':
|
|
171
|
+
currentResult = currentLeftVal >= currentRightVal;
|
|
172
|
+
break;
|
|
173
|
+
case '<=':
|
|
174
|
+
currentResult = currentLeftVal <= currentRightVal;
|
|
175
|
+
break;
|
|
176
|
+
default:
|
|
177
|
+
throw runtimeErrorFrom(opToken, `不会用「${op}」比喵~`);
|
|
178
|
+
}
|
|
179
|
+
if (!currentResult) {
|
|
180
|
+
overallResult = false;
|
|
181
|
+
break; // 短路!
|
|
182
|
+
}
|
|
183
|
+
// 右侧成为下一次比较的左侧
|
|
184
|
+
currentLeftVal = currentRightVal;
|
|
185
|
+
}
|
|
186
|
+
return overallResult;
|
|
187
|
+
}
|
|
188
|
+
case 20 /* NodeKind.LogicalExpression */: {
|
|
189
|
+
const { operator: op, left, right } = node;
|
|
190
|
+
const leftVal = resolveValue(await evaluate(left, env, builtIns, boundaryEnv));
|
|
191
|
+
switch (op) {
|
|
192
|
+
case 0 /* LogicalOperator.AND */:
|
|
193
|
+
return !!(leftVal && resolveValue(await evaluate(right, env, builtIns, boundaryEnv)));
|
|
194
|
+
case 1 /* LogicalOperator.OR */:
|
|
195
|
+
return !!(leftVal || resolveValue(await evaluate(right, env, builtIns, boundaryEnv)));
|
|
196
|
+
case 3 /* LogicalOperator.NOR */:
|
|
197
|
+
return !(leftVal || resolveValue(await evaluate(right, env, builtIns, boundaryEnv)));
|
|
198
|
+
case 2 /* LogicalOperator.NAND */:
|
|
199
|
+
return !(leftVal && resolveValue(await evaluate(right, env, builtIns, boundaryEnv)));
|
|
200
|
+
default: // 理论不可达
|
|
201
|
+
const _o = op;
|
|
202
|
+
throw errorFrom(node, `你发现了「${_o}」悖论喵~`, 1 /* Phase.INVARIANT */);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
case 2 /* NodeKind.VariableDeclaration */: {
|
|
206
|
+
const { identifier, initialization } = node;
|
|
207
|
+
const symbol = identifier.symbol;
|
|
208
|
+
// 若有初始化部分,则执行以声明并赋值
|
|
209
|
+
return initialization
|
|
210
|
+
? _evaluateAssignment(initialization, env, builtIns, boundaryEnv, () => env.declare(symbol))
|
|
211
|
+
: env.declare(symbol); // 声明变量名
|
|
212
|
+
}
|
|
213
|
+
case 3 /* NodeKind.AssignmentStatement */:
|
|
214
|
+
return _evaluateAssignment(node, env, builtIns, boundaryEnv);
|
|
215
|
+
case 15 /* NodeKind.IfExpression */: {
|
|
216
|
+
const isTrue = resolveValue(await evaluate(node.condition, env, builtIns, boundaryEnv));
|
|
217
|
+
if (isTrue)
|
|
218
|
+
return evaluate(node.consequent, env, builtIns, boundaryEnv);
|
|
219
|
+
else if (node.alternate)
|
|
220
|
+
return evaluate(node.alternate, env, builtIns, boundaryEnv);
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
case 16 /* NodeKind.LoopExpression */: {
|
|
224
|
+
const body = node.body;
|
|
225
|
+
loop: for (;;) {
|
|
226
|
+
const loopEnv = new Environment(env);
|
|
227
|
+
const result = await evaluate(body, loopEnv, builtIns, { ...boundaryEnv, [6 /* NodeKind.AmbushStatement */]: loopEnv }, 2 /* NewEnvMode.LOOP */);
|
|
228
|
+
if (!isSignal(result))
|
|
229
|
+
continue;
|
|
230
|
+
switch (result.signalKind) {
|
|
231
|
+
case 3 /* SignalKind.CONTINUE */:
|
|
232
|
+
continue; // '偷袭~' -> 继续下次循环
|
|
233
|
+
case 2 /* SignalKind.BREAK */:
|
|
234
|
+
break loop; // '累了~' -> 退出循环
|
|
235
|
+
case 1 /* SignalKind.LOOP */:
|
|
236
|
+
return result.value; // '偷袭 <值>~' -> 退出并返回值
|
|
237
|
+
case 0 /* SignalKind.RETURN */:
|
|
238
|
+
return result; // '叼回来 [值]~' -> 退出函数
|
|
239
|
+
default:
|
|
240
|
+
const _r = result;
|
|
241
|
+
throw runtimeErrorFrom(node, `不理解「${_r}」是什么要求喵!`);
|
|
242
|
+
}
|
|
243
|
+
// break; // 让循环变懒(不主动重复)
|
|
244
|
+
}
|
|
245
|
+
return null; // '累了' 退出后,循环表达式返回“空碗”
|
|
246
|
+
}
|
|
247
|
+
case 7 /* NodeKind.BreakStatement */:
|
|
248
|
+
return BREAK_SIGNAL;
|
|
249
|
+
case 6 /* NodeKind.AmbushStatement */:
|
|
250
|
+
case 5 /* NodeKind.ReturnStatement */: {
|
|
251
|
+
const { kind, argument } = node;
|
|
252
|
+
if (!argument)
|
|
253
|
+
return ReturnOrAmbush[kind].emptySignal;
|
|
254
|
+
if (argument.kind === 13 /* NodeKind.Identifier */) {
|
|
255
|
+
const varName = argument.symbol;
|
|
256
|
+
const varScope = env.lookup(varName).scope;
|
|
257
|
+
if (varScope.isInsideOf(boundaryEnv[kind])) {
|
|
258
|
+
throw runtimeErrorFrom(argument, `不能把里面的临时玩具「${varName}」带走喵,它离开这里就消失了!`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const value = await evaluate(argument, env, builtIns, boundaryEnv);
|
|
262
|
+
if (isSignal(value))
|
|
263
|
+
logger.warn(`[ENV #${env.id}] 携带多层信号,将继续向上传递。`);
|
|
264
|
+
return ReturnOrAmbush[kind].signalWith(value);
|
|
265
|
+
}
|
|
266
|
+
case 4 /* NodeKind.FunctionDeclaration */:
|
|
267
|
+
return (env.declareFunction(node.name.symbol, node), null);
|
|
268
|
+
case 18 /* NodeKind.CallExpression */: {
|
|
269
|
+
const { callee, args: argsNode } = node;
|
|
270
|
+
const funcName = callee.symbol;
|
|
271
|
+
const argsCollection = resolveValue(await evaluate(argsNode, env, builtIns, boundaryEnv));
|
|
272
|
+
if (!(argsCollection instanceof Environment))
|
|
273
|
+
throw runtimeErrorFrom(argsNode, `贡品要装好喵!`);
|
|
274
|
+
if (isBuiltInFunctionName(funcName)) {
|
|
275
|
+
const evalArgs = [];
|
|
276
|
+
for (const varName of argsCollection.orderedVariableNames) {
|
|
277
|
+
evalArgs.push(resolveValue(argsCollection.lookup(varName)));
|
|
278
|
+
}
|
|
279
|
+
const builtIn = builtIns[funcName];
|
|
280
|
+
const error = checkArgsForBuiltIn(builtIn, evalArgs);
|
|
281
|
+
if (error)
|
|
282
|
+
throw runtimeErrorFrom(argsNode, `${error}`);
|
|
283
|
+
return builtIn.function(evalArgs);
|
|
284
|
+
}
|
|
285
|
+
const func = env.findFunction(funcName);
|
|
286
|
+
if (!func)
|
|
287
|
+
throw runtimeErrorFrom(callee, `没有叫「${funcName}」的${typeNames[4 /* MeaoiuType.FUNCTION */]}喵!`);
|
|
288
|
+
// 从函数定义的参数块中,按顺序提取出参数的名字
|
|
289
|
+
const paramNames = func.parameters.body
|
|
290
|
+
.map(stmt => {
|
|
291
|
+
if (stmt.kind === 2 /* NodeKind.VariableDeclaration */)
|
|
292
|
+
return stmt.identifier.symbol;
|
|
293
|
+
if (stmt.kind === 8 /* NodeKind.ExpressionStatement */ && stmt.expression.kind === 13 /* NodeKind.Identifier */) {
|
|
294
|
+
return stmt.expression.symbol;
|
|
295
|
+
}
|
|
296
|
+
throw runtimeErrorFrom(stmt, `贡品不能是奇怪的样子 ${stmt.kind} 喵!`);
|
|
297
|
+
})
|
|
298
|
+
.filter(Boolean);
|
|
299
|
+
if (argsCollection.length < paramNames.length) {
|
|
300
|
+
throw runtimeErrorFrom(argsNode, `要 ${paramNames.length} 个贡品,只给 ${argsCollection.length} 个不够喵!`);
|
|
301
|
+
}
|
|
302
|
+
const functionEnv = new Environment(env);
|
|
303
|
+
// 按顺序将参数纸箱里的变量“嫁接”到函数内部作用域
|
|
304
|
+
for (let i = 0; i < paramNames.length; i++) {
|
|
305
|
+
const paramName = paramNames[i];
|
|
306
|
+
const argVarName = argsCollection.orderedVariableNames[i];
|
|
307
|
+
// 创建从“函数参数名”到“调用纸箱中变量”的引用
|
|
308
|
+
functionEnv.declareReference(paramName, argsCollection, argVarName);
|
|
309
|
+
}
|
|
310
|
+
const result = await evaluate(func.body, functionEnv, builtIns, { ...boundaryEnv, [5 /* NodeKind.ReturnStatement */]: functionEnv }, 1 /* NewEnvMode.FUNC */);
|
|
311
|
+
if (result instanceof ReturnValue)
|
|
312
|
+
return result.value;
|
|
313
|
+
if (isSignal(result)) {
|
|
314
|
+
logger.warn(`[ENV #${functionEnv.id}] 在${typeNames[4 /* MeaoiuType.FUNCTION */]} '${funcName}' 中,只能把东西“叼回来”喵。`);
|
|
315
|
+
}
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
case 23 /* NodeKind.UnaryExpression */: {
|
|
319
|
+
const { operator: op, argument } = node;
|
|
320
|
+
const argumentRef = await evaluate(argument, env, builtIns, boundaryEnv);
|
|
321
|
+
const argumentValue = resolveValue(argumentRef);
|
|
322
|
+
switch (op) {
|
|
323
|
+
case 1 /* AssignmentOperator.COPY */: // 高仿
|
|
324
|
+
return argumentValue instanceof Environment ? argumentValue.createShallowCopy() : argumentValue;
|
|
325
|
+
case 2 /* AssignmentOperator.MOVE */: // 抢走
|
|
326
|
+
if (!isReferenceLink(argumentRef))
|
|
327
|
+
throw runtimeErrorFrom(argument, `只能抢走碗里的东西喵!`);
|
|
328
|
+
Environment.markReferenceMoved(argumentRef); // 标记源头为已移动
|
|
329
|
+
return argumentValue;
|
|
330
|
+
default: // 理论不可达
|
|
331
|
+
const _o = op;
|
|
332
|
+
throw errorFrom(argument, `你为什么会「${_o}」喵!`, 1 /* Phase.INVARIANT */);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
case 8 /* NodeKind.ExpressionStatement */:
|
|
336
|
+
return evaluate(node.expression, env, builtIns, boundaryEnv);
|
|
337
|
+
case 0 /* NodeKind.ErrorNode */:
|
|
338
|
+
throw runtimeErrorFrom(node, node.message);
|
|
339
|
+
default: // 此处已推断为不可达
|
|
340
|
+
const _n = node;
|
|
341
|
+
throw runtimeErrorFrom(_n, `不支持的节点类型喵!${_n}`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
if (err instanceof MeaoiuError)
|
|
346
|
+
throw err;
|
|
347
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
348
|
+
throw runtimeErrorFrom(node, `${errorMessage}`); // 附加上当前 AST 节点再抛出
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// ----------------------------------------------------------------
|
|
352
|
+
// 辅助函数:专门用于处理纸箱 [= ... =] 中的匿名元素(表达式)
|
|
353
|
+
// ----------------------------------------------------------------
|
|
354
|
+
async function _evaluateCollectionElement(stmt, blockEnv, builtIns, boundaryEnv, autoIndexCounter) {
|
|
355
|
+
const expr = stmt.expression;
|
|
356
|
+
let name, operator = 1 /* AssignmentOperator.COPY */;
|
|
357
|
+
if (expr.kind === 13 /* NodeKind.Identifier */) {
|
|
358
|
+
// 元素是 `a` -> 声明为 `a`,并创建引用
|
|
359
|
+
name = expr.symbol;
|
|
360
|
+
operator = 0 /* AssignmentOperator.REFERENCE */;
|
|
361
|
+
}
|
|
362
|
+
else if (expr.kind === 23 /* NodeKind.UnaryExpression */ && expr.argument.kind === 13 /* NodeKind.Identifier */) {
|
|
363
|
+
// 元素是 `高仿 a` 或 `抢走 a`
|
|
364
|
+
name = expr.argument.symbol;
|
|
365
|
+
}
|
|
366
|
+
const valueToAssign = await evaluate(expr, blockEnv, builtIns, boundaryEnv); // 得到最终的值
|
|
367
|
+
name ||= autoKey(autoIndexCounter++); // 没有显式名字就自动生成
|
|
368
|
+
if (blockEnv.hasVariable(name)) {
|
|
369
|
+
throw runtimeErrorFrom(stmt, `${typeNames[5 /* MeaoiuType.COLLECTION */]}里已经有一个叫做「${name}」的玩具了喵!`);
|
|
370
|
+
}
|
|
371
|
+
// 将这个元素“声明”到纸箱的环境中
|
|
372
|
+
blockEnv.declare(name); // 这会将 name 添加到 orderedVariableNames
|
|
373
|
+
blockEnv.assign(name, valueToAssign, operator);
|
|
374
|
+
return autoIndexCounter;
|
|
375
|
+
}
|
|
376
|
+
async function _evaluateAssignment(stmt, env, builtIns, boundaryEnv, preExecute) {
|
|
377
|
+
const { value: assignValue, assignee, operator } = stmt;
|
|
378
|
+
const value = await evaluate(assignValue, env, builtIns, boundaryEnv);
|
|
379
|
+
// 目标是 a@b 这种形式
|
|
380
|
+
if (assignee.kind === 22 /* NodeKind.MemberAccessExpression */) {
|
|
381
|
+
const { object: objectNode, property: propertyNode } = assignee;
|
|
382
|
+
// 找到纸箱
|
|
383
|
+
const collection = resolveValue(await evaluate(objectNode, env, builtIns, boundaryEnv));
|
|
384
|
+
if (!(collection instanceof Environment)) {
|
|
385
|
+
throw runtimeErrorFrom(objectNode, `只能给${typeNames[5 /* MeaoiuType.COLLECTION */]}的成员赋值喵!`);
|
|
386
|
+
}
|
|
387
|
+
const name = await _evaluateMemberName(propertyNode, env, builtIns, boundaryEnv, collection, String);
|
|
388
|
+
// 检查是“赋值”还是“扩充”
|
|
389
|
+
if (!collection.hasVariable(name)) {
|
|
390
|
+
logger.debug(`[ENV #${collection.id}] 纸箱扩充: '${name}'`);
|
|
391
|
+
collection.declare(name); // 声明新键
|
|
392
|
+
}
|
|
393
|
+
return collection.assign(name, value, operator);
|
|
394
|
+
}
|
|
395
|
+
preExecute?.();
|
|
396
|
+
// 目标是 a 这种普通变量
|
|
397
|
+
const target = await evaluate(assignee, env, builtIns, boundaryEnv);
|
|
398
|
+
if (!isReferenceLink(target))
|
|
399
|
+
throw runtimeErrorFrom(assignee, `赋值的左边必须是一个碗喵!`);
|
|
400
|
+
return target.scope.assign(target.name, value, operator);
|
|
401
|
+
}
|
|
402
|
+
async function _evaluateMemberName(prop, env, builtIns, boundaryEnv, collection, catchOutRangeIndex) {
|
|
403
|
+
// 找到索引/键
|
|
404
|
+
const propKey = resolveValue(await evaluate(prop, env, builtIns, boundaryEnv));
|
|
405
|
+
switch (typeof propKey) {
|
|
406
|
+
case 'string': // 字符串键,直接用
|
|
407
|
+
return propKey;
|
|
408
|
+
case 'number': // 数字索引
|
|
409
|
+
return propKey < 1 || collection.length < propKey
|
|
410
|
+
? catchOutRangeIndex(propKey) // 数字索引超出范围
|
|
411
|
+
: collection.orderedVariableNames[propKey - 1]; // 索引存在,用它在有序列表里的名字
|
|
412
|
+
}
|
|
413
|
+
throw runtimeErrorFrom(prop, `${typeNames[5 /* MeaoiuType.COLLECTION */]}的索引必须是${typeNames[0 /* MeaoiuType.NUMBER */]}或${typeNames[1 /* MeaoiuType.STRING */]}喵!`);
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=interpreter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpreter.js","sourceRoot":"","sources":["../../../src/core/run/interpreter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type MeaoiuRuntimeIO = {
|
|
2
|
+
print: (args: unknown[]) => void;
|
|
3
|
+
prompt: (question: string) => Promise<string>;
|
|
4
|
+
};
|
|
5
|
+
type Styleizer = typeof colorize;
|
|
6
|
+
/**
|
|
7
|
+
* 输入输出配置
|
|
8
|
+
*/
|
|
9
|
+
export type IOConfig = {
|
|
10
|
+
onPrint: (formattedString: string) => void;
|
|
11
|
+
onPrompt: (question: string) => Promise<string>;
|
|
12
|
+
/** 为输出的各类值附加样式,默认以ANSI 颜色输出,@default true */
|
|
13
|
+
styleize?: Styleizer | boolean;
|
|
14
|
+
};
|
|
15
|
+
declare function colorize(value: unknown, strValue: string): string;
|
|
16
|
+
export declare function createRuntimeIO({ onPrint, onPrompt, styleize }: IOConfig): MeaoiuRuntimeIO;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../../src/core/run/io.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C,CAAC;AAEF,KAAK,SAAS,GAAG,OAAO,QAAQ,CAAC;AACjC;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CAC/B,CAAC;AAoBF,iBAAS,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY1D;AAGD,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAe,EAAE,EAAE,QAAQ,GAAG,eAAe,CAIjG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// src/core/run/io.ts
|
|
2
|
+
// Meaoiu 字符串转换器
|
|
3
|
+
function toMeaoiuString(value) {
|
|
4
|
+
if (value === true)
|
|
5
|
+
return '好喵';
|
|
6
|
+
if (value === false)
|
|
7
|
+
return '坏喵';
|
|
8
|
+
if (value == null)
|
|
9
|
+
return '空碗';
|
|
10
|
+
if (value !== value)
|
|
11
|
+
return '不懂';
|
|
12
|
+
return String(value);
|
|
13
|
+
}
|
|
14
|
+
// 上色
|
|
15
|
+
function colorize(value, strValue) {
|
|
16
|
+
if (value == null)
|
|
17
|
+
return `${"\u001B[2m" /* Color.DIM */}${strValue}${"\u001B[0m" /* Color.RESET */}}`;
|
|
18
|
+
switch (typeof value) {
|
|
19
|
+
case 'number':
|
|
20
|
+
case 'boolean':
|
|
21
|
+
return `${"\u001B[33m" /* Color.YELLOW */}${strValue}${"\u001B[0m" /* Color.RESET */}`;
|
|
22
|
+
case 'string':
|
|
23
|
+
return `${"\u001B[32m" /* Color.GREEN */}${strValue}${"\u001B[0m" /* Color.RESET */}`;
|
|
24
|
+
default:
|
|
25
|
+
return strValue;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// I/O 工厂函数
|
|
29
|
+
export function createRuntimeIO({ onPrint, onPrompt, styleize = true }) {
|
|
30
|
+
const styleizer = styleize === true ? colorize : styleize;
|
|
31
|
+
const argToString = styleizer ? (arg) => styleizer(arg, toMeaoiuString(arg)) : toMeaoiuString;
|
|
32
|
+
return { prompt: onPrompt, print: args => onPrint(args.map(argToString).join(' ')) };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../../src/core/run/io.ts"],"names":[],"mappings":"AAAA,qBAAqB;AA2BrB,gBAAgB;AAChB,SAAS,cAAc,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,KAAK;AACL,SAAS,QAAQ,CAAC,KAAc,EAAE,QAAgB;IACjD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,GAAG,2BAAS,GAAG,QAAQ,GAAG,6BAAW,GAAG,CAAC;IAEnE,QAAQ,OAAO,KAAK,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACb,OAAO,GAAG,+BAAY,GAAG,QAAQ,GAAG,6BAAW,EAAE,CAAC;QACnD,KAAK,QAAQ;YACZ,OAAO,GAAG,8BAAW,GAAG,QAAQ,GAAG,6BAAW,EAAE,CAAC;QAClD;YACC,OAAO,QAAQ,CAAC;IAClB,CAAC;AACF,CAAC;AAED,WAAW;AACX,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,EAAY;IAC/E,MAAM,SAAS,GAAsB,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7E,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IACvG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const enum LogLevel {
|
|
2
|
+
DEBUG = 0,
|
|
3
|
+
INFO = 1,
|
|
4
|
+
WARN = 2,
|
|
5
|
+
ERROR = 3
|
|
6
|
+
}
|
|
7
|
+
type LevelKey = Lowercase<keyof typeof LogLevel>;
|
|
8
|
+
declare const logger: Record<LevelKey, (...args: unknown[]) => void>;
|
|
9
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
10
|
+
declare const _default: Readonly<typeof logger>;
|
|
11
|
+
export default _default;
|
|
12
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/core/run/logger.ts"],"names":[],"mappings":"AAEA,0BAAkB,QAAQ;IACzB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACT;AACD,KAAK,QAAQ,GAAG,SAAS,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEjD,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAK1D,CAAC;AAEF,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAKjD;wBAGwB,QAAQ,CAAC,OAAO,MAAM,CAAC;AAAhD,wBAAiD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/core/run/logger.ts
|
|
2
|
+
const DO_NOTHING = () => { };
|
|
3
|
+
const logger = {
|
|
4
|
+
debug: DO_NOTHING,
|
|
5
|
+
info: DO_NOTHING,
|
|
6
|
+
warn: DO_NOTHING,
|
|
7
|
+
error: DO_NOTHING,
|
|
8
|
+
};
|
|
9
|
+
export function setLogLevel(level) {
|
|
10
|
+
logger.debug = level <= 0 /* LogLevel.DEBUG */ ? (...args) => console.debug('[DEBUG]', ...args) : DO_NOTHING;
|
|
11
|
+
logger.info = level <= 1 /* LogLevel.INFO */ ? (...args) => console.info('[INFO]', ...args) : DO_NOTHING;
|
|
12
|
+
logger.warn = level <= 2 /* LogLevel.WARN */ ? (...args) => console.warn('[WARN]', ...args) : DO_NOTHING;
|
|
13
|
+
logger.error = level <= 3 /* LogLevel.ERROR */ ? (...args) => console.error('[ERROR]', ...args) : DO_NOTHING;
|
|
14
|
+
}
|
|
15
|
+
setLogLevel(2 /* LogLevel.WARN */);
|
|
16
|
+
export default logger;
|
|
17
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/core/run/logger.ts"],"names":[],"mappings":"AAAA,yBAAyB;AASzB,MAAM,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AAC5B,MAAM,MAAM,GAAmD;IAC9D,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;CACjB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAe;IAC1C,MAAM,CAAC,KAAK,GAAG,KAAK,0BAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACrG,MAAM,CAAC,IAAI,GAAG,KAAK,yBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjG,MAAM,CAAC,IAAI,GAAG,KAAK,yBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjG,MAAM,CAAC,KAAK,GAAG,KAAK,0BAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACtG,CAAC;AACD,WAAW,uBAAe,CAAC;AAE3B,eAAe,MAAiC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MeaoiuValue } from '../typedef.js';
|
|
2
|
+
import type { Environment } from './environment.js';
|
|
3
|
+
export type ReferenceLink = {
|
|
4
|
+
isReference: true;
|
|
5
|
+
scope: Environment;
|
|
6
|
+
name: string;
|
|
7
|
+
};
|
|
8
|
+
export type VariableValue = ReferenceLink | MeaoiuValue;
|
|
9
|
+
export type EnvVariable = {
|
|
10
|
+
value: VariableValue;
|
|
11
|
+
moved: boolean;
|
|
12
|
+
};
|
|
13
|
+
export declare const enum SignalKind {
|
|
14
|
+
RETURN = 0,
|
|
15
|
+
LOOP = 1,
|
|
16
|
+
BREAK = 2,
|
|
17
|
+
CONTINUE = 3
|
|
18
|
+
}
|
|
19
|
+
declare abstract class Signal<K extends SignalKind> {
|
|
20
|
+
readonly signalKind: K;
|
|
21
|
+
constructor(signalKind: K);
|
|
22
|
+
}
|
|
23
|
+
export declare class ReturnValue extends Signal<SignalKind.RETURN> {
|
|
24
|
+
readonly value: Evaluated;
|
|
25
|
+
constructor(value: Evaluated);
|
|
26
|
+
}
|
|
27
|
+
export declare class LoopValue extends Signal<SignalKind.LOOP> {
|
|
28
|
+
readonly value: Evaluated;
|
|
29
|
+
constructor(value: Evaluated);
|
|
30
|
+
}
|
|
31
|
+
export declare class EmptySignal<K extends SignalKind.BREAK | SignalKind.CONTINUE> extends Signal<K> {
|
|
32
|
+
constructor(kind: K);
|
|
33
|
+
}
|
|
34
|
+
export declare const BREAK_SIGNAL: EmptySignal<SignalKind.BREAK>;
|
|
35
|
+
export declare const CONTINUE_SIGNAL: EmptySignal<SignalKind.CONTINUE>;
|
|
36
|
+
type ControlSignal = ReturnValue | LoopValue | EmptySignal<SignalKind.BREAK> | EmptySignal<SignalKind.CONTINUE>;
|
|
37
|
+
export type Evaluated = VariableValue | ControlSignal;
|
|
38
|
+
export declare function isReferenceLink(value: Evaluated): value is ReferenceLink;
|
|
39
|
+
export declare function isSignal(value: Evaluated): value is ControlSignal;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value.d.ts","sourceRoot":"","sources":["../../../src/core/run/value.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG;IAAE,WAAW,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACpF,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,WAAW,CAAC;AACxD,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnE,0BAAkB,UAAU;IAC3B,MAAM,IAAA;IACN,IAAI,IAAA;IACJ,KAAK,IAAA;IACL,QAAQ,IAAA;CACR;AACD,uBAAe,MAAM,CAAC,CAAC,SAAS,UAAU;aACb,UAAU,EAAE,CAAC;gBAAb,UAAU,EAAE,CAAC;CACzC;AAED,qBAAa,WAAY,SAAQ,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;aAC7B,KAAK,EAAE,SAAS;gBAAhB,KAAK,EAAE,SAAS;CAG5C;AAED,qBAAa,SAAU,SAAQ,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;aACzB,KAAK,EAAE,SAAS;gBAAhB,KAAK,EAAE,SAAS;CAG5C;AACD,qBAAa,WAAW,CAAC,CAAC,SAAS,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;gBAC/E,IAAI,EAAE,CAAC;CAGnB;AACD,eAAO,MAAM,YAAY,+BAAoC,CAAC;AAC9D,eAAO,MAAM,eAAe,kCAAuC,CAAC;AAEpE,KAAK,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAChH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,aAAa,CAAC;AAEtD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,aAAa,CAExE;AACD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,IAAI,aAAa,CAEjE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// src/core/run/types.ts
|
|
2
|
+
class Signal {
|
|
3
|
+
signalKind;
|
|
4
|
+
constructor(signalKind) {
|
|
5
|
+
this.signalKind = signalKind;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
// '叼回来 [值]~'
|
|
9
|
+
export class ReturnValue extends Signal {
|
|
10
|
+
value;
|
|
11
|
+
constructor(value) {
|
|
12
|
+
super(0 /* SignalKind.RETURN */);
|
|
13
|
+
this.value = value;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// '偷袭 <值>~'
|
|
17
|
+
export class LoopValue extends Signal {
|
|
18
|
+
value;
|
|
19
|
+
constructor(value) {
|
|
20
|
+
super(1 /* SignalKind.LOOP */);
|
|
21
|
+
this.value = value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class EmptySignal extends Signal {
|
|
25
|
+
constructor(kind) {
|
|
26
|
+
super(kind);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export const BREAK_SIGNAL = new EmptySignal(2 /* SignalKind.BREAK */); // '累了~'
|
|
30
|
+
export const CONTINUE_SIGNAL = new EmptySignal(3 /* SignalKind.CONTINUE */); //'偷袭~'
|
|
31
|
+
export function isReferenceLink(value) {
|
|
32
|
+
return !!value?.isReference;
|
|
33
|
+
}
|
|
34
|
+
export function isSignal(value) {
|
|
35
|
+
return value instanceof Signal;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value.js","sourceRoot":"","sources":["../../../src/core/run/value.ts"],"names":[],"mappings":"AAAA,wBAAwB;AAexB,MAAe,MAAM;IACQ;IAA5B,YAA4B,UAAa;QAAb,eAAU,GAAV,UAAU,CAAG;IAAG,CAAC;CAC7C;AACD,aAAa;AACb,MAAM,OAAO,WAAY,SAAQ,MAAyB;IAC7B;IAA5B,YAA4B,KAAgB;QAC3C,KAAK,2BAAmB,CAAC;QADE,UAAK,GAAL,KAAK,CAAW;IAE5C,CAAC;CACD;AACD,YAAY;AACZ,MAAM,OAAO,SAAU,SAAQ,MAAuB;IACzB;IAA5B,YAA4B,KAAgB;QAC3C,KAAK,yBAAiB,CAAC;QADI,UAAK,GAAL,KAAK,CAAW;IAE5C,CAAC;CACD;AACD,MAAM,OAAO,WAA8D,SAAQ,MAAS;IAC3F,YAAY,IAAO;QAClB,KAAK,CAAC,IAAI,CAAC,CAAC;IACb,CAAC;CACD;AACD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,WAAW,0BAAkB,CAAC,CAAC,QAAQ;AACvE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,WAAW,6BAAqB,CAAC,CAAC,OAAO;AAK5E,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC/C,OAAO,CAAC,CAAE,KAA8B,EAAE,WAAW,CAAC;AACvD,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,KAAgB;IACxC,OAAO,KAAK,YAAY,MAAM,CAAC;AAChC,CAAC"}
|