meaoiu 0.1.1 → 0.1.2

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 (43) hide show
  1. package/dist/api/execution.d.ts.map +1 -1
  2. package/dist/api/execution.js +3 -3
  3. package/dist/api/execution.js.map +1 -1
  4. package/dist/api/serviceState.d.ts.map +1 -1
  5. package/dist/api/serviceState.js +3 -6
  6. package/dist/api/serviceState.js.map +1 -1
  7. package/dist/api/services/formatting.d.ts.map +1 -1
  8. package/dist/api/services/formatting.js +4 -6
  9. package/dist/api/services/formatting.js.map +1 -1
  10. package/dist/api/utils/symbolAnalyzer.d.ts +1 -2
  11. package/dist/api/utils/symbolAnalyzer.d.ts.map +1 -1
  12. package/dist/api/utils/symbolAnalyzer.js +25 -9
  13. package/dist/api/utils/symbolAnalyzer.js.map +1 -1
  14. package/dist/api/utils/symbolTable.d.ts +3 -3
  15. package/dist/api/utils/symbolTable.d.ts.map +1 -1
  16. package/dist/cli/main.js +1 -1
  17. package/dist/core/builtIns.d.ts +4 -3
  18. package/dist/core/builtIns.d.ts.map +1 -1
  19. package/dist/core/builtIns.js +4 -6
  20. package/dist/core/builtIns.js.map +1 -1
  21. package/dist/core/error.d.ts +4 -11
  22. package/dist/core/error.d.ts.map +1 -1
  23. package/dist/core/error.js +9 -20
  24. package/dist/core/error.js.map +1 -1
  25. package/dist/core/lexer/tokenizer.d.ts +3 -0
  26. package/dist/core/lexer/tokenizer.d.ts.map +1 -1
  27. package/dist/core/lexer/tokenizer.js +76 -84
  28. package/dist/core/lexer/tokenizer.js.map +1 -1
  29. package/dist/core/parser.d.ts +1 -77
  30. package/dist/core/parser.d.ts.map +1 -1
  31. package/dist/core/parser.js +38 -32
  32. package/dist/core/parser.js.map +1 -1
  33. package/dist/core/run/environment.d.ts.map +1 -1
  34. package/dist/core/run/environment.js +1 -2
  35. package/dist/core/run/environment.js.map +1 -1
  36. package/dist/core/run/interpreter.d.ts.map +1 -1
  37. package/dist/core/run/interpreter.js +7 -7
  38. package/dist/core/run/interpreter.js.map +1 -1
  39. package/dist/core/typedef.d.ts +16 -7
  40. package/dist/core/typedef.d.ts.map +1 -1
  41. package/dist/core/typedef.js +10 -10
  42. package/dist/core/typedef.js.map +1 -1
  43. package/package.json +2 -2
@@ -1,6 +1,9 @@
1
1
  // src/core/lexer/tokenizer.ts
2
2
  import { preprocess } from './preprocessor.js';
