meaoiu 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +9 -2
  2. package/dist/api/execution.d.ts +2 -2
  3. package/dist/api/execution.d.ts.map +1 -1
  4. package/dist/api/execution.js +6 -6
  5. package/dist/api/execution.js.map +1 -1
  6. package/dist/api/serviceState.d.ts +1 -1
  7. package/dist/api/serviceState.d.ts.map +1 -1
  8. package/dist/api/serviceState.js +2 -2
  9. package/dist/api/serviceState.js.map +1 -1
  10. package/dist/api/services/formatting.js +2 -2
  11. package/dist/api/services/formatting.js.map +1 -1
  12. package/dist/api/utils/symbolAnalyzer.d.ts.map +1 -1
  13. package/dist/api/utils/symbolAnalyzer.js +3 -11
  14. package/dist/api/utils/symbolAnalyzer.js.map +1 -1
  15. package/dist/cli/main.js +2 -2
  16. package/dist/core/builtIns.d.ts +1 -1
  17. package/dist/core/builtIns.d.ts.map +1 -1
  18. package/dist/core/builtIns.js +2 -2
  19. package/dist/core/builtIns.js.map +1 -1
  20. package/dist/core/{run → engine}/environment.d.ts +2 -0
  21. package/dist/core/engine/environment.d.ts.map +1 -0
  22. package/dist/core/{run → engine}/environment.js +9 -2
  23. package/dist/core/engine/environment.js.map +1 -0
  24. package/dist/core/{run/interpreter.d.ts → engine/evaluater.d.ts} +1 -1
  25. package/dist/core/engine/evaluater.d.ts.map +1 -0
  26. package/dist/core/{run/interpreter.js → engine/evaluater.js} +3 -4
  27. package/dist/core/engine/evaluater.js.map +1 -0
  28. package/dist/core/engine/io.d.ts.map +1 -0
  29. package/dist/core/{run → engine}/io.js +1 -1
  30. package/dist/core/engine/io.js.map +1 -0
  31. package/dist/core/engine/logger.d.ts.map +1 -0
  32. package/dist/core/{run → engine}/logger.js +1 -1
  33. package/dist/core/engine/logger.js.map +1 -0
  34. package/dist/core/engine/value.d.ts.map +1 -0
  35. package/dist/core/{run → engine}/value.js +1 -1
  36. package/dist/core/engine/value.js.map +1 -0
  37. package/dist/core/parser/abstractor.d.ts +9 -0
  38. package/dist/core/parser/abstractor.d.ts.map +1 -0
  39. package/dist/core/parser/abstractor.js +428 -0
  40. package/dist/core/parser/abstractor.js.map +1 -0
  41. package/dist/core/parser/context.d.ts +55 -0
  42. package/dist/core/parser/context.d.ts.map +1 -0
  43. package/dist/core/parser/context.js +145 -0
  44. package/dist/core/parser/context.js.map +1 -0
  45. package/dist/core/typedef.d.ts +1 -1
  46. package/dist/core/typedef.d.ts.map +1 -1
  47. package/dist/core/typedef.js +1 -1
  48. package/dist/core/typedef.js.map +1 -1
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +3 -1
  52. package/dist/index.js.map +1 -1
  53. package/package.json +2 -2
  54. package/dist/core/parser.d.ts +0 -13
  55. package/dist/core/parser.d.ts.map +0 -1
  56. package/dist/core/parser.js +0 -575
  57. package/dist/core/parser.js.map +0 -1
  58. package/dist/core/run/environment.d.ts.map +0 -1
  59. package/dist/core/run/environment.js.map +0 -1
  60. package/dist/core/run/interpreter.d.ts.map +0 -1
  61. package/dist/core/run/interpreter.js.map +0 -1
  62. package/dist/core/run/io.d.ts.map +0 -1
  63. package/dist/core/run/io.js.map +0 -1
  64. package/dist/core/run/logger.d.ts.map +0 -1
  65. package/dist/core/run/logger.js.map +0 -1
  66. package/dist/core/run/value.d.ts.map +0 -1
  67. package/dist/core/run/value.js.map +0 -1
  68. /package/dist/core/{run → engine}/io.d.ts +0 -0
  69. /package/dist/core/{run → engine}/logger.d.ts +0 -0
  70. /package/dist/core/{run → engine}/value.d.ts +0 -0
