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,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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|