3
- import { MeaoiuBuiltInNames } from '../builtIns.js';
3
+ import { builtInNameSet } from '../builtIns.js';
4
+ export function newToken(kind, value, startLine, startCol, endLine, endCol) {
5
+ return { kind, value, line: startLine, col: startCol, endLine, endCol };
6
+ }
4
7
  const KEYWORDS = {
5
8
  蹭: 1 /* TokenKind.KEYWORD_USE */,
6
9
  就是: 2 /* TokenKind.ASSIGNMENT_IS */,
@@ -33,24 +36,26 @@ const ID_CONTINUE_REGEX = /[\p{ID_Continue}]/v;
33
36
  const isNumChar = (char) => char >= '0' && char <= '9';
34
37
  export function tokenize(sourceCode, options) {
35
38
  const { ignoreComments = true, convertNonAscii = true, useOnebased = true } = options ?? {};
36
- const OriginBase = +useOnebased;
37
39
  if (convertNonAscii)
38
40
  sourceCode = preprocess(sourceCode);
39
41
  const sourceCodeLen = sourceCode.length;
40
- // 小本本:记函数
41
- const functionNames = new Set(MeaoiuBuiltInNames);
42
- let expectingFuncNameAfterParamEnd = false;
42
+ const OriginBase = +useOnebased;
43
43
  const tokens = [];
44
44
  let line = OriginBase, col = OriginBase, cursor = 0;
45
45
  const charAt = (cursor) => String.fromCodePoint(sourceCode.codePointAt(cursor));
46
- const advance = (steps = 1) => {
46
+ const advance = (steps) => {
47
47
  const target = cursor + steps;
48
48
  const end = Math.min(target, sourceCodeLen);
49
49
  while (cursor < end)
50
50
  sourceCode[cursor++] === '\n' ? (line++, (col = OriginBase)) : col++;
51
51
  cursor = target;
52
52
  };
53
- while (cursor < sourceCodeLen) {
53
+ const functionNames = new Set(builtInNameSet); // 小本本:记函数
54
+ const susIdIndexes = []; // 嫌疑标识符名单
55
+ let funcCallState = 0 /* FuncCallState.OK */; // 自然衰变的神奇喵喵标签
56
+ scanSourceCode: for (let funcDefState = 0 /* FuncDefState.NOT_DEF */; cursor < sourceCodeLen; funcCallState++ === -2 /* FuncCallState.MISSED */
57
+ ? (susIdIndexes.push(tokens.length - 2), (funcCallState = 1 /* FuncCallState.PASSED */))
58
+ : 0) {
54
59
  const startLine = line;
55
60
  const startCol = col;
56
61
  const char = charAt(cursor);
@@ -78,25 +83,22 @@ export function tokenize(sourceCode, options) {
78
83
  i--; // 退一步,把最后的 ')' 排除在截取范围外
79
84
  if (!ignoreComments) {
80
85
  const commentContent = sourceCode.slice(contentStart, i);
81
- tokens.push({ kind: 43 /* TokenKind.COMMENT */, value: commentContent, line: startLine, col: startCol });
86
+ tokens.push(newToken(43 /* TokenKind.COMMENT */, commentContent, startLine, startCol, line, col));
82
87
  }
83
88
  continue;
84
89
  }
85
90
  // 关键字
86
- let matchedKeyword;
87
91
  for (const keyword of sortedKeywords) {
88
- if (sourceCode.startsWith(keyword, cursor)) {
89
- matchedKeyword = keyword;
90
- break;
91
- }
92
- }
93
- if (matchedKeyword) {
94
- const tokenKind = KEYWORDS[matchedKeyword];
95
- tokens.push({ kind: tokenKind, value: matchedKeyword, line: startLine, col: startCol });
96
- advance(matchedKeyword.length);
92
+ if (!sourceCode.startsWith(keyword, cursor))
93
+ continue;
94
+ const tokenKind = KEYWORDS[keyword];
95
+ advance(keyword.length);
96
+ tokens.push(newToken(tokenKind, keyword, startLine, startCol, line, col));
97
97
  if (tokenKind === 12 /* TokenKind.KEYWORD_DEF */)
98
- expectingFuncNameAfterParamEnd = true; // '想要'
99
- continue;
98
+ funcDefState = 1 /* FuncDefState.PASS_PARAM */;
99
+ else if (tokenKind === 13 /* TokenKind.KEYWORD_CALL */)
100
+ funcCallState = -1 /* FuncCallState.SEEK_PARAM */;
101
+ continue scanSourceCode;
100
102
  }
101
103
  // 二字原子
102
104
  doubleCharAtomic: if (cursor + 1 < sourceCodeLen) {
@@ -120,6 +122,7 @@ export function tokenize(sourceCode, options) {
120
122
  break;
121
123
  case '=]':
122
124
  kind = 21 /* TokenKind.COLLECTION_END */;
125
+ funcDefState &&= 2 /* FuncDefState.GET_NAME */;
123
126
  break;
124
127
  case '[#':
125
128
  kind = 22 /* TokenKind.BLOCK_START */;
@@ -130,10 +133,8 @@ export function tokenize(sourceCode, options) {
130
133
  default:
131
134
  break doubleCharAtomic;
132
135
  }
133
- tokens.push({ kind, value: twoCharSymbol, line: startLine, col: startCol });
134
136
  advance(2);
135
- if (kind !== 21 /* TokenKind.COLLECTION_END */)
136
- expectingFuncNameAfterParamEnd = false;
137
+ tokens.push(newToken(kind, twoCharSymbol, startLine, startCol, line, col));
137
138
  continue;
138
139
  }
139
140
  // 单字原子
@@ -166,12 +167,14 @@ export function tokenize(sourceCode, options) {
166
167
  break;
167
168
  case '~':
168
169
  kind = 24 /* TokenKind.TERMINATOR */;
170
+ if (funcDefState === 2 /* FuncDefState.GET_NAME */)
171
+ funcDefState = 0 /* FuncDefState.NOT_DEF */;
169
172
  break;
170
173
  default:
171
174
  break singleCharAtomic;
172
175
  }
173
- tokens.push({ kind, value: char, line: startLine, col: startCol });
174
- advance(charLen);
176
+ advance(1);
177
+ tokens.push(newToken(kind, char, startLine, startCol, line, col));
175
178
  continue;
176
179
  }
177
180
  // 非负数字,十进制整数及小数
@@ -180,13 +183,12 @@ export function tokenize(sourceCode, options) {
180
183
  while (i < sourceCodeLen && isNumChar(sourceCode[i]))
181
184
  i++;
182
185
  if (i + 1 < sourceCodeLen && sourceCode[i] === '.' && isNumChar(sourceCode[i + 1])) {
183
- i++;
184
- while (i < sourceCodeLen && isNumChar(sourceCode[i]))
185
- i++;
186
+ for (i++; i < sourceCodeLen && isNumChar(sourceCode[i]); i++)
187
+ ;
186
188
  }
187
189
  const numStr = sourceCode.slice(cursor, i);
188
190
  advance(i - cursor);
189
- tokens.push({ kind: 15 /* TokenKind.NUMBER */, value: numStr, line: startLine, col: startCol });
191
+ tokens.push(newToken(15 /* TokenKind.NUMBER */, numStr, startLine, startCol, line, col));
190
192
  continue;
191
193
  }
192
194
  // 字符串
@@ -197,107 +199,97 @@ export function tokenize(sourceCode, options) {
197
199
  i++;
198
200
  const str = sourceCode.slice(contentStart, i);
199
201
  advance(i - cursor + charLen);
200
- tokens.push({ kind: 16 /* TokenKind.STRING */, value: str, line: startLine, col: startCol });
202
+ tokens.push(newToken(16 /* TokenKind.STRING */, str, startLine, startCol, line, col));
201
203
  continue;
202
204
  }
203
205
  // 标识符
204
- if (ID_START_REGEX.test(char) || char === '{') {
205
- let identifier = '', identifierStartCol = startCol, i = cursor;
206
- if (char === '{') {
207
- const contentStart = (i += charLen); // 跳过 '{' 并记录内容起点
206
+ const isCurlyIdentifier = char === '{';
207
+ if (isCurlyIdentifier || ID_START_REGEX.test(char)) {
208
+ let identifierStartCol = startCol, contentStart = cursor, i = cursor;
209
+ scanId: if (isCurlyIdentifier) {
210
+ funcCallState = 0 /* FuncCallState.OK */;
211
+ contentStart = i += charLen; // 跳过 '{' 并记录内容起点
208
212
  identifierStartCol += charLen; // 记录标识符真正的起始列
209
213
  while (i < sourceCodeLen && sourceCode[i] !== '}')
210
214
  i++;
211
- identifier = sourceCode.slice(contentStart, i++); // 截取标识并跳过闭合的 '}',未闭合会多越界一步但安全
215
+ if (i !== contentStart)
216
+ break scanId;
217
+ // 空白则记录错误并跳出
218
+ advance(2); // 跳过一对 '{}'
219
+ tokens.push(newToken(0 /* TokenKind.ERROR */, sourceCode.slice(i - 1, i + 1), startLine, startCol, line, col));
220
+ continue;
212
221
  }
213
222
  else {
214
- parseIdentifier: while (i < sourceCodeLen) {
223
+ if (funcCallState === 0 /* FuncCallState.SEEKING_PARAM */)
224
+ funcCallState = -3 /* FuncCallState.SEEK_NAME */;
225
+ else if (funcCallState === -2 /* FuncCallState.SEEKING_NAME */)
226
+ funcCallState = 0 /* FuncCallState.OK */;
227
+ while (i < sourceCodeLen) {
215
228
  const idChar = charAt(i);
216
229
  if (!ID_CONTINUE_REGEX.test(idChar))
217
230
  break;
218
- // 有粘连的关键字则打断
219
231
  for (const keyword of sortedKeywords)
220
232
  if (sourceCode.startsWith(keyword, i))
221
- break parseIdentifier;
233
+ break scanId; // 有粘连的关键字则打断
222
234
  i += idChar.length;
223
235
  }
224
- identifier = sourceCode.slice(cursor, i);
225
236
  }
226
237
  advance(i - cursor);
227
238
  // 统一创建标识符词元
228
- if (identifier) {
229
- tokens.push({
230
- kind: 19 /* TokenKind.IDENTIFIER */,
231
- value: identifier,
232
- line: startLine,
233
- col: identifierStartCol,
234
- });
235
- if (expectingFuncNameAfterParamEnd) {
236
- // 抓到了!这个标识符就是函数名喵!
237
- functionNames.add(identifier);
238
- expectingFuncNameAfterParamEnd = false; // 重置状态
239
- }
239
+ const identifier = sourceCode.slice(contentStart, i); // 截取标识
240
+ tokens.push(newToken(19 /* TokenKind.IDENTIFIER */, identifier, startLine, identifierStartCol, line, col));
241
+ if (isCurlyIdentifier)
242
+ advance(1); // 跳过闭合的 '}'
243
+ if (funcDefState === 2 /* FuncDefState.GET_NAME */) {
244
+ functionNames.add(identifier); // 抓到了!这个标识符就是函数名喵!
245
+ funcDefState = 0 /* FuncDefState.NOT_DEF */; // 重置状态
240
246
  }
241
247
  continue;
242
248
  }
243
249
  // 不认识的字符喵
244
- tokens.push({ kind: 0 /* TokenKind.ERROR */, value: char, line: startLine, col: startCol });
245
- console.error('不认识的字符喵:', char);
246
250
  advance(charLen);
251
+ tokens.push(newToken(0 /* TokenKind.ERROR */, char, startLine, startCol, line, col));
252
+ console.error('不认识的字符喵:', char);
247
253
  }
248
- tokens.push({ kind: 44 /* TokenKind.EOF */, value: 'EndOfFile', line, col });
249
- return repairCallTokens(tokens, functionNames);
254
+ if (funcCallState === -2 /* FuncCallState.MISSED */)
255
+ susIdIndexes.push(tokens.length - 1); // 补尾
256
+ tokens.push(newToken(44 /* TokenKind.EOF */, 'EndOfFile', line, col, line, col));
257
+ return susIdIndexes.length ? repairCallTokens(tokens, functionNames, susIdIndexes) : tokens;
250
258
  }
251
259
  /**
252
260
  * 遍历原始 Token 列表,修复被错误合并的 `扒纸箱名函数名`。
253
261
  */
254
- function repairCallTokens(tokens, functionNames) {
255
- // 为了最高效的匹配,按长度降序排序
256
- // 这样能确保 `喵` 不会错误地匹配 `xxx高级喵` 的 `喵`
262
+ function repairCallTokens(tokens, functionNames, indexesToSplit) {
263
+ // 按长度降序排序,确保 `喵` 不会错误地匹配 `xxx高级喵` 的 `喵`
257
264
  const sortedFunctionNames = Array.from(functionNames).sort((a, b) => b.length - a.length);
258
265
  const repairedTokens = [];
259
- const lastIndex = tokens.length - 1;
260
- let i = 0;
261
- scanTokens: while (i < lastIndex) {
266
+ scanTokens: for (let i = 0, j = 0, indexToSplit = indexesToSplit[j]; i < tokens.length; i++) {
262
267
  const currentToken = tokens[i];
263
- const nextToken = tokens[i + 1];
264
268
  // 检查是否是需要修复的目标
265
- if (currentToken.kind !== 13 /* TokenKind.KEYWORD_CALL */ || // 不是 '扒'
266
- nextToken.kind !== 19 /* TokenKind.IDENTIFIER */ || // 后面无跟着的标识符
267
- tokens[i + 2]?.kind === 19 /* TokenKind.IDENTIFIER */ // 后面跟着第二个标识符
268
- ) {
269
- // 不是需要修复的目标,或者是一个安全的 `扒 纸箱名 函数名`
269
+ if (i !== indexToSplit) {
270
270
  repairedTokens.push(currentToken);
271
- i++;
272
271
  continue;
273
272
  }
274
- // 找到了一个潜在目标,例如 '扒 纸箱名函数名 ~'
275
- const { value: valueToSplit, line, col } = nextToken;
273
+ indexToSplit = indexesToSplit[Math.min(++j, indexesToSplit.length - 1)];
274
+ // 匹配潜在目标
275
+ const { value: valueToSplit, line, col, endLine, endCol } = currentToken;
276
276
  for (const funcName of sortedFunctionNames) {
277
277
  // 检查这个函数名是不是标识符的后缀
278
- if (!valueToSplit.endsWith(funcName) || valueToSplit.length <= funcName.length)
278
+ if (valueToSplit.length <= funcName.length || !valueToSplit.endsWith(funcName))
279
279
  continue;
280
280
  // 找到了!是它喵!
281
281
  const collectionName = valueToSplit.slice(0, -funcName.length);
282
+ const splitCol = col + collectionName.length;
282
283
  // 创建 “纸箱名” 及 “函数名”
283
- const collectionToken = { kind: 19 /* TokenKind.IDENTIFIER */, value: collectionName, line, col };
284
- const functionToken = {
285
- kind: 19 /* TokenKind.IDENTIFIER */,
286
- value: funcName,
287
- line,
288
- col: col + collectionName.length,
289
- };
284
+ const collectionToken = newToken(19 /* TokenKind.IDENTIFIER */, collectionName, line, col, line, splitCol);
285
+ const functionToken = newToken(19 /* TokenKind.IDENTIFIER */, funcName, line, splitCol, endLine, endCol);
290
286
  // 推入修复后的版本
291
- repairedTokens.push(currentToken /*扒*/, collectionToken /*纸箱名*/, functionToken /*函数名*/);
292
- i += 2; // 跳过 '扒' 和 '纸箱名函数名' 这两个原始 Token
287
+ repairedTokens.push(collectionToken /*纸箱名*/, functionToken /*函数名*/);
293
288
  continue scanTokens; // 匹配成功,检查下一组词元
294
289
  }
295
- // 如果没找到匹配,说明它就是一个普通的 `扒 某个变量`,正常推入
290
+ // 无匹配关键字,照常推入
296
291
  repairedTokens.push(currentToken);
297
- i++;
298
292
  }
299
- if (i <= lastIndex)
300
- repairedTokens.push(tokens[i]); // 补尾
301
293
  return repairedTokens;
302
294
  }
303
295
  //# sourceMappingURL=tokenizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../src/core/lexer/tokenizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../src/core/lexer/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -9,81 +9,5 @@ export type ParseResult = {
9
9
  program: AST.Program;
10
10
  errors: MeaoiuError[];
11
11
  };
12
- export declare class Parser {
13
- private readonly tokens;
14
- private readonly MODE;
15
- private readonly MAX_POS;
16
- private readonly blockDepth;
17
- private readonly errors;
18
- private position;
19
- private commentBuffer;
20
- constructor(tokens: Token[], mode?: ParseMode);
21
- private current;
22
- private peek;
23
- /**
24
- * 返回当前位置的「非悄悄话 token」,并将位置推进到下一个 token(非悄悄话或 EOF),
25
- * 同时把遇到的悄悄话收集到 commentBuffer
26
- * @returns 当前位置的 token(非 COMMENT)
27
- */
28
- private advance;
29
- /**
30
- * 推进位置(同时掠取悄悄话)并取得下一 token
31
- * @returns 悄悄话之后一个 token 的再下一 token
32
- */
33
- private next;
34
- /**
35
- * 返回上一个非悄悄话 token(不动位置)
36
- * @returns 上一个非悄悄话 token
37
- */
38
- private lookBack;
39
- /**
40
- * 取得当前非悄悄话 token,若当前为悄悄话则连续推进至目标(同时收集悄悄话到 commentBuffer)
41
- * @returns 当前 token 或其后第一个非悄悄话 token(或 EOF)
42
- */
43
- private drainCommentsAhead;
44
- /**
45
- * 从缓存中拿走所有待分配的 leading 悄悄话(并清空缓存)
46
- * @returns 所有待分配的悄悄话
47
- */
48
- private takeLeadingComments;
49
- /**
50
- * 把缓存里的悄悄话按是否与 anchorToken 同一行分离:
51
- * - 同行的视为 trailing(尾随悄悄话),附给 node
52
- * - 不同的保留为未来节点的 leading(放回 commentBuffer)
53
- */
54
- private collectTrailingComments;
55
- private endLoc;
56
- private reportError;
57
- /**
58
- * 虚构尾随词元并报告错误。
59
- * @param kind 虚构词元种类,若无预期则可传 TokenKind.ERROR
60
- * @returns 虚构 token
61
- */
62
- private makeErrorTail;
63
- private expect;
64
- private synchronize;
65
- private consumeToRecoveryPoint;
66
- parse(): ParseResult;
67
- private parseStatement;
68
- private parseVariableDeclaration;
69
- private parseAssignmentStatement;
70
- private parseFunctionDeclaration;
71
- private parseReturnOrAmbushStatement;
72
- private parseIdentifier;
73
- private parseExpression;
74
- private parseLogicalExpression;
75
- private parseSequenceExpression;
76
- private parseComparisonExpression;
77
- private parseAdditiveExpression;
78
- private parseMultiplicativeExpression;
79
- private parseUnaryExpression;
80
- private parseMemberAccessExpression;
81
- private parsePrimaryExpression;
82
- private parseBlockOrIfExpression;
83
- private parseBlockExpression;
84
- private parseCollectionElement;
85
- private parseIfExpression;
86
- private parseLoopExpression;
87
- private parseCallExpression;
88
- }
12
+ export declare function parse(tokens: Token[], mode?: ParseMode): ParseResult;
89
13
  //# sourceMappingURL=parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAKN,KAAK,KAAK,EACV,MAAM,sBAAsB,CAAC;AAE9B,0BAAkB,SAAS;IAC1B,MAAM,IAAA;IACN,QAAQ,IAAA;CACR;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IACrB,MAAM,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC;AA6EF,qBAAa,MAAM;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAK;IAGrB,OAAO,CAAC,aAAa,CAAe;gBAExB,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAE,SAA4B;IAW/D,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,IAAI;IAIZ;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAMf;;;OAGG;IACH,OAAO,CAAC,IAAI;IAKZ;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAOhB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,WAAW;IAKnB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,sBAAsB;IAQvB,KAAK,IAAI,WAAW;IAwB3B,OAAO,CAAC,cAAc;IA2DtB,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,sBAAsB;IA4C9B,OAAO,CAAC,uBAAuB;IAqC/B,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,6BAA6B;IAWrC,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,2BAA2B;IAkBnC,OAAO,CAAC,sBAAsB;IA2C9B,OAAO,CAAC,wBAAwB;IAKhC,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,mBAAmB;CAM3B"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAMN,KAAK,KAAK,EACV,MAAM,sBAAsB,CAAC;AAE9B,0BAAkB,SAAS;IAC1B,MAAM,IAAA;IACN,QAAQ,IAAA;CACR;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IACrB,MAAM,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC;AAkqBF,wBAAgB,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAE,SAA4B,GAAG,WAAW,CAEtF"}
@@ -1,5 +1,6 @@
1
1
  // src/core/parser.ts
2
2
  import { MeaoiuError, errorFrom } from './error.js';
3
+ import { newToken, } from './lexer/tokenizer.js';
3
4
  const blockKindInfo = [
4
5
  {
5
6
  name: '想法',
@@ -19,9 +20,6 @@ const blockKindInfo = [
19
20
  },
20
21
  ]; // 0: 想法, 1: 纸箱
21
22
  const syntaxErrorFrom = (ele, message) => errorFrom(ele, message, 3 /* Phase.SYNTACTIC */);
22
- function tokenTrailing({ line, col: prevCol, value: prevValue }, kind, value = '') {
23
- return { kind, value, line, col: prevCol + prevValue.length };
24
- }
25
23
  function errorNodeWith({ message, line, col, endLine, endCol }) {
26
24
  return { kind: 0 /* NodeKind.ErrorNode */, message, line, col, endLine, endCol };
27
25
  }
@@ -62,7 +60,7 @@ function isStartToken(kind) {
62
60
  function isAssignmentOperator(kind) {
63
61
  return kind === 2 /* TokenKind.ASSIGNMENT_IS */ || kind === 3 /* TokenKind.ASSIGNMENT_LIKE */ || kind === 4 /* TokenKind.ASSIGNMENT_ONLY */;
64
62
  }
65
- export class Parser {
63
+ class Parser {
66
64
  tokens;
67
65
  MODE;
68
66
  MAX_POS;
@@ -72,13 +70,14 @@ export class Parser {
72
70
  // 悄悄话缓存:advance / drainCommentsAhead 会把遇到的 COMMENT 放进这里
73
71
  commentBuffer = [];
74
72
  constructor(tokens, mode = 0 /* ParseMode.STRICT */) {
73
+ this.MODE = mode;
75
74
  // 确保有 EOF 哨兵,避免边界问题
76
75
  if (!tokens.length || tokens[tokens.length - 1].kind !== 44 /* TokenKind.EOF */) {
77
- tokens.push({ kind: 44 /* TokenKind.EOF */, value: 'EndOfFile', line: -1, col: -1 });
76
+ const EOF = newToken(44 /* TokenKind.EOF */, 'EndOfFile', -1, -1, -1, -1);
77
+ tokens.push((this.reportError(errorFrom(EOF, '分词器可能坏了喵~', 1 /* Phase.INVARIANT */)), EOF));
78
78
  }
79
79
  this.tokens = tokens;
80
80
  this.MAX_POS = tokens.length - 1;
81
- this.MODE = mode;
82
81
  }
83
82
  // 当前 token(安全!)
84
83
  current() {
@@ -151,17 +150,16 @@ export class Parser {
151
150
  return;
152
151
  const trailing = [];
153
152
  const remaining = [];
154
- for (const comment of this.commentBuffer) {
155
- // 同一行的视为 trailing,不同一行的留作下一节点的 leading
153
+ // 同一行的视为 trailing,不同一行的留作下一节点的 leading
154
+ for (const comment of this.commentBuffer)
156
155
  (comment.line === anchorToken.line ? trailing : remaining).push(comment);
157
- }
158
156
  if (trailing.length)
159
157
  (node.trailingComments ??= []).push(...trailing);
160
158
  // 将非 trailing 的悄悄话保留为新的 commentBuffer
161
159
  this.commentBuffer = remaining;
162
160
  }
163
- endLoc(token = this.lookBack()) {
164
- return { endLine: token.line, endCol: token.col + token.value.length };
161
+ endLoc({ endLine, endCol } = this.lookBack()) {
162
+ return { endLine, endCol };
165
163
  }
166
164
  reportError(error) {
167
165
  if (this.MODE !== 1 /* ParseMode.TOLERANT */)
@@ -175,9 +173,9 @@ export class Parser {
175
173
  */
176
174
  makeErrorTail(kind, why, where) {
177
175
  // 找到前一个 token 做锚点
178
- const prevToken = this.lookBack();
179
- const fakeTermToken = tokenTrailing(prevToken, kind);
180
- const errMsg = `${where ?? `在「${prevToken.value}」后`}${why}`;
176
+ const { endLine, endCol, value } = this.lookBack();
177
+ const fakeTermToken = newToken(kind, '', endLine, endCol, endLine, endCol);
178
+ const errMsg = `${where ?? `在「${value}」后`}${why}`;
181
179
  this.reportError(syntaxErrorFrom(fakeTermToken, errMsg));
182
180
  return fakeTermToken;
183
181
  }
@@ -189,20 +187,20 @@ export class Parser {
189
187
  return this.makeErrorTail(kind, why, where);
190
188
  }
191
189
  synchronize() {
192
- // 首先尝试找到 TERMINATOR 或语句开始
190
+ // 首先尝试找到 TERMINATOR 或语句开始,跳过闭块符,顺便捕获块配对问题
193
191
  for (let tokenKind = this.current().kind; tokenKind !== 44 /* TokenKind.EOF */; tokenKind = this.next().kind) {
194
192
  if (tokenKind === 24 /* TokenKind.TERMINATOR */)
195
193
  return void this.advance();
196
194
  if (isStartToken(tokenKind))
197
195
  return;
198
- if (tokenKind === 23 /* TokenKind.BLOCK_END */ || tokenKind === 21 /* TokenKind.COLLECTION_END */) {
199
- const depthIndex = +(tokenKind === 21 /* TokenKind.COLLECTION_END */);
200
- if (this.blockDepth[depthIndex] > 0)
201
- return;
202
- const token = this.current();
203
- this.errors.push(syntaxErrorFrom(token, `这个「${token.value}」被孤立了喵!`));
204
- this.blockDepth[depthIndex] = 0; // 龟苓膏之术,对症下药喵
205
- }
196
+ const depthIndex = +(tokenKind === 21 /* TokenKind.COLLECTION_END */);
197
+ if (!depthIndex && tokenKind !== 23 /* TokenKind.BLOCK_END */)
198
+ continue;
199
+ if (this.blockDepth[depthIndex] > 0)
200
+ return;
201
+ const token = this.current();
202
+ this.reportError(syntaxErrorFrom(token, `这个「${token.value}」被孤立了喵!`));
203
+ this.blockDepth[depthIndex] = 0; // 龟苓膏之术,对症下药喵
206
204
  }
207
205
  }
208
206
  // 用于 parseExpression 内部:跳到 terminator / statement start / EOF
@@ -211,9 +209,8 @@ export class Parser {
211
209
  ;
212
210
  }
213
211
  parse() {
214
- const startToken = this.current();
215
- const { kind: startKind, line, col } = startToken;
216
- const program = { kind: 1 /* NodeKind.Program */, body: [], line, col, endLine: line, endCol: col };
212
+ const { kind: startKind, line, col, endLine, endCol } = this.current();
213
+ const program = { kind: 1 /* NodeKind.Program */, body: [], line, col, endLine, endCol };
217
214
  for (let tokenKind = startKind; tokenKind !== 44 /* TokenKind.EOF */; tokenKind = this.current().kind) {
218
215
  if (tokenKind === 24 /* TokenKind.TERMINATOR */)
219
216
  this.advance();
@@ -226,9 +223,7 @@ export class Parser {
226
223
  (lastStatement.trailingComments ??= []).push(...this.commentBuffer);
227
224
  this.commentBuffer = [];
228
225
  }
229
- const { line: endLine, col: endCol, value: endValue } = this.tokens[this.position - 1] ?? startToken;
230
- program.endLine = endLine;
231
- program.endCol = endCol + endValue.length;
226
+ ({ endLine: program.endLine, endCol: program.endCol } = this.tokens[Math.max(0, this.position - 1)]);
232
227
  return { program, errors: this.errors };
233
228
  }
234
229
  parseStatement() {
@@ -280,7 +275,7 @@ export class Parser {
280
275
  return node;
281
276
  }
282
277
  catch (e) {
283
- const error = e instanceof MeaoiuError ? e : syntaxErrorFrom(startToken, e instanceof Error ? e.message : String(e));
278
+ const error = e instanceof MeaoiuError ? e : errorFrom(startToken, String(e), 0 /* Phase.UNKNOWN */);
284
279
  this.reportError(error);
285
280
  this.synchronize();
286
281
  return errorNodeWith(error);
@@ -481,7 +476,13 @@ export class Parser {
481
476
  let node;
482
477
  switch (tokenKind) {
483
478
  case 15 /* TokenKind.NUMBER */:
484
- node = { kind: 9 /* NodeKind.NumericLiteral */, value: parseFloat(value), line, col, ...this.endLoc(startToken) };
479
+ node = {
480
+ kind: 9 /* NodeKind.NumericLiteral */,
481
+ value: Number.parseFloat(value),
482
+ line,
483
+ col,
484
+ ...this.endLoc(startToken),
485
+ };
485
486
  break;
486
487
  case 16 /* TokenKind.STRING */:
487
488
  node = { kind: 10 /* NodeKind.StringLiteral */, value, line, col, ...this.endLoc(startToken) };
@@ -506,8 +507,10 @@ export class Parser {
506
507
  case 24 /* TokenKind.TERMINATOR */:
507
508
  case 44 /* TokenKind.EOF */:
508
509
  throw syntaxErrorFrom(startToken, '只说半句看不懂喵!');
510
+ case 0 /* TokenKind.ERROR */:
511
+ throw errorFrom(startToken, `这个词不对劲喵:${value}`, 2 /* Phase.LEXICAL */);
509
512
  default:
510
- throw syntaxErrorFrom(startToken, `看不懂的把戏喵: ${value}`);
513
+ throw syntaxErrorFrom(startToken, `看不懂的把戏喵:${value}`);
511
514
  }
512
515
  this.advance();
513
516
  if (leading.length)
@@ -581,4 +584,7 @@ export class Parser {
581
584
  return { kind: 17 /* NodeKind.CallExpression */, args, callee, line, col, ...this.endLoc() };
582
585
  }
583
586
  }
587
+ export function parse(tokens, mode = 0 /* ParseMode.STRICT */) {
588
+ return new Parser(tokens, mode).parse();
589
+ }
584
590
  //# sourceMappingURL=parser.js.map