@@ -0,0 +1,428 @@
1
+ // src/core/parser/abstractor.ts
2
+ import { MeaoiuError, errorFrom } from '../error.js';
3
+ import { ParserContext, syntaxErrorFrom } from './context.js';
4
+ function errorNodeWith({ message, line, col, endLine, endCol }) {
5
+ return { kind: 0 /* NodeKind.ErrorNode */, message, line, col, endLine, endCol };
6
+ }
7
+ function isAssignmentOperator(kind) {
8
+ return kind === 6 /* TokenKind.ASSIGNMENT_IS */ || kind === 7 /* TokenKind.ASSIGNMENT_LIKE */ || kind === 8 /* TokenKind.ASSIGNMENT_ONLY */;
9
+ }
10
+ export function abstractify(tokens, isTolerant = false) {
11
+ const parser = new ParserContext(tokens, isTolerant);
12
+ const body = [];
13
+ for (let tokenKind; (tokenKind = parser.current().kind) !== 1 /* TokenKind.EOF */;) {
14
+ if (tokenKind === 3 /* TokenKind.TERMINATOR */)
15
+ parser.next();
16
+ else
17
+ body.push(parseStatement(parser));
18
+ }
19
+ const { line, col } = tokens[0];
20
+ const { endLine, endCol } = tokens[tokens.length - 1];
21
+ const program = { kind: 1 /* NodeKind.Program */, body, line, col, endLine, endCol };
22
+ // 遗留在缓存的悄悄话挂到根节点
23
+ const unclaimedComments = parser.takeUnclaimedComments();
24
+ if (unclaimedComments.length > 0)
25
+ program.trailingComments = unclaimedComments;
26
+ return { program, errors: parser.errors };
27
+ }
28
+ function parseStatement(parser) {
29
+ const startToken = parser.current();
30
+ const leading = parser.takeUnclaimedComments(); // 取走当前节点的 leading 悄悄话(如果有)
31
+ try {
32
+ let node;
33
+ switch (startToken.kind) {
34
+ case 5 /* TokenKind.KEYWORD_USE */:
35
+ node = parseVariableDeclaration(parser, true);
36
+ break;
37
+ case 16 /* TokenKind.KEYWORD_DEF */:
38
+ node = parseFunctionDeclaration(parser);
39
+ break;
40
+ case 18 /* TokenKind.KEYWORD_RETURN */:
41
+ node = parseReturnOrAmbushStatement(parser, 5 /* NodeKind.ReturnStatement */);
42
+ break;
43
+ case 15 /* TokenKind.KEYWORD_AMBUSH */:
44
+ node = parseReturnOrAmbushStatement(parser, 6 /* NodeKind.AmbushStatement */);
45
+ break;
46
+ case 14 /* TokenKind.KEYWORD_BREAK */:
47
+ parser.next();
48
+ node = { kind: 7 /* NodeKind.BreakStatement */, line: startToken.line, col: startToken.col, ...parser.endLoc() };
49
+ break;
50
+ case 25 /* TokenKind.COLLECTION_END */:
51
+ case 27 /* TokenKind.BLOCK_END */:
52
+ throw syntaxErrorFrom(startToken, '假的语句喵!');
53
+ default:
54
+ const expression = parseExpression(parser);
55
+ const tokenKind = parser.current().kind;
56
+ if (isAssignmentOperator(tokenKind)) {
57
+ node = parseAssignmentStatement(parser, expression, tokenKind); // 将解析好的表达式作为“被赋值者”传入
58
+ }
59
+ else {
60
+ const { line, col } = expression;
61
+ node = { kind: 8 /* NodeKind.ExpressionStatement */, expression, line, col, ...parser.endLoc() };
62
+ }
63
+ }
64
+ const termToken = parser.expect(3 /* TokenKind.TERMINATOR */, '必须有尾巴「~」喵!'); // 检查并消耗终结符
65
+ if (leading.length)
66
+ (node.leadingComments ??= []).push(...leading);
67
+ parser.collectTrailingComments(node, termToken); // 收集并分配 terminator 后面的悄悄话(同一行视为 trailing)
68
+ return node;
69
+ }
70
+ catch (e) {
71
+ const error = e instanceof MeaoiuError ? e : errorFrom(startToken, String(e), 0 /* Phase.UNKNOWN */);
72
+ parser.reportError(error);
73
+ parser.synchronize();
74
+ return errorNodeWith(error);
75
+ }
76
+ }
77
+ function parseVariableDeclaration(parser, hasUse) {
78
+ const { line, col } = hasUse ? (parser.next(), parser.prevOne) : parser.current();
79
+ const identifier = parseIdentifier(parser);
80
+ // 检查后面是否紧跟赋值关键字
81
+ const tokenKind = parser.current().kind;
82
+ const initialization = isAssignmentOperator(tokenKind)
83
+ ? parseAssignmentStatement(parser, identifier, tokenKind)
84
+ : undefined;
85
+ return { kind: 2 /* NodeKind.VariableDeclaration */, identifier, initialization, line, col, ...parser.endLoc() };
86
+ }
87
+ function parseAssignmentStatement(parser, assignee, operator) {
88
+ parser.next();
89
+ const value = parseExpression(parser);
90
+ const { line, col } = assignee;
91
+ return { kind: 3 /* NodeKind.AssignmentStatement */, assignee, value, operator, line, col, ...parser.endLoc() };
92
+ }
93
+ function parseFunctionDeclaration(parser) {
94
+ const { line, col } = (parser.next(), parser.prevOne);
95
+ const parameters = parseBlockExpression(parser, true);
96
+ const name = parseIdentifier(parser);
97
+ const body = parseBlockExpression(parser, false);
98
+ return { kind: 4 /* NodeKind.FunctionDeclaration */, name, parameters, body, line, col, ...parser.endLoc() };
99
+ }
100
+ function parseReturnOrAmbushStatement(parser, nodeKind) {
101
+ const { line, col } = (parser.next(), parser.prevOne);
102
+ const argument = parser.current().kind !== 3 /* TokenKind.TERMINATOR */ ? parseExpression(parser) : undefined;
103
+ return { kind: nodeKind, argument, line, col, ...parser.endLoc() };
104
+ }
105
+ function parseIdentifier(parser) {
106
+ const leading = parser.takeUnclaimedComments();
107
+ const { line, col, value: symbol } = parser.expect(23 /* TokenKind.IDENTIFIER */, '需要一个标识符喵!');
108
+ const node = { kind: 13 /* NodeKind.Identifier */, symbol, line, col, ...parser.endLoc() };
109
+ if (leading.length) {
110
+ if (symbol)
111
+ node.leadingComments = leading;
112
+ else
113
+ parser.rejectComments(leading); // 用不了,送回去
114
+ }
115
+ return node;
116
+ }
117
+ function parseExpression(parser) {
118
+ try {
119
+ return parseLogicalExpression(parser);
120
+ }
121
+ catch (e) {
122
+ const error = e instanceof MeaoiuError ? e : errorFrom(parser.current(), String(e), 0 /* Phase.UNKNOWN */);
123
+ parser.reportError(error);
124
+ parser.consumeToRecoveryPoint(); // 跳过到下一个安全点
125
+ return errorNodeWith(error);
126
+ }
127
+ }
128
+ function parseLogicalExpression(parser) {
129
+ let left = parseSequenceExpression(parser);
130
+ // 循环处理连续的逻辑操作:A 和 B 都好 或 C 不坏
131
+ for (let tokenKind, isOr; (isOr = (tokenKind = parser.current().kind) === 40 /* TokenKind.LOGIC_OR */) || tokenKind === 39 /* TokenKind.LOGIC_AND */;) {
132
+ parser.next();
133
+ const right = parseLogicalExpression(parser);
134
+ const closeToken = parser.current();
135
+ const operator = closeToken.kind;
136
+ switch (operator) {
137
+ case 42 /* TokenKind.LOGIC_CLOSE_OR */:
138
+ if (!isOr)
139
+ parser.reportError(syntaxErrorFrom(closeToken, '逻辑「和」不能用「不坏」闭合喵!'));
140
+ break;
141
+ case 44 /* TokenKind.LOGIC_CLOSE_NAND */:
142
+ if (!isOr)
143
+ parser.reportError(syntaxErrorFrom(closeToken, '逻辑「和」不能用「不好」闭合喵!'));
144
+ break;
145
+ case 41 /* TokenKind.LOGIC_CLOSE_AND */:
146
+ if (isOr)
147
+ parser.reportError(syntaxErrorFrom(closeToken, '逻辑「或」不能用「都好」闭合喵!'));
148
+ break;
149
+ case 43 /* TokenKind.LOGIC_CLOSE_NOR */:
150
+ if (isOr)
151
+ parser.reportError(syntaxErrorFrom(closeToken, '逻辑「或」不能用「都坏」闭合喵!'));
152
+ break;
153
+ case 40 /* TokenKind.LOGIC_OR */:
154
+ case 39 /* TokenKind.LOGIC_AND */:
155
+ throw errorFrom(closeToken, '你不该看到这个喵!', 1 /* Phase.INVARIANT */);
156
+ default:
157
+ const [logic, close, nClose] = isOr ? ['或', '不坏', '不好'] : ['和', '都好', '都坏'];
158
+ parser.makeErrorTail(0 /* TokenKind.ERROR */, `逻辑「${logic}」要有「${close}」或「${nClose}」闭合喵!`);
159
+ continue;
160
+ }
161
+ parser.next();
162
+ const { line, col } = left;
163
+ left = { kind: 23 /* NodeKind.LogicalExpression */, left, right, operator, line, col, ...parser.endLoc() };
164
+ }
165
+ return left;
166
+ }
167
+ function parseSequenceExpression(parser) {
168
+ const { line, col } = parser.current();
169
+ const sections = [parseComparisonExpression(parser)];
170
+ const operators = [];
171
+ sequence: for (let isArithmeticMode = true; parser.peek().kind === 4 /* TokenKind.COMMA */;) {
172
+ const operator = parser.current();
173
+ switch (operator.kind) {
174
+ case 29 /* TokenKind.ARITHMETIC_PLUS */:
175
+ case 30 /* TokenKind.ARITHMETIC_MINUS */:
176
+ case 31 /* TokenKind.ARITHMETIC_MULTIPLY */:
177
+ case 32 /* TokenKind.ARITHMETIC_DIVIDE */:
178
+ if (isArithmeticMode)
179
+ break; // 模式正确
180
+ throw syntaxErrorFrom(operator, '比较之后就不能做算术了喵!');
181
+ case 33 /* TokenKind.COMPARISON_EQUAL */:
182
+ case 34 /* TokenKind.COMPARISON_NOT_EQUAL */:
183
+ isArithmeticMode = false; // 禁用算术模式
184
+ break;
185
+ case 35 /* TokenKind.COMPARISON_GREATER */:
186
+ case 36 /* TokenKind.COMPARISON_LESS */:
187
+ case 37 /* TokenKind.COMPARISON_GREATER_EQUAL */:
188
+ case 38 /* TokenKind.COMPARISON_LESS_EQUAL */:
189
+ throw syntaxErrorFrom(operator, `'${operator.value}' 不能用在节之间喵!`);
190
+ default:
191
+ break sequence;
192
+ }
193
+ parser.next(); // 消费操作符
194
+ parser.next(); // 跳过逗号
195
+ operators.push(operator);
196
+ sections.push(parseComparisonExpression(parser));
197
+ }
198
+ if (sections.length === 1)
199
+ return sections[0];
200
+ return { kind: 22 /* NodeKind.SequenceExpression */, sections, operators, line, col, ...parser.endLoc() };
201
+ }
202
+ function parseComparisonExpression(parser) {
203
+ const { line, col } = parser.current();
204
+ const expressions = [parseArithmeticExpression(parser, 0 /* ArithmeticPrecedence.NONE */)];
205
+ const operators = [];
206
+ comparison: while (parser.peek().kind !== 4 /* TokenKind.COMMA */) {
207
+ const operator = parser.current();
208
+ switch (operator.kind) {
209
+ case 35 /* TokenKind.COMPARISON_GREATER */:
210
+ case 36 /* TokenKind.COMPARISON_LESS */:
211
+ case 37 /* TokenKind.COMPARISON_GREATER_EQUAL */:
212
+ case 38 /* TokenKind.COMPARISON_LESS_EQUAL */:
213
+ case 33 /* TokenKind.COMPARISON_EQUAL */:
214
+ case 34 /* TokenKind.COMPARISON_NOT_EQUAL */:
215
+ break;
216
+ default:
217
+ break comparison;
218
+ }
219
+ parser.next();
220
+ operators.push(operator);
221
+ expressions.push(parseArithmeticExpression(parser, 0 /* ArithmeticPrecedence.NONE */));
222
+ }
223
+ // 如果只有一个操作数(没有比较),返回操作数本身
224
+ if (expressions.length === 1)
225
+ return expressions[0];
226
+ // 否则,创建一个链式比较节点
227
+ return { kind: 21 /* NodeKind.ComparisonExpression */, expressions, operators, line, col, ...parser.endLoc() };
228
+ }
229
+ function parseArithmeticExpression(parser, minPrecedence) {
230
+ let left = parseUnaryExpression(parser);
231
+ arithmetic: for (let precedence = minPrecedence; parser.peek().kind !== 4 /* TokenKind.COMMA */;) {
232
+ const operator = parser.current();
233
+ switch (operator.kind) {
234
+ case 31 /* TokenKind.ARITHMETIC_MULTIPLY */:
235
+ case 32 /* TokenKind.ARITHMETIC_DIVIDE */:
236
+ precedence = 2 /* ArithmeticPrecedence.MULTIPLICATIVE */;
237
+ break;
238
+ case 29 /* TokenKind.ARITHMETIC_PLUS */:
239
+ case 30 /* TokenKind.ARITHMETIC_MINUS */:
240
+ precedence = 1 /* ArithmeticPrecedence.ADDITIVE */;
241
+ break;
242
+ default:
243
+ break arithmetic;
244
+ }
245
+ if (precedence <= minPrecedence)
246
+ break arithmetic;
247
+ parser.next();
248
+ const right = parseArithmeticExpression(parser, precedence);
249
+ const { line, col } = left;
250
+ left = { kind: 20 /* NodeKind.ArithmeticExpression */, left, operator, right, line, col, ...parser.endLoc() };
251
+ }
252
+ return left;
253
+ }
254
+ function parseUnaryExpression(parser) {
255
+ const { kind: tokenKind, line, col } = parser.current();
256
+ let operator;
257
+ switch (tokenKind) {
258
+ case 9 /* TokenKind.KEYWORD_CLONE */:
259
+ operator = 7 /* TokenKind.ASSIGNMENT_LIKE */;
260
+ break;
261
+ case 10 /* TokenKind.KEYWORD_MOVE */:
262
+ operator = 8 /* TokenKind.ASSIGNMENT_ONLY */;
263
+ break;
264
+ default:
265
+ return parseMemberAccessExpression(parser);
266
+ }
267
+ parser.next();
268
+ // 递归调用,这样就可以处理像“高仿 高仿 a”这样的写法
269
+ const argument = parseUnaryExpression(parser);
270
+ return { kind: 19 /* NodeKind.UnaryExpression */, operator, argument, line, col, ...parser.endLoc() };
271
+ }
272
+ function parseMemberAccessExpression(parser) {
273
+ let object = parsePrimaryExpression(parser);
274
+ // 循环处理连续的 @ 访问
275
+ for (let startToken; (startToken = parser.current()).kind === 28 /* TokenKind.ACCESSOR */;) {
276
+ const { kind: tokenKind, value } = parser.next();
277
+ if (tokenKind === 28 /* TokenKind.ACCESSOR */) {
278
+ parser.makeErrorTail(0 /* TokenKind.ERROR */, `不能连着写一长串「${value}」喵!`);
279
+ continue;
280
+ }
281
+ const property = parsePrimaryExpression(parser);
282
+ const { line, col } = startToken;
283
+ object = { kind: 18 /* NodeKind.MemberAccessExpression */, object, property, line, col, ...parser.endLoc() };
284
+ }
285
+ return object;
286
+ }
287
+ function parsePrimaryExpression(parser) {
288
+ const startToken = parser.current();
289
+ const leading = parser.takeUnclaimedComments();
290
+ const { kind: tokenKind, value, line, col } = startToken;
291
+ let node;
292
+ switch (tokenKind) {
293
+ case 19 /* TokenKind.NUMBER */:
294
+ node = { kind: 9 /* NodeKind.NumericLiteral */, value: +value, line, col, ...parser.endLoc(startToken) };
295
+ break;
296
+ case 20 /* TokenKind.STRING */:
297
+ node = { kind: 10 /* NodeKind.StringLiteral */, value, line, col, ...parser.endLoc(startToken) };
298
+ break;
299
+ case 21 /* TokenKind.BOOLEAN */:
300
+ node = { kind: 11 /* NodeKind.BooleanLiteral */, value: value === '好喵', line, col, ...parser.endLoc(startToken) };
301
+ break;
302
+ case 22 /* TokenKind.NULL */:
303
+ node = { kind: 12 /* NodeKind.NullLiteral */, value: null, line, col, ...parser.endLoc(startToken) };
304
+ break;
305
+ case 23 /* TokenKind.IDENTIFIER */:
306
+ node = { kind: 13 /* NodeKind.Identifier */, symbol: value, line, col, ...parser.endLoc(startToken) };
307
+ break;
308
+ case 17 /* TokenKind.KEYWORD_CALL */:
309
+ return parseCallExpression(parser);
310
+ case 26 /* TokenKind.BLOCK_START */:
311
+ return parseBlockOrIfExpression(parser);
312
+ case 24 /* TokenKind.COLLECTION_START */:
313
+ return parseBlockExpression(parser, true);
314
+ case 13 /* TokenKind.KEYWORD_LOOP */:
315
+ return parseLoopExpression(parser);
316
+ case 3 /* TokenKind.TERMINATOR */:
317
+ case 1 /* TokenKind.EOF */:
318
+ throw syntaxErrorFrom(startToken, '只说半句看不懂喵!');
319
+ case 0 /* TokenKind.ERROR */:
320
+ throw errorFrom(startToken, `这个词不对劲喵:${value}`, 2 /* Phase.LEXICAL */);
321
+ default:
322
+ throw syntaxErrorFrom(startToken, `看不懂的把戏喵:${value}`);
323
+ }
324
+ parser.next();
325
+ if (leading.length)
326
+ (node.leadingComments ??= []).push(...leading);
327
+ return node;
328
+ }
329
+ function parseBlockOrIfExpression(parser) {
330
+ const block = parseBlockExpression(parser, false);
331
+ return parser.current().kind === 11 /* TokenKind.KEYWORD_CONFIRM */ ? parseIfExpression(parser, block) : block;
332
+ }
333
+ const blockToggle = [
334
+ {
335
+ name: '想法',
336
+ startKind: 26 /* TokenKind.BLOCK_START */,
337
+ startValue: '[#',
338
+ endKind: 27 /* TokenKind.BLOCK_END */,
339
+ endValue: '#]',
340
+ parseBody: (parser) => {
341
+ const body = [];
342
+ for (let tokenKind; (tokenKind = parser.current().kind) !== 27 /* TokenKind.BLOCK_END */ && tokenKind !== 1 /* TokenKind.EOF */;) {
343
+ if (tokenKind === 3 /* TokenKind.TERMINATOR */ && (parser.next(), true))
344
+ continue;
345
+ body.push(parseStatement(parser));
346
+ }
347
+ return body;
348
+ },
349
+ },
350
+ {
351
+ name: '纸箱',
352
+ startKind: 24 /* TokenKind.COLLECTION_START */,
353
+ startValue: '[=',
354
+ endKind: 25 /* TokenKind.COLLECTION_END */,
355
+ endValue: '=]',
356
+ parseBody: parseCollectionBody,
357
+ },
358
+ ]; // 0: 想法, 1: 纸箱
359
+ function parseBlockExpression(parser, isCollection) {
360
+ const modeSwitch = +isCollection;
361
+ const { name, startKind, startValue, endKind, endValue, parseBody } = blockToggle[modeSwitch];
362
+ const { line, col } = parser.expect(startKind, `${name}需要以「${startValue}」开头喵!`);
363
+ parser.blockDepth[modeSwitch]++;
364
+ const body = parseBody(parser);
365
+ parser.expect(endKind, `${name}需要以「${endValue}」结尾喵!`);
366
+ parser.blockDepth[modeSwitch]--;
367
+ return { kind: 14 /* NodeKind.BlockExpression */, body, isCollection, line, col, ...parser.endLoc() };
368
+ }
369
+ function parseCollectionBody(parser) {
370
+ const body = [];
371
+ collection: for (let tokenKind; (tokenKind = parser.current().kind) !== 25 /* TokenKind.COLLECTION_END */ &&
372
+ tokenKind !== 3 /* TokenKind.TERMINATOR */ &&
373
+ tokenKind !== 1 /* TokenKind.EOF */;) {
374
+ if (tokenKind === 4 /* TokenKind.COMMA */) {
375
+ parser.makeErrorTail(0 /* TokenKind.ERROR */, `这个「${parser.current().value}」是多余的喵!`);
376
+ parser.next();
377
+ continue;
378
+ }
379
+ const hasUse = tokenKind === 5 /* TokenKind.KEYWORD_USE */;
380
+ if (!hasUse && (tokenKind !== 23 /* TokenKind.IDENTIFIER */ || !isAssignmentOperator(parser.peek().kind))) {
381
+ const expression = parseExpression(parser); // 一般表达式模式
382
+ const { line, col } = expression;
383
+ body.push({ kind: 8 /* NodeKind.ExpressionStatement */, expression, line, col, ...parser.endLoc() });
384
+ }
385
+ else
386
+ body.push(parseVariableDeclaration(parser, hasUse)); // 声明模式,如 `蹭 a 就是 1` 或 `a 就是 1`
387
+ switch (parser.current().kind) {
388
+ case 16 /* TokenKind.KEYWORD_DEF */:
389
+ case 18 /* TokenKind.KEYWORD_RETURN */:
390
+ case 15 /* TokenKind.KEYWORD_AMBUSH */:
391
+ case 14 /* TokenKind.KEYWORD_BREAK */:
392
+ case 25 /* TokenKind.COLLECTION_END */:
393
+ break collection;
394
+ default:
395
+ parser.expect(4 /* TokenKind.COMMA */, `要用「,」隔开才好看喵!`);
396
+ }
397
+ }
398
+ return body;
399
+ }
400
+ function parseIfExpression(parser, consequent) {
401
+ parser.next();
402
+ const condition = parseExpression(parser);
403
+ let alternate;
404
+ const tokenKind = parser.current().kind;
405
+ if (tokenKind === 12 /* TokenKind.KEYWORD_ELSE */ ||
406
+ (tokenKind === 3 /* TokenKind.TERMINATOR */ &&
407
+ parser.peek().kind === 12 /* TokenKind.KEYWORD_ELSE */ &&
408
+ (parser.next() /* 吃掉可选「~」*/, true))) {
409
+ if (parser.next().kind === 26 /* TokenKind.BLOCK_START */)
410
+ alternate = parseBlockOrIfExpression(parser);
411
+ else
412
+ parser.makeErrorTail(26 /* TokenKind.BLOCK_START */, `要有想法「[#...#]」喵!`);
413
+ }
414
+ const { line, col } = consequent;
415
+ return { kind: 15 /* NodeKind.IfExpression */, consequent, condition, alternate, line, col, ...parser.endLoc() };
416
+ }
417
+ function parseLoopExpression(parser) {
418
+ const { line, col } = (parser.next(), parser.prevOne);
419
+ const body = parseBlockExpression(parser, false);
420
+ return { kind: 16 /* NodeKind.LoopExpression */, body, line, col, ...parser.endLoc() };
421
+ }
422
+ function parseCallExpression(parser) {
423
+ const { line, col } = (parser.next(), parser.prevOne);
424
+ const args = parseExpression(parser);
425
+ const callee = parseIdentifier(parser);
426
+ return { kind: 17 /* NodeKind.CallExpression */, args, callee, line, col, ...parser.endLoc() };
427
+ }
428
+ //# sourceMappingURL=abstractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractor.js","sourceRoot":"","sources":["../../../src/core/parser/abstractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type * as AST from '../ast.js';
2
+ import type { Comments } from '../ast.js';
3
+ import { type MeaoiuError } from '../error.js';
4
+ import { TokenKind, type Token } from '../lexer/token.js';
5
+ export declare const syntaxErrorFrom: (ele: Token, message: string) => MeaoiuError;
6
+ export declare class ParserContext {
7
+ private readonly TOLERANT;
8
+ private readonly tokens;
9
+ private readonly MAX_POS;
10
+ private position;
11
+ prevOne: Token;
12
+ readonly blockDepth: Int16Array<ArrayBuffer>;
13
+ readonly errors: MeaoiuError[];
14
+ private commentBuffer;
15
+ constructor(tokens: Token[], isTolerant: boolean);
16
+ current(): Token;
17
+ peek(): Token;
18
+ /**
19
+ * 推进位置并取得下一词元,同时将途经悄悄话收入 commentBuffer
20
+ * @returns 下一个非悄悄话词元(可能为 EOF)
21
+ */
22
+ next(): Token;
23
+ /**
24
+ * 取得当前非悄悄话词元,若当前为悄悄话则连续推进至目标(同时收集悄悄话到 commentBuffer)
25
+ * @returns 当前词元 或其后第一个非悄悄话词元(或 EOF)
26
+ */
27
+ drainCommentsAhead(): Token;
28
+ /**
29
+ * 从缓存中拿走所有待分配的悄悄话并清空缓存
30
+ * @returns 所有待分配的悄悄话
31
+ */
32
+ takeUnclaimedComments(): Comments;
33
+ /** 归还不要的悄悄话,放在新收集的前面 */
34
+ rejectComments(rejectedComments: Comments): void;
35
+ /**
36
+ * 把缓存里的悄悄话按是否与 anchorToken 同一行分离:
37
+ * 同行的视为节点的 trailing;异行则留为后续节点的 leading(放回 commentBuffer)
38
+ */
39
+ collectTrailingComments(node: AST.Node, anchorToken: Token): void;
40
+ endLoc({ endLine, endCol }?: Token): {
41
+ endLine: number;
42
+ endCol: number;
43
+ };
44
+ reportError(error: MeaoiuError): void;
45
+ /**
46
+ * 虚构尾随词元并报告错误。
47
+ * @param kind 虚构词元种类,若无预期则可传 TokenKind.ERROR
48
+ * @returns 虚构词元
49
+ */
50
+ makeErrorTail(kind: TokenKind, why: string, where?: string): Token;
51
+ expect(kind: TokenKind, why: string, where?: string): Token;
52
+ synchronize(): void;
53
+ consumeToRecoveryPoint(): void;
54
+ }
55
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/core/parser/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,GAAG,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAY,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AA4BpE,eAAO,MAAM,eAAe,QAAS,KAAK,WAAW,MAAM,gBAA6C,CAAC;AAEzG,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAK;IACd,OAAO,EAAE,KAAK,CAAC;IAEtB,SAAgB,UAAU,0BAAqB;IAC/C,SAAgB,MAAM,EAAE,WAAW,EAAE,CAAM;IAC3C,OAAO,CAAC,aAAa,CAAgB;IAErC,YAAY,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAU/C;IAEM,OAAO,IAAI,KAAK,CAEtB;IAGM,IAAI,IAAI,KAAK,CAEnB;IAED;;;OAGG;IACI,IAAI,IAAI,KAAK,CAInB;IAED;;;OAGG;IACI,kBAAkB,IAAI,KAAK,CAOjC;IAED;;;OAGG;IACI,qBAAqB,IAAI,QAAQ,CAIvC;IACD,wBAAwB;IACjB,cAAc,CAAC,gBAAgB,EAAE,QAAQ,GAAG,IAAI,CAEtD;IAED;;;OAGG;IACI,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAG,IAAI,CAYvE;IAEM,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAE,KAAoB,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAE5F;IAEM,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAG3C;IAED;;;;OAIG;IACI,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAQxE;IAEM,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAGjE;IAEM,WAAW,IAAI,IAAI,CAczB;IAEM,sBAAsB,IAAI,IAAI,CAMpC;CACD"}
@@ -0,0 +1,145 @@
1
+ // src/core/parser/context.ts
2
+ import { errorFrom } from '../error.js';
3
+ import { newToken } from '../lexer/token.js';
4
+ function isStartKind(kind) {
5
+ switch (kind) {
6
+ case 5 /* TokenKind.KEYWORD_USE */:
7
+ case 13 /* TokenKind.KEYWORD_LOOP */:
8
+ case 14 /* TokenKind.KEYWORD_BREAK */:
9
+ case 15 /* TokenKind.KEYWORD_AMBUSH */:
10
+ case 16 /* TokenKind.KEYWORD_DEF */:
11
+ case 17 /* TokenKind.KEYWORD_CALL */:
12
+ case 18 /* TokenKind.KEYWORD_RETURN */:
13
+ case 26 /* TokenKind.BLOCK_START */:
14
+ return true;
15
+ default:
16
+ return false;
17
+ }
18
+ }
19
+ export const syntaxErrorFrom = (ele, message) => errorFrom(ele, message, 3 /* Phase.SYNTACTIC */);
20
+ export class ParserContext {
21
+ TOLERANT;
22
+ tokens;
23
+ MAX_POS;
24
+ position = 0;
25
+ prevOne; // 上一个非悄悄话词元
26
+ blockDepth = new Int16Array(2); // 0: 想法, 1: 纸箱
27
+ errors = [];
28
+ commentBuffer = []; // 悄悄话缓存:drainCommentsAhead 会把遇到的 COMMENT 放进这里
29
+ constructor(tokens, isTolerant) {
30
+ this.TOLERANT = isTolerant;
31
+ // 确保有 EOF 哨兵,避免边界问题
32
+ if (!tokens.length || tokens[tokens.length - 1].kind !== 1 /* TokenKind.EOF */) {
33
+ const EOF = newToken(1 /* TokenKind.EOF */, 'EndOfFile', -1, -1, -1, -1);
34
+ tokens.push((this.reportError(errorFrom(EOF, '分词器可能坏了喵~', 1 /* Phase.INVARIANT */)), EOF));
35
+ }
36
+ this.tokens = tokens;
37
+ this.MAX_POS = tokens.length - 1;
38
+ this.prevOne = this.drainCommentsAhead(); // 收集前导悄悄话,确保起步位置可食用
39
+ }
40
+ current() {
41
+ return this.tokens[this.position];
42
+ }
43
+ // 前视一位
44
+ peek() {
45
+ return this.tokens[Math.min(this.position + 1, this.MAX_POS)];
46
+ }
47
+ /**
48
+ * 推进位置并取得下一词元,同时将途经悄悄话收入 commentBuffer
49
+ * @returns 下一个非悄悄话词元(可能为 EOF)
50
+ */
51
+ next() {
52
+ this.prevOne = this.current();
53
+ if (this.position < this.MAX_POS)
54
+ this.position++;
55
+ return this.drainCommentsAhead();
56
+ }
57
+ /**
58
+ * 取得当前非悄悄话词元,若当前为悄悄话则连续推进至目标(同时收集悄悄话到 commentBuffer)
59
+ * @returns 当前词元 或其后第一个非悄悄话词元(或 EOF)
60
+ */
61
+ drainCommentsAhead() {
62
+ let token = this.current();
63
+ while (token.kind === 2 /* TokenKind.COMMENT */ && this.position < this.MAX_POS) {
64
+ this.commentBuffer.push(token);
65
+ token = this.tokens[++this.position];
66
+ }
67
+ return token;
68
+ }
69
+ /**
70
+ * 从缓存中拿走所有待分配的悄悄话并清空缓存
71
+ * @returns 所有待分配的悄悄话
72
+ */
73
+ takeUnclaimedComments() {
74
+ const comments = this.commentBuffer;
75
+ this.commentBuffer = [];
76
+ return comments;
77
+ }
78
+ /** 归还不要的悄悄话,放在新收集的前面 */
79
+ rejectComments(rejectedComments) {
80
+ this.commentBuffer = (rejectedComments.push(...this.commentBuffer), rejectedComments);
81
+ }
82
+ /**
83
+ * 把缓存里的悄悄话按是否与 anchorToken 同一行分离:
84
+ * 同行的视为节点的 trailing;异行则留为后续节点的 leading(放回 commentBuffer)
85
+ */
86
+ collectTrailingComments(node, anchorToken) {
87
+ this.drainCommentsAhead(); // 先把当前位置开始的悄悄话也收进缓存(保证没有漏掉)
88
+ if (!this.commentBuffer.length)
89
+ return;
90
+ const trailing = [];
91
+ const remaining = [];
92
+ // 同一行的视为 trailing,不同一行的留作下一节点的 leading
93
+ for (const comment of this.commentBuffer)
94
+ (comment.line === anchorToken.line ? trailing : remaining).push(comment);
95
+ if (trailing.length)
96
+ (node.trailingComments ??= []).push(...trailing);
97
+ this.commentBuffer = remaining; // 将非 trailing 的悄悄话保留为新 commentBuffer
98
+ }
99
+ endLoc({ endLine, endCol } = this.prevOne) {
100
+ return { endLine, endCol };
101
+ }
102
+ reportError(error) {
103
+ if (!this.TOLERANT)
104
+ throw error;
105
+ this.errors.push(error); // tolerant 模式记录错误
106
+ }
107
+ /**
108
+ * 虚构尾随词元并报告错误。
109
+ * @param kind 虚构词元种类,若无预期则可传 TokenKind.ERROR
110
+ * @returns 虚构词元
111
+ */
112
+ makeErrorTail(kind, why, where) {
113
+ const { endLine, endCol, value } = this.prevOne; // 前一词做锚点
114
+ const fakeTermToken = newToken(kind, '', endLine, endCol, endLine, endCol);
115
+ const errMsg = `${where ?? `在「${value}」后`}${why}`;
116
+ this.reportError(syntaxErrorFrom(fakeTermToken, errMsg));
117
+ return fakeTermToken;
118
+ }
119
+ expect(kind, why, where) {
120
+ // 当前词元符合期望即前进并取走,否则在原地用假词元迎合解析器的期望
121
+ return this.current().kind === kind ? (this.next(), this.prevOne) : this.makeErrorTail(kind, why, where);
122
+ }
123
+ synchronize() {
124
+ // 首先尝试找到 TERMINATOR 或语句开始,跳过闭块符,顺便捕获块配对问题
125
+ for (let tokenKind = this.current().kind; tokenKind !== 1 /* TokenKind.EOF */; tokenKind = this.next().kind) {
126
+ if (tokenKind === 3 /* TokenKind.TERMINATOR */)
127
+ return void this.next();
128
+ if (isStartKind(tokenKind))
129
+ return;
130
+ const depthIndex = +(tokenKind === 25 /* TokenKind.COLLECTION_END */);
131
+ if (!depthIndex && tokenKind !== 27 /* TokenKind.BLOCK_END */)
132
+ continue;
133
+ if (this.blockDepth[depthIndex] > 0)
134
+ return;
135
+ const token = this.current();
136
+ this.reportError(syntaxErrorFrom(token, `这个「${token.value}」被孤立了喵!`));
137
+ this.blockDepth[depthIndex] = 0; // 龟苓膏之术,对症下药喵
138
+ }
139
+ }
140
+ consumeToRecoveryPoint() {
141
+ for (let tokenKind = this.current().kind; tokenKind !== 1 /* TokenKind.EOF */ && tokenKind !== 3 /* TokenKind.TERMINATOR */ && !isStartKind(tokenKind); tokenKind = this.next().kind)
142
+ ; // 跳到 terminator / statement start / EOF
143
+ }
144
+ }
145
+ //# sourceMappingURL=context.js.map