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.
Files changed (132) hide show
  1. package/LANGUAGE_GUIDE.md +511 -0
  2. package/LICENSE +21 -0
  3. package/README.md +336 -0
  4. package/dist/api/execution.d.ts +9 -0
  5. package/dist/api/execution.d.ts.map +1 -0
  6. package/dist/api/execution.js +17 -0
  7. package/dist/api/execution.js.map +1 -0
  8. package/dist/api/serviceState.d.ts +24 -0
  9. package/dist/api/serviceState.d.ts.map +1 -0
  10. package/dist/api/serviceState.js +53 -0
  11. package/dist/api/serviceState.js.map +1 -0
  12. package/dist/api/services/completions.d.ts +15 -0
  13. package/dist/api/services/completions.d.ts.map +1 -0
  14. package/dist/api/services/completions.js +48 -0
  15. package/dist/api/services/completions.js.map +1 -0
  16. package/dist/api/services/diagnostics.d.ts +9 -0
  17. package/dist/api/services/diagnostics.d.ts.map +1 -0
  18. package/dist/api/services/diagnostics.js +5 -0
  19. package/dist/api/services/diagnostics.js.map +1 -0
  20. package/dist/api/services/formatting.d.ts +2 -0
  21. package/dist/api/services/formatting.d.ts.map +1 -0
  22. package/dist/api/services/formatting.js +223 -0
  23. package/dist/api/services/formatting.js.map +1 -0
  24. package/dist/api/services/highlight.d.ts +14 -0
  25. package/dist/api/services/highlight.d.ts.map +1 -0
  26. package/dist/api/services/highlight.js +58 -0
  27. package/dist/api/services/highlight.js.map +1 -0
  28. package/dist/api/services/inlayHints.d.ts +22 -0
  29. package/dist/api/services/inlayHints.d.ts.map +1 -0
  30. package/dist/api/services/inlayHints.js +100 -0
  31. package/dist/api/services/inlayHints.js.map +1 -0
  32. package/dist/api/services/search.d.ts +17 -0
  33. package/dist/api/services/search.d.ts.map +1 -0
  34. package/dist/api/services/search.js +35 -0
  35. package/dist/api/services/search.js.map +1 -0
  36. package/dist/api/utils/astUtils.d.ts +11 -0
  37. package/dist/api/utils/astUtils.d.ts.map +1 -0
  38. package/dist/api/utils/astUtils.js +106 -0
  39. package/dist/api/utils/astUtils.js.map +1 -0
  40. package/dist/api/utils/lspUtils.d.ts +16 -0
  41. package/dist/api/utils/lspUtils.d.ts.map +1 -0
  42. package/dist/api/utils/lspUtils.js +5 -0
  43. package/dist/api/utils/lspUtils.js.map +1 -0
  44. package/dist/api/utils/symbolAnalyzer.d.ts +37 -0
  45. package/dist/api/utils/symbolAnalyzer.d.ts.map +1 -0
  46. package/dist/api/utils/symbolAnalyzer.js +440 -0
  47. package/dist/api/utils/symbolAnalyzer.js.map +1 -0
  48. package/dist/api/utils/symbolTable.d.ts +28 -0
  49. package/dist/api/utils/symbolTable.d.ts.map +1 -0
  50. package/dist/api/utils/symbolTable.js +3 -0
  51. package/dist/api/utils/symbolTable.js.map +1 -0
  52. package/dist/cli/main.d.ts +3 -0
  53. package/dist/cli/main.d.ts.map +1 -0
  54. package/dist/cli/main.js +92 -0
  55. package/dist/cli/main.js.map +1 -0
  56. package/dist/cli/tools/completer.d.ts +2 -0
  57. package/dist/cli/tools/completer.d.ts.map +1 -0
  58. package/dist/cli/tools/completer.js +24 -0
  59. package/dist/cli/tools/completer.js.map +1 -0
  60. package/dist/cli/tools/diagnoser.d.ts +2 -0
  61. package/dist/cli/tools/diagnoser.d.ts.map +1 -0
  62. package/dist/cli/tools/diagnoser.js +29 -0
  63. package/dist/cli/tools/diagnoser.js.map +1 -0
  64. package/dist/cli/tools/formatter.d.ts +2 -0
  65. package/dist/cli/tools/formatter.d.ts.map +1 -0
  66. package/dist/cli/tools/formatter.js +27 -0
  67. package/dist/cli/tools/formatter.js.map +1 -0
  68. package/dist/cli/tools/searcher.d.ts +4 -0
  69. package/dist/cli/tools/searcher.d.ts.map +1 -0
  70. package/dist/cli/tools/searcher.js +30 -0
  71. package/dist/cli/tools/searcher.js.map +1 -0
  72. package/dist/cli/tools/starter.d.ts +3 -0
  73. package/dist/cli/tools/starter.d.ts.map +1 -0
  74. package/dist/cli/tools/starter.js +23 -0
  75. package/dist/cli/tools/starter.js.map +1 -0
  76. package/dist/cli/tools/toolUtils.d.ts +8 -0
  77. package/dist/cli/tools/toolUtils.d.ts.map +1 -0
  78. package/dist/cli/tools/toolUtils.js +52 -0
  79. package/dist/cli/tools/toolUtils.js.map +1 -0
  80. package/dist/core/ast.d.ts +140 -0
  81. package/dist/core/ast.d.ts.map +1 -0
  82. package/dist/core/ast.js +3 -0
  83. package/dist/core/ast.js.map +1 -0
  84. package/dist/core/builtIns.d.ts +15 -0
  85. package/dist/core/builtIns.d.ts.map +1 -0
  86. package/dist/core/builtIns.js +175 -0
  87. package/dist/core/builtIns.js.map +1 -0
  88. package/dist/core/error.d.ts +41 -0
  89. package/dist/core/error.d.ts.map +1 -0
  90. package/dist/core/error.js +63 -0
  91. package/dist/core/error.js.map +1 -0
  92. package/dist/core/parser.d.ts +89 -0
  93. package/dist/core/parser.d.ts.map +1 -0
  94. package/dist/core/parser.js +578 -0
  95. package/dist/core/parser.js.map +1 -0
  96. package/dist/core/preprocessor.d.ts +2 -0
  97. package/dist/core/preprocessor.d.ts.map +1 -0
  98. package/dist/core/preprocessor.js +187 -0
  99. package/dist/core/preprocessor.js.map +1 -0
  100. package/dist/core/run/environment.d.ts +43 -0
  101. package/dist/core/run/environment.d.ts.map +1 -0
  102. package/dist/core/run/environment.js +192 -0
  103. package/dist/core/run/environment.js.map +1 -0
  104. package/dist/core/run/interpreter.d.ts +13 -0
  105. package/dist/core/run/interpreter.d.ts.map +1 -0
  106. package/dist/core/run/interpreter.js +415 -0
  107. package/dist/core/run/interpreter.js.map +1 -0
  108. package/dist/core/run/io.d.ts +18 -0
  109. package/dist/core/run/io.d.ts.map +1 -0
  110. package/dist/core/run/io.js +34 -0
  111. package/dist/core/run/io.js.map +1 -0
  112. package/dist/core/run/logger.d.ts +12 -0
  113. package/dist/core/run/logger.d.ts.map +1 -0
  114. package/dist/core/run/logger.js +17 -0
  115. package/dist/core/run/logger.js.map +1 -0
  116. package/dist/core/run/value.d.ts +41 -0
  117. package/dist/core/run/value.d.ts.map +1 -0
  118. package/dist/core/run/value.js +37 -0
  119. package/dist/core/run/value.js.map +1 -0
  120. package/dist/core/tokenizer.d.ts +82 -0
  121. package/dist/core/tokenizer.d.ts.map +1 -0
  122. package/dist/core/tokenizer.js +277 -0
  123. package/dist/core/tokenizer.js.map +1 -0
  124. package/dist/core/typedef.d.ts +32 -0
  125. package/dist/core/typedef.d.ts.map +1 -0
  126. package/dist/core/typedef.js +67 -0
  127. package/dist/core/typedef.js.map +1 -0
  128. package/dist/index.d.ts +12 -0
  129. package/dist/index.d.ts.map +1 -0
  130. package/dist/index.js +13 -0
  131. package/dist/index.js.map +1 -0
  132. package/package.json +60 -0
@@ -0,0 +1,82 @@
1
+ export declare const enum TokenKind {
2
+ ERROR = 0,//不认识的字符喵
3
+ KEYWORD_USE = 1,
4
+ KEYWORD_IS = 2,
5
+ KEYWORD_LIKE = 3,
6
+ KEYWORD_ONLY = 4,
7
+ KEYWORD_CLONE = 5,
8
+ KEYWORD_MOVE = 6,
9
+ KEYWORD_CONFIRM = 7,
10
+ KEYWORD_ELSE = 8,
11
+ KEYWORD_LOOP = 9,
12
+ KEYWORD_BREAK = 10,
13
+ KEYWORD_AMBUSH = 11,
14
+ KEYWORD_DEF = 12,
15
+ KEYWORD_CALL = 13,
16
+ KEYWORD_RETURN = 14,
17
+ NUMBER = 15,
18
+ STRING = 16,
19
+ BOOLEAN = 17,
20
+ NULL = 18,
21
+ IDENTIFIER = 19,
22
+ COLLECTION_START = 20,// [=
23
+ COLLECTION_END = 21,// =]
24
+ BLOCK_START = 22,// [#
25
+ BLOCK_END = 23,// #]
26
+ TERMINATOR = 24,// ~
27
+ ACCESSOR = 25,// @
28
+ OPERATOR = 26,// +, -, *, /, ==, !=, >, <, >=, <=
29
+ COMMA = 27,// ,
30
+ LOGIC_AND = 28,// 和
31
+ LOGIC_OR = 29,// 或
32
+ LOGIC_CLOSE_AND = 30,// 都好
33
+ LOGIC_CLOSE_OR = 31,// 不坏
34
+ LOGIC_CLOSE_NOR = 32,// 都坏
35
+ LOGIC_CLOSE_NAND = 33,// 不好
36
+ COMMENT = 34,
37
+ EOF = 35
38
+ }
39
+ export declare const KEYWORDS: {
40
+ readonly 蹭: TokenKind.KEYWORD_USE;
41
+ readonly 就是: TokenKind.KEYWORD_IS;
42
+ readonly 就像: TokenKind.KEYWORD_LIKE;
43
+ readonly 高仿: TokenKind.KEYWORD_CLONE;
44
+ readonly 才是: TokenKind.KEYWORD_ONLY;
45
+ readonly 抢走: TokenKind.KEYWORD_MOVE;
46
+ readonly '\u597D\u4E0D\u597D?': TokenKind.KEYWORD_CONFIRM;
47
+ readonly 不然: TokenKind.KEYWORD_ELSE;
48
+ readonly 玩耍: TokenKind.KEYWORD_LOOP;
49
+ readonly 累了: TokenKind.KEYWORD_BREAK;
50
+ readonly 想要: TokenKind.KEYWORD_DEF;
51
+ readonly 扒: TokenKind.KEYWORD_CALL;
52
+ readonly 叼回来: TokenKind.KEYWORD_RETURN;
53
+ readonly 偷袭: TokenKind.KEYWORD_AMBUSH;
54
+ readonly 好喵: TokenKind.BOOLEAN;
55
+ readonly 坏喵: TokenKind.BOOLEAN;
56
+ readonly 空碗: TokenKind.NULL;
57
+ readonly 和: TokenKind.LOGIC_AND;
58
+ readonly 或: TokenKind.LOGIC_OR;
59
+ readonly 都好: TokenKind.LOGIC_CLOSE_AND;
60
+ readonly 不坏: TokenKind.LOGIC_CLOSE_OR;
61
+ readonly 都坏: TokenKind.LOGIC_CLOSE_NOR;
62
+ readonly 不好: TokenKind.LOGIC_CLOSE_NAND;
63
+ };
64
+ export type Keyword = keyof typeof KEYWORDS;
65
+ export declare function isKeyword(symbol: string): symbol is Keyword;
66
+ export declare const sortedKeywords: Keyword[];
67
+ export declare const OP_ARITH: Set<string>;
68
+ export declare const OP_COMP: Set<string>;
69
+ export declare const OP_COMP_E: Set<string>;
70
+ export type Token = {
71
+ kind: TokenKind;
72
+ value: string;
73
+ line: number;
74
+ col: number;
75
+ };
76
+ export type TokenizerOptions = {
77
+ ignoreComments?: boolean;
78
+ convertFullWidth?: boolean;
79
+ useOnebased?: boolean;
80
+ };
81
+ export declare function tokenize(sourceCode: string, options?: TokenizerOptions): Token[];
82
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/core/tokenizer.ts"],"names":[],"mappings":"AAKA,0BAAkB,SAAS;IAC1B,KAAK,IAAA,CAAE,SAAS;IAGhB,WAAW,IAAA;IACX,UAAU,IAAA;IACV,YAAY,IAAA;IACZ,YAAY,IAAA;IACZ,aAAa,IAAA;IACb,YAAY,IAAA;IACZ,eAAe,IAAA;IACf,YAAY,IAAA;IACZ,YAAY,IAAA;IACZ,aAAa,KAAA;IACb,cAAc,KAAA;IACd,WAAW,KAAA;IACX,YAAY,KAAA;IACZ,cAAc,KAAA;IAGd,MAAM,KAAA;IACN,MAAM,KAAA;IACN,OAAO,KAAA;IACP,IAAI,KAAA;IAGJ,UAAU,KAAA;IAGV,gBAAgB,KAAA,CAAE,KAAK;IACvB,cAAc,KAAA,CAAE,KAAK;IACrB,WAAW,KAAA,CAAE,KAAK;IAClB,SAAS,KAAA,CAAE,KAAK;IAChB,UAAU,KAAA,CAAE,IAAI;IAChB,QAAQ,KAAA,CAAE,IAAI;IACd,QAAQ,KAAA,CAAE,mCAAmC;IAC7C,KAAK,KAAA,CAAE,IAAI;IAGX,SAAS,KAAA,CAAE,IAAI;IACf,QAAQ,KAAA,CAAE,IAAI;IACd,eAAe,KAAA,CAAE,KAAK;IACtB,cAAc,KAAA,CAAE,KAAK;IACrB,eAAe,KAAA,CAAE,KAAK;IACtB,gBAAgB,KAAA,CAAE,KAAK;IAGvB,OAAO,KAAA;IACP,GAAG,KAAA;CACH;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;CAwByB,CAAC;AAC/C,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,QAAQ,CAAC;AAC5C,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,OAAO,CAE3D;AAED,eAAO,MAAM,cAAc,EAAgE,OAAO,EAAE,CAAC;AAErG,eAAO,MAAM,QAAQ,aAAgC,CAAC;AACtD,eAAO,MAAM,OAAO,aAA8C,CAAC;AACnE,eAAO,MAAM,SAAS,aAAwB,CAAC;AAK/C,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,KAAK,EAAE,CA+LhF"}
@@ -0,0 +1,277 @@
1
+ // src/core/tokenizer.ts
2
+ import { preprocess } from './preprocessor.js';
3
+ import { MeaoiuBuiltInNames } from './builtIns.js';
4
+ export const KEYWORDS = {
5
+ 蹭: 1 /* TokenKind.KEYWORD_USE */,
6
+ 就是: 2 /* TokenKind.KEYWORD_IS */,
7
+ 就像: 3 /* TokenKind.KEYWORD_LIKE */,
8
+ 高仿: 5 /* TokenKind.KEYWORD_CLONE */,
9
+ 才是: 4 /* TokenKind.KEYWORD_ONLY */,
10
+ 抢走: 6 /* TokenKind.KEYWORD_MOVE */,
11
+ '好不好?': 7 /* TokenKind.KEYWORD_CONFIRM */,
12
+ 不然: 8 /* TokenKind.KEYWORD_ELSE */,
13
+ 玩耍: 9 /* TokenKind.KEYWORD_LOOP */,
14
+ 累了: 10 /* TokenKind.KEYWORD_BREAK */,
15
+ 想要: 12 /* TokenKind.KEYWORD_DEF */,
16
+ 扒: 13 /* TokenKind.KEYWORD_CALL */,
17
+ 叼回来: 14 /* TokenKind.KEYWORD_RETURN */,
18
+ 偷袭: 11 /* TokenKind.KEYWORD_AMBUSH */,
19
+ 好喵: 17 /* TokenKind.BOOLEAN */,
20
+ 坏喵: 17 /* TokenKind.BOOLEAN */,
21
+ 空碗: 18 /* TokenKind.NULL */,
22
+ 和: 28 /* TokenKind.LOGIC_AND */,
23
+ 或: 29 /* TokenKind.LOGIC_OR */,
24
+ 都好: 30 /* TokenKind.LOGIC_CLOSE_AND */,
25
+ 不坏: 31 /* TokenKind.LOGIC_CLOSE_OR */,
26
+ 都坏: 32 /* TokenKind.LOGIC_CLOSE_NOR */,
27
+ 不好: 33 /* TokenKind.LOGIC_CLOSE_NAND */,
28
+ };
29
+ export function isKeyword(symbol) {
30
+ return symbol in KEYWORDS;
31
+ }
32
+ export const sortedKeywords = Object.keys(KEYWORDS).sort((a, b) => b.length - a.length);
33
+ export const OP_ARITH = new Set(['+', '-', '*', '/']);
34
+ export const OP_COMP = new Set(['==', '!=', '>', '<', '>=', '<=']);
35
+ export const OP_COMP_E = new Set(['==', '!=']);
36
+ const ID_START_REGEX = /[\p{ID_Start}_]/v;
37
+ const ID_CONTINUE_REGEX = /[\p{ID_Continue}]/v;
38
+ const isNumChar = (char) => char >= '0' && char <= '9';
39
+ export function tokenize(sourceCode, options) {
40
+ const { ignoreComments = true, convertFullWidth = true, useOnebased = true } = options ?? {};
41
+ const OriginBase = +useOnebased;
42
+ if (convertFullWidth)
43
+ sourceCode = preprocess(sourceCode);
44
+ const sourceCodeLen = sourceCode.length;
45
+ // 小本本:记函数
46
+ const functionNames = new Set(MeaoiuBuiltInNames);
47
+ let expectingFuncNameAfterParamEnd = false;
48
+ const tokens = [];
49
+ let line = OriginBase, col = OriginBase, cursor = 0;
50
+ const charAt = (cursor) => String.fromCodePoint(sourceCode.codePointAt(cursor));
51
+ const advance = (steps = 1) => {
52
+ const target = cursor + steps;
53
+ const end = Math.min(target, sourceCodeLen);
54
+ while (cursor < end)
55
+ sourceCode[cursor++] === '\n' ? (line++, (col = OriginBase)) : col++;
56
+ cursor = target;
57
+ };
58
+ while (cursor < sourceCodeLen) {
59
+ const startLine = line;
60
+ const startCol = col;
61
+ const char = charAt(cursor);
62
+ const charLen = char.length; // 步进长度记好了喵!
63
+ // 略过空白
64
+ if (/\s/.test(char)) {
65
+ advance(charLen);
66
+ continue;
67
+ }
68
+ // 注释
69
+ if (char === '(') {
70
+ const contentStart = cursor + charLen;
71
+ let nestingLevel = 1, i = contentStart; // 局部游标,跳过起点的 '('
72
+ while (nestingLevel > 0 && i < sourceCodeLen) {
73
+ const innerChar = sourceCode[i++];
74
+ if (innerChar === '(')
75
+ nestingLevel++;
76
+ else if (innerChar === ')')
77
+ nestingLevel--;
78
+ }
79
+ advance(i - cursor);
80
+ if (nestingLevel !== 0)
81
+ console.error('警告喵: 文件结尾有未闭合的悄悄话!');
82
+ else
83
+ i--; // 退一步,把最后的 ')' 排除在截取范围外
84
+ if (!ignoreComments) {
85
+ const commentContent = sourceCode.slice(contentStart, i);
86
+ tokens.push({ kind: 34 /* TokenKind.COMMENT */, value: commentContent, line: startLine, col: startCol });
87
+ }
88
+ continue;
89
+ }
90
+ // 关键字
91
+ let matchedKeyword;
92
+ for (const keyword of sortedKeywords) {
93
+ if (sourceCode.startsWith(keyword, cursor)) {
94
+ matchedKeyword = keyword;
95
+ break;
96
+ }
97
+ }
98
+ if (matchedKeyword) {
99
+ const tokenKind = KEYWORDS[matchedKeyword];
100
+ tokens.push({ kind: tokenKind, value: matchedKeyword, line: startLine, col: startCol });
101
+ advance(matchedKeyword.length);
102
+ if (tokenKind === 12 /* TokenKind.KEYWORD_DEF */)
103
+ expectingFuncNameAfterParamEnd = true; // '想要'
104
+ continue;
105
+ }
106
+ // 二字操作符
107
+ if (charLen === 1 && cursor + 1 < sourceCodeLen) {
108
+ const twoCharSymbol = char + sourceCode[cursor + 1];
109
+ let kind = 0 /* TokenKind.ERROR */; // 默认无效值
110
+ switch (twoCharSymbol) {
111
+ case '==':
112
+ case '!=':
113
+ case '>=':
114
+ case '<=':
115
+ kind = 26 /* TokenKind.OPERATOR */;
116
+ break;
117
+ case '[=':
118
+ kind = 20 /* TokenKind.COLLECTION_START */;
119
+ break;
120
+ case '=]':
121
+ kind = 21 /* TokenKind.COLLECTION_END */;
122
+ break;
123
+ case '[#':
124
+ kind = 22 /* TokenKind.BLOCK_START */;
125
+ break;
126
+ case '#]':
127
+ kind = 23 /* TokenKind.BLOCK_END */;
128
+ break;
129
+ }
130
+ if (kind !== 0 /* TokenKind.ERROR */) {
131
+ tokens.push({ kind, value: twoCharSymbol, line: startLine, col: startCol });
132
+ advance(2);
133
+ if (kind !== 21 /* TokenKind.COLLECTION_END */)
134
+ expectingFuncNameAfterParamEnd = false;
135
+ continue;
136
+ }
137
+ }
138
+ // 单字操作符
139
+ if ('+-*/><@~,'.includes(char)) {
140
+ let kind = 26 /* TokenKind.OPERATOR */;
141
+ if (char === ',')
142
+ kind = 27 /* TokenKind.COMMA */;
143
+ else if (char === '@')
144
+ kind = 25 /* TokenKind.ACCESSOR */;
145
+ else if (char === '~')
146
+ kind = 24 /* TokenKind.TERMINATOR */;
147
+ tokens.push({ kind, value: char, line: startLine, col: startCol });
148
+ advance(charLen);
149
+ continue;
150
+ }
151
+ // 非负数字,十进制整数及小数
152
+ if (isNumChar(char)) {
153
+ let i = cursor;
154
+ while (i < sourceCodeLen && isNumChar(sourceCode[i]))
155
+ i++;
156
+ if (i + 1 < sourceCodeLen && sourceCode[i] === '.' && isNumChar(sourceCode[i + 1])) {
157
+ i++;
158
+ while (i < sourceCodeLen && isNumChar(sourceCode[i]))
159
+ i++;
160
+ }
161
+ const numStr = sourceCode.slice(cursor, i);
162
+ advance(i - cursor);
163
+ tokens.push({ kind: 15 /* TokenKind.NUMBER */, value: numStr, line: startLine, col: startCol });
164
+ continue;
165
+ }
166
+ // 字符串
167
+ if (char === '"' || char === "'") {
168
+ const contentStart = cursor + charLen;
169
+ let i = contentStart;
170
+ while (i < sourceCodeLen && sourceCode[i] !== char)
171
+ i++;
172
+ const str = sourceCode.slice(contentStart, i);
173
+ advance(i - cursor + charLen);
174
+ tokens.push({ kind: 16 /* TokenKind.STRING */, value: str, line: startLine, col: startCol });
175
+ continue;
176
+ }
177
+ // 标识符
178
+ if (ID_START_REGEX.test(char) || char === '{') {
179
+ let identifier = '', identifierStartCol = startCol, i = cursor;
180
+ if (char === '{') {
181
+ const contentStart = (i += charLen); // 跳过 '{' 并记录内容起点
182
+ identifierStartCol += charLen; // 记录标识符真正的起始列
183
+ while (i < sourceCodeLen && sourceCode[i] !== '}')
184
+ i++;
185
+ identifier = sourceCode.slice(contentStart, i++); // 截取标识并跳过闭合的 '}',未闭合会多越界一步但安全
186
+ }
187
+ else {
188
+ parseIdentifier: while (i < sourceCodeLen) {
189
+ const idChar = charAt(i);
190
+ if (!ID_CONTINUE_REGEX.test(idChar))
191
+ break;
192
+ // 有粘连的关键字则打断
193
+ for (const keyword of sortedKeywords)
194
+ if (sourceCode.startsWith(keyword, i))
195
+ break parseIdentifier;
196
+ i += idChar.length;
197
+ }
198
+ identifier = sourceCode.slice(cursor, i);
199
+ }
200
+ advance(i - cursor);
201
+ // 统一创建标识符词元
202
+ if (identifier) {
203
+ tokens.push({
204
+ kind: 19 /* TokenKind.IDENTIFIER */,
205
+ value: identifier,
206
+ line: startLine,
207
+ col: identifierStartCol,
208
+ });
209
+ if (expectingFuncNameAfterParamEnd) {
210
+ // 抓到了!这个标识符就是函数名喵!
211
+ functionNames.add(identifier);
212
+ expectingFuncNameAfterParamEnd = false; // 重置状态
213
+ }
214
+ }
215
+ continue;
216
+ }
217
+ // 不认识的字符喵
218
+ tokens.push({ kind: 0 /* TokenKind.ERROR */, value: char, line: startLine, col: startCol });
219
+ console.error('不认识的字符喵:', char);
220
+ advance(charLen);
221
+ }
222
+ tokens.push({ kind: 35 /* TokenKind.EOF */, value: 'EndOfFile', line, col });
223
+ return repairCallTokens(tokens, functionNames);
224
+ }
225
+ /**
226
+ * 遍历原始 Token 列表,修复被错误合并的 `扒纸箱名函数名`。
227
+ */
228
+ function repairCallTokens(tokens, functionNames) {
229
+ // 为了最高效的匹配,按长度降序排序
230
+ // 这样能确保 `喵` 不会错误地匹配 `xxx高级喵` 的 `喵`
231
+ const sortedFunctionNames = Array.from(functionNames).sort((a, b) => b.length - a.length);
232
+ const repairedTokens = [];
233
+ const lastIndex = tokens.length - 1;
234
+ let i = 0;
235
+ scanTokens: while (i < lastIndex) {
236
+ const currentToken = tokens[i];
237
+ const nextToken = tokens[i + 1];
238
+ // 检查是否是需要修复的目标
239
+ if (currentToken.kind !== 13 /* TokenKind.KEYWORD_CALL */ || // 不是 '扒'
240
+ nextToken.kind !== 19 /* TokenKind.IDENTIFIER */ || // 后面无跟着的标识符
241
+ tokens[i + 2]?.kind === 19 /* TokenKind.IDENTIFIER */ // 后面跟着第二个标识符
242
+ ) {
243
+ // 不是需要修复的目标,或者是一个安全的 `扒 纸箱名 函数名`
244
+ repairedTokens.push(currentToken);
245
+ i++;
246
+ continue;
247
+ }
248
+ // 找到了一个潜在目标,例如 '扒 纸箱名函数名 ~'
249
+ const { value: valueToSplit, line, col } = nextToken;
250
+ for (const funcName of sortedFunctionNames) {
251
+ // 检查这个函数名是不是标识符的后缀
252
+ if (!valueToSplit.endsWith(funcName) || valueToSplit.length <= funcName.length)
253
+ continue;
254
+ // 找到了!是它喵!
255
+ const collectionName = valueToSplit.slice(0, -funcName.length);
256
+ // 创建 “纸箱名” 及 “函数名”
257
+ const collectionToken = { kind: 19 /* TokenKind.IDENTIFIER */, value: collectionName, line, col };
258
+ const functionToken = {
259
+ kind: 19 /* TokenKind.IDENTIFIER */,
260
+ value: funcName,
261
+ line,
262
+ col: col + collectionName.length,
263
+ };
264
+ // 推入修复后的版本
265
+ repairedTokens.push(currentToken /*扒*/, collectionToken /*纸箱名*/, functionToken /*函数名*/);
266
+ i += 2; // 跳过 '扒' 和 '纸箱名函数名' 这两个原始 Token
267
+ continue scanTokens; // 匹配成功,检查下一组词元
268
+ }
269
+ // 如果没找到匹配,说明它就是一个普通的 `扒 某个变量`,正常推入
270
+ repairedTokens.push(currentToken);
271
+ i++;
272
+ }
273
+ if (i <= lastIndex)
274
+ repairedTokens.push(tokens[i]); // 补尾
275
+ return repairedTokens;
276
+ }
277
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/core/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { Environment } from './run/environment.js';
2
+ export type MeaoiuValue = number | string | boolean | null | Environment;
3
+ export declare const enum MeaoiuType {
4
+ NUMBER = 0,// 摸数
5
+ STRING = 1,// 闲话
6
+ BOOLEAN = 2,// 好坏
7
+ NULL = 3,// 空碗
8
+ FUNCTION = 4,// 计谋
9
+ COLLECTION = 5,// 纸箱
10
+ UNKNOWN = 6
11
+ }
12
+ export declare const typeNames: {
13
+ readonly 0: "摸数";
14
+ readonly 1: "闲话";
15
+ readonly 2: "好坏";
16
+ readonly 3: "空碗";
17
+ readonly 4: "计谋";
18
+ readonly 5: "纸箱";
19
+ readonly 6: "不懂";
20
+ };
21
+ export declare function getMeaoiuType(v: unknown): MeaoiuType;
22
+ /**
23
+ * 检查算术运算的类型是否合法
24
+ * @returns 错误信息,如果合法则返回 undefined
25
+ */
26
+ export declare function checkArithmeticOperation(op: string, leftType: MeaoiuType, rightType: MeaoiuType): string | undefined;
27
+ /**
28
+ * 检查比较运算的类型是否合法
29
+ * @returns 错误信息,如果合法则返回 undefined
30
+ */
31
+ export declare function checkComparisonOperation(op: string, leftType: MeaoiuType, rightType: MeaoiuType): string | undefined;
32
+ //# sourceMappingURL=typedef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedef.d.ts","sourceRoot":"","sources":["../../src/core/typedef.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,WAAW,CAAC;AAEzE,0BAAkB,UAAU;IAC3B,MAAM,IAAA,CAAE,KAAK;IACb,MAAM,IAAA,CAAE,KAAK;IACb,OAAO,IAAA,CAAE,KAAK;IACd,IAAI,IAAA,CAAE,KAAK;IACX,QAAQ,IAAA,CAAE,KAAK;IACf,UAAU,IAAA,CAAE,KAAK;IACjB,OAAO,IAAA;CACP;AAED,eAAO,MAAM,SAAS;;;;;;;;CAQyB,CAAC;AAahD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,CAMpD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAkBpH;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAepH"}
@@ -0,0 +1,67 @@
1
+ // src/core/typedef.ts
2
+ import { Environment } from './run/environment.js';
3
+ export const typeNames = {
4
+ [0 /* MeaoiuType.NUMBER */]: '摸数',
5
+ [1 /* MeaoiuType.STRING */]: '闲话',
6
+ [2 /* MeaoiuType.BOOLEAN */]: '好坏',
7
+ [3 /* MeaoiuType.NULL */]: '空碗',
8
+ [4 /* MeaoiuType.FUNCTION */]: '计谋',
9
+ [5 /* MeaoiuType.COLLECTION */]: '纸箱',
10
+ [6 /* MeaoiuType.UNKNOWN */]: '不懂',
11
+ };
12
+ const typeMap = {
13
+ number: 0 /* MeaoiuType.NUMBER */,
14
+ string: 1 /* MeaoiuType.STRING */,
15
+ boolean: 2 /* MeaoiuType.BOOLEAN */,
16
+ null: 3 /* MeaoiuType.NULL */,
17
+ function: 4 /* MeaoiuType.FUNCTION */,
18
+ collection: 5 /* MeaoiuType.COLLECTION */,
19
+ unknown: 6 /* MeaoiuType.UNKNOWN */,
20
+ };
21
+ export function getMeaoiuType(v) {
22
+ if (v === null || v === undefined)
23
+ return 3 /* MeaoiuType.NULL */;
24
+ if (v instanceof Environment)
25
+ return 5 /* MeaoiuType.COLLECTION */;
26
+ if (v !== v)
27
+ return 6 /* MeaoiuType.UNKNOWN */;
28
+ const t = typeof v;
29
+ return typeMap[t] ?? 6 /* MeaoiuType.UNKNOWN */;
30
+ }
31
+ /**
32
+ * 检查算术运算的类型是否合法
33
+ * @returns 错误信息,如果合法则返回 undefined
34
+ */
35
+ export function checkArithmeticOperation(op, leftType, rightType) {
36
+ if (leftType !== rightType) {
37
+ return `「${op}」操作符只能给同类用喵!「${typeNames[leftType]}」和「${typeNames[rightType]}」不可以喵!`;
38
+ }
39
+ if (leftType === 0 /* MeaoiuType.NUMBER */)
40
+ return undefined; // 数字可以做任何运算
41
+ if (['-', '*', '/'].includes(op)) {
42
+ return `「${op}」操作符只能用于两个「${typeNames[0 /* MeaoiuType.NUMBER */]}」之间喵!`;
43
+ }
44
+ if (op === '+' && leftType !== 1 /* MeaoiuType.STRING */ && leftType !== 5 /* MeaoiuType.COLLECTION */) {
45
+ return `「${op}」操作符只能用在「${typeNames[0 /* MeaoiuType.NUMBER */]}」、「${typeNames[1 /* MeaoiuType.STRING */]}」或「${typeNames[5 /* MeaoiuType.COLLECTION */]}」上喵!`;
46
+ }
47
+ return undefined; // 合法
48
+ }
49
+ /**
50
+ * 检查比较运算的类型是否合法
51
+ * @returns 错误信息,如果合法则返回 undefined
52
+ */
53
+ export function checkComparisonOperation(op, leftType, rightType) {
54
+ // '==' 和 '!=' 允许不同类型
55
+ if (op === '==' || op === '!=')
56
+ return undefined; // 合法
57
+ // 其他比较符必须同类
58
+ if (leftType !== rightType) {
59
+ return `「${op}」操作符只能给同类用喵!「${typeNames[leftType]}」和「${typeNames[rightType]}」不可以喵!`;
60
+ }
61
+ // 且只能是数字或字符串
62
+ if (leftType !== 0 /* MeaoiuType.NUMBER */ && leftType !== 1 /* MeaoiuType.STRING */) {
63
+ return `「${op}」操作符只能用在「${typeNames[0 /* MeaoiuType.NUMBER */]}」或「${typeNames[1 /* MeaoiuType.STRING */]}」上喵!`;
64
+ }
65
+ return undefined; // 合法
66
+ }
67
+ //# sourceMappingURL=typedef.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedef.js","sourceRoot":"","sources":["../../src/core/typedef.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAcnD,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB,2BAAmB,EAAE,IAAI;IACzB,2BAAmB,EAAE,IAAI;IACzB,4BAAoB,EAAE,IAAI;IAC1B,yBAAiB,EAAE,IAAI;IACvB,6BAAqB,EAAE,IAAI;IAC3B,+BAAuB,EAAE,IAAI;IAC7B,4BAAoB,EAAE,IAAI;CACoB,CAAC;AAGhD,MAAM,OAAO,GAAG;IACf,MAAM,2BAAmB;IACzB,MAAM,2BAAmB;IACzB,OAAO,4BAAoB;IAC3B,IAAI,yBAAiB;IACrB,QAAQ,6BAAqB;IAC7B,UAAU,+BAAuB;IACjC,OAAO,4BAAoB;CACuB,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,CAAU;IACvC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,+BAAuB;IAC1D,IAAI,CAAC,YAAY,WAAW;QAAE,qCAA6B;IAC3D,IAAI,CAAC,KAAK,CAAC;QAAE,kCAA0B;IACvC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC;IACnB,OAAO,OAAO,CAAC,CAAe,CAAC,8BAAsB,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,EAAU,EAAE,QAAoB,EAAE,SAAqB;IAC/F,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,IAAI,EAAE,gBAAgB,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC;IACpF,CAAC;IAED,IAAI,QAAQ,8BAAsB;QAAE,OAAO,SAAS,CAAC,CAAC,YAAY;IAElE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,EAAE,cAAc,SAAS,2BAAmB,OAAO,CAAC;IAChE,CAAC;IAED,IAAI,EAAE,KAAK,GAAG,IAAI,QAAQ,8BAAsB,IAAI,QAAQ,kCAA0B,EAAE,CAAC;QACxF,OAAO,IAAI,EAAE,YAAY,SAAS,2BAAmB,MAAM,SAAS,2BAAmB,MACtF,SAAS,+BACV,MAAM,CAAC;IACR,CAAC;IAED,OAAO,SAAS,CAAC,CAAC,KAAK;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,EAAU,EAAE,QAAoB,EAAE,SAAqB;IAC/F,qBAAqB;IACrB,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC,CAAC,KAAK;IAEvD,YAAY;IACZ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,IAAI,EAAE,gBAAgB,SAAS,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC;IACpF,CAAC;IAED,aAAa;IACb,IAAI,QAAQ,8BAAsB,IAAI,QAAQ,8BAAsB,EAAE,CAAC;QACtE,OAAO,IAAI,EAAE,YAAY,SAAS,2BAAmB,MAAM,SAAS,2BAAmB,MAAM,CAAC;IAC/F,CAAC;IAED,OAAO,SAAS,CAAC,CAAC,KAAK;AACxB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export * from './core/error.js';
2
+ export * from './api/services/completions.js';
3
+ export * from './api/services/diagnostics.js';
4
+ export * from './api/services/formatting.js';
5
+ export * from './api/services/highlight.js';
6
+ export * from './api/services/inlayHints.js';
7
+ export * from './api/services/search.js';
8
+ export * from './api/execution.js';
9
+ export * from './api/serviceState.js';
10
+ export * from './api/utils/lspUtils.js';
11
+ export * from './api/utils/symbolTable.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ // src/index.ts
2
+ export * from './core/error.js';
3
+ export * from './api/services/completions.js';
4
+ export * from './api/services/diagnostics.js';
5
+ export * from './api/services/formatting.js';
6
+ export * from './api/services/highlight.js';
7
+ export * from './api/services/inlayHints.js';
8
+ export * from './api/services/search.js';
9
+ export * from './api/execution.js';
10
+ export * from './api/serviceState.js';
11
+ export * from './api/utils/lspUtils.js';
12
+ export * from './api/utils/symbolTable.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "meaoiu",
3
+ "version": "0.1.0",
4
+ "description": "盒中有识算之聪慧喵,告世人云:喵谕者,古今地外皆曰好喵,乃奇民要术喵~",
5
+ "keywords": [
6
+ "meaoiu",
7
+ "language",
8
+ "interpreter",
9
+ "cli",
10
+ "esolang",
11
+ "喵谕"
12
+ ],
13
+ "license": "MIT",
14
+ "author": {
15
+ "name": "TNPC",
16
+ "email": "TNPC@TNPC.space"
17
+ },
18
+ "homepage": "https://github.com/P-TNPC/Meaoiu#readme",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/P-TNPC/Meaoiu.git"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/P-TNPC/Meaoiu/issues"
25
+ },
26
+ "type": "module",
27
+ "sideEffects": false,
28
+ "bin": {
29
+ "meaoiu": "dist/cli/main.js"
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "default": "./dist/index.js"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "LANGUAGE_GUIDE.md"
40
+ ],
41
+ "engines": {
42
+ "node": ">=20.0.0"
43
+ },
44
+ "scripts": {
45
+ "clean": "rimraf dist",
46
+ "prebuild": "npm run clean",
47
+ "build": "tsc --stableTypeOrdering",
48
+ "postbuild": "node write-cli-version.js",
49
+ "prepublishOnly": "npm run build"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^25.9.1",
53
+ "rimraf": "^6.1.3",
54
+ "typescript": "^6.0.3"
55
+ },
56
+ "dependencies": {
57
+ "cac": "^7.0.0",
58
+ "string-width": "^8.2.1"
59
+ }
60
+ }