ic10c-node 2.6.6

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.
@@ -0,0 +1,341 @@
1
+ // Copyright (c) 2026. All rights reserved.
2
+ // This source code is licensed under the CC BY-NC-SA
3
+ // (Creative Commons Attribution-NonCommercial-NoDerivatives) License, By Xiao Songtao.
4
+ // This software is protected by copyright law. Reproduction, distribution, or use for commercial
5
+ // purposes is prohibited without the author's permission. If you have any questions or require
6
+ // permission, please contact the author: edocsitahw@qq.com
7
+
8
+ /**
9
+ * @file token.d.ts
10
+ * @author edocsitahw
11
+ * @version 1.1
12
+ * @date 2026/07/22 15:36
13
+ * @desc
14
+ * @copyright CC BY-NC-SA 2026. All rights reserved.
15
+ * */
16
+ import {Pos} from "../common";
17
+
18
+
19
+ /**
20
+ * IC10 词法标记类型枚举。
21
+ *
22
+ * 对应 C++ `ic10::TokenType`,值从 0 开始递增。
23
+ * 运行时由原生模块导出为不可变对象,可在 JS 层直接使用 `TokenType.FLOAT` 等访问。
24
+ *
25
+ * @public
26
+ */
27
+ export enum TokenType {
28
+ /* 数字 */
29
+ INTEGER = 0,
30
+ FLOAT,
31
+ HEX_NUMBER,
32
+ BINARY_NUMBER,
33
+ STRING,
34
+
35
+ /* 变量名 */
36
+ IDENTIFIER,
37
+
38
+ /* 寄存器设备 */
39
+ REGISTER,
40
+ DEVICE,
41
+
42
+ /* 符号 */
43
+ LPAREN,
44
+ RPAREN,
45
+ COLON,
46
+
47
+ /* 注释 */
48
+ HEX_COMMENT,
49
+ SLASH_COMMENT,
50
+ DOC_COMMENT,
51
+ TYPE_HINT,
52
+
53
+ /* 换行 */
54
+ NEWLINE,
55
+
56
+ /* 关键字 - 宏与函数 */
57
+ KEYWORD_HASH,
58
+ KEYWORD_STR,
59
+
60
+ /* 关键字 - 常量 */
61
+ KEYWORD_NAN,
62
+ KEYWORD_PINF,
63
+ KEYWORD_NINF,
64
+ KEYWORD_PI,
65
+ KEYWORD_TAU,
66
+ KEYWORD_DEG2RAD,
67
+ KEYWORD_RAD2DEG,
68
+ KEYWORD_EPSILON,
69
+ KEYWORD_RGAS,
70
+
71
+ /* 文件结束标记 */
72
+ END,
73
+
74
+ /* 未知标记 */
75
+ UNKNOWN,
76
+
77
+ /* 关键字 - 空指令 */
78
+ KEYWORD_HCF,
79
+ KEYWORD_YIELD,
80
+
81
+ /* 关键字 - 预处理指令 */
82
+ KEYWORD_ALIAS,
83
+ KEYWORD_DEFINE,
84
+
85
+ /* 关键字 - 一元指令 */
86
+ KEYWORD_PEEK,
87
+ KEYWORD_POP,
88
+ KEYWORD_PUSH,
89
+ KEYWORD_CLR,
90
+ KEYWORD_J,
91
+ KEYWORD_JAL,
92
+ KEYWORD_JR,
93
+ KEYWORD_RAND,
94
+ KEYWORD_SLEEP,
95
+ KEYWORD_CLRD,
96
+
97
+ /* 关键字 - 二元指令 */
98
+ KEYWORD_ABS,
99
+ KEYWORD_ACOS,
100
+ KEYWORD_ADD,
101
+ KEYWORD_ASIN,
102
+ KEYWORD_ATAN,
103
+ KEYWORD_ATAN2,
104
+ KEYWORD_CEIL,
105
+ KEYWORD_COS,
106
+ KEYWORD_DIV,
107
+ KEYWORD_EXP,
108
+ KEYWORD_FLOOR,
109
+ KEYWORD_LOG,
110
+ KEYWORD_MAX,
111
+ KEYWORD_MIN,
112
+ KEYWORD_MOD,
113
+ KEYWORD_MUL,
114
+ KEYWORD_POW,
115
+ KEYWORD_ROUND,
116
+ KEYWORD_SIN,
117
+ KEYWORD_SQRT,
118
+ KEYWORD_SGN,
119
+ KEYWORD_SUB,
120
+ KEYWORD_TAN,
121
+ KEYWORD_TRUNC,
122
+ KEYWORD_NOT,
123
+ KEYWORD_MOVE,
124
+ KEYWORD_POKE,
125
+ KEYWORD_BEQZ,
126
+ KEYWORD_BEQZAL,
127
+ KEYWORD_BNEZ,
128
+ KEYWORD_BNEZAL,
129
+ KEYWORD_BGEZ,
130
+ KEYWORD_BGEZAL,
131
+ KEYWORD_BGTZ,
132
+ KEYWORD_BGTZAL,
133
+ KEYWORD_BLEZ,
134
+ KEYWORD_BLEZAL,
135
+ KEYWORD_BLTZ,
136
+ KEYWORD_BLTZAL,
137
+ KEYWORD_BNAN,
138
+ KEYWORD_BDNS,
139
+ KEYWORD_BDNSAL,
140
+ KEYWORD_BDSE,
141
+ KEYWORD_BDSEAL,
142
+ KEYWORD_BREQZ,
143
+ KEYWORD_BRNEZ,
144
+ KEYWORD_BRGEZ,
145
+ KEYWORD_BRGTZ,
146
+ KEYWORD_BRLEZ,
147
+ KEYWORD_BRLTZ,
148
+ KEYWORD_BRNAN,
149
+ KEYWORD_BRDNS,
150
+ KEYWORD_BRDSE,
151
+ KEYWORD_SEQZ,
152
+ KEYWORD_SNEZ,
153
+ KEYWORD_SGEZ,
154
+ KEYWORD_SGTZ,
155
+ KEYWORD_SLEZ,
156
+ KEYWORD_SLTZ,
157
+ KEYWORD_SNAN,
158
+ KEYWORD_SNANZ,
159
+ KEYWORD_SDNS,
160
+ KEYWORD_SDSE,
161
+
162
+ /* 关键字 - 三元指令 */
163
+ KEYWORD_AND,
164
+ KEYWORD_NOR,
165
+ KEYWORD_OR,
166
+ KEYWORD_SLA,
167
+ KEYWORD_SLL,
168
+ KEYWORD_SRA,
169
+ KEYWORD_SRL,
170
+ KEYWORD_XOR,
171
+ KEYWORD_GET,
172
+ KEYWORD_PUT,
173
+ KEYWORD_L,
174
+ KEYWORD_LS,
175
+ KEYWORD_LR,
176
+ KEYWORD_S,
177
+ KEYWORD_SB,
178
+ KEYWORD_ROL,
179
+ KEYWORD_ROR,
180
+ KEYWORD_RMAP,
181
+ KEYWORD_BEQ,
182
+ KEYWORD_BEQAL,
183
+ KEYWORD_BNE,
184
+ KEYWORD_BNEAL,
185
+ KEYWORD_BGE,
186
+ KEYWORD_BGEAL,
187
+ KEYWORD_BGT,
188
+ KEYWORD_BGTAL,
189
+ KEYWORD_BLE,
190
+ KEYWORD_BLEAL,
191
+ KEYWORD_BLT,
192
+ KEYWORD_BLTAL,
193
+ KEYWORD_BAPZ,
194
+ KEYWORD_BAPZAL,
195
+ KEYWORD_BNAZ,
196
+ KEYWORD_BNAZAL,
197
+ KEYWORD_BDNVL,
198
+ KEYWORD_BDNVS,
199
+ KEYWORD_BREQ,
200
+ KEYWORD_BRNE,
201
+ KEYWORD_BRGE,
202
+ KEYWORD_BRGT,
203
+ KEYWORD_BRLE,
204
+ KEYWORD_BRLT,
205
+ KEYWORD_BRAPZ,
206
+ KEYWORD_BRNAZ,
207
+ KEYWORD_SAPZ,
208
+ KEYWORD_SNAZ,
209
+ KEYWORD_SEQ,
210
+ KEYWORD_SNE,
211
+ KEYWORD_SGE,
212
+ KEYWORD_SGT,
213
+ KEYWORD_SLE,
214
+ KEYWORD_SLT,
215
+
216
+ /* 关键字 - 四元指令 */
217
+ KEYWORD_LERP,
218
+ KEYWORD_CLAMP,
219
+ KEYWORD_EXT,
220
+ KEYWORD_INS,
221
+ KEYWORD_SS,
222
+ KEYWORD_LB,
223
+ KEYWORD_SBN,
224
+ KEYWORD_SBS,
225
+ KEYWORD_BAP,
226
+ KEYWORD_BAPAL,
227
+ KEYWORD_BNA,
228
+ KEYWORD_BNAAL,
229
+ KEYWORD_BRAP,
230
+ KEYWORD_BRNA,
231
+ KEYWORD_SAP,
232
+ KEYWORD_SNA,
233
+ KEYWORD_SELECT,
234
+
235
+ /* 关键字 - 五元指令 */
236
+ KEYWORD_LBN,
237
+ KEYWORD_LBS,
238
+
239
+ /* 关键字 - 六元指令 */
240
+ KEYWORD_LBNS
241
+ }
242
+
243
+
244
+ /**
245
+ * IC10 词法标记类别枚举。
246
+ *
247
+ * 对应 C++ `ic10::TokenCategory`,值从 0 开始递增。
248
+ * 运行时由 C++ 端通过 `enum_to_str` 编译期反射导出,
249
+ * 保证与 C++ 枚举定义自动同步。
250
+ *
251
+ * @public
252
+ */
253
+ export enum TokenCategory {
254
+ /** 字面值(数字、字符串、关键字等) */
255
+ LITERAL = 0,
256
+ /** 符号(括号、冒号等) */
257
+ SYMBOL,
258
+ /** 注释 */
259
+ COMMENT,
260
+ /** 注解(文档注释、类型提示) */
261
+ ANNOTATION,
262
+ /** 空白符 */
263
+ WHITESPACE,
264
+ /** 文件结束 */
265
+ END,
266
+ /** 无效标记 */
267
+ INVALID
268
+ }
269
+
270
+
271
+ /**
272
+ * @summary 词法单元类
273
+ *
274
+ * @desc 表示 IC10 源代码中的最小语义单元。
275
+ * 词法单元包括关键字(如 `move`、`add`)、标识符、数字、运算符等。
276
+ *
277
+ * Token 是词法分析的结果,作为语法分析器的输入。
278
+ *
279
+ * @public
280
+ */
281
+ export class Token {
282
+ /**
283
+ * @summary 构造函数
284
+ *
285
+ * @param type - Token 类型(对应 ic10::TokenType 枚举)
286
+ * @param pos - 位置对象,记录该 Token 在源代码中的位置
287
+ * @param lexeme - 词素,即源代码中的原始字符串
288
+ * @param category - Token 类别(对应 ic10::TokenCategory 枚举,可选)
289
+ *
290
+ * @example
291
+ * ```typescript
292
+ * const pos = new ic10.Pos();
293
+ * pos.line = 0;
294
+ * pos.column = 0;
295
+ * const token = new ic10.Token(TokenType.KEYWORD_MOVE, pos, 'move', TokenCategory.LITERAL);
296
+ * ```
297
+ */
298
+ constructor(type: TokenType, pos: Pos, lexeme?: string, category?: TokenCategory);
299
+
300
+ /**
301
+ * @summary Token 类型
302
+ * @desc 对应 ic10::TokenType 枚举值,表示 Token 的语法类别
303
+ */
304
+ type: TokenType;
305
+
306
+ /**
307
+ * @summary 位置信息
308
+ * @desc 该 Token 在源代码中的起始位置
309
+ */
310
+ pos: Pos;
311
+
312
+ /**
313
+ * @summary 词素
314
+ * @desc 源代码中匹配该 Token 的原始字符串
315
+ */
316
+ lexeme: string;
317
+
318
+ /**
319
+ * @summary Token 类别
320
+ * @desc 对应 ic10::TokenCategory 枚举值,提供更细粒度的分类
321
+ */
322
+ category: TokenCategory;
323
+
324
+ /**
325
+ * @summary 返回可读字符串表示
326
+ *
327
+ * @returns 格式化的字符串,如 `Token{type=1, lexeme="move"}`
328
+ *
329
+ * @desc 用于调试目的,返回人类可读的 Token 描述。
330
+ */
331
+ toString(): string;
332
+
333
+ /**
334
+ * @summary 返回 JSON 字符串表示
335
+ *
336
+ * @returns JSON 格式的 Token 表示
337
+ *
338
+ * @desc 返回包含 type、pos、lexeme、category 的 JSON 对象字符串。
339
+ */
340
+ toJSON(): string;
341
+ }
@@ -0,0 +1,156 @@
1
+ // Copyright (c) 2026. All rights reserved.
2
+ // This source code is licensed under the CC BY-NC-SA
3
+ // (Creative Commons Attribution-NonCommercial-NoDerivatives) License, By Xiao Songtao.
4
+ // This software is protected by copyright law. Reproduction, distribution, or use for commercial
5
+ // purposes is prohibited without the author's permission. If you have any questions or require
6
+ // permission, please contact the author: edocsitahw@qq.com
7
+
8
+ /**
9
+ * @file linker.d.ts
10
+ * @author edocsitahw
11
+ * @version 1.1
12
+ * @date 2026/07/22 17:12
13
+ * @desc
14
+ * @copyright CC BY-NC-SA 2026. All rights reserved.
15
+ * */
16
+ import { Diagnostic } from "./common";
17
+ import { Program } from "./parser";
18
+ import { SymbolTable } from "./semantic";
19
+ import { TypeTable } from "./semantic/type_table";
20
+
21
+
22
+ /**
23
+ * @summary 编译单元信息
24
+ *
25
+ * @desc 表示链接过程中每个编译单元的信息,包括路径和诊断信息。
26
+ *
27
+ * @public
28
+ */
29
+ export interface UnitInfo {
30
+ /**
31
+ * @summary 源文件路径
32
+ */
33
+ path: string;
34
+
35
+ /**
36
+ * @summary 该单元的诊断信息列表
37
+ */
38
+ diagnostics: Diagnostic[];
39
+ }
40
+
41
+
42
+ /**
43
+ * @summary 链接器类
44
+ *
45
+ * @desc 用于链接多个 IC10 编译单元,合并它们的符号表并收集所有诊断信息。
46
+ *
47
+ * @elseif en
48
+ * @summary Linker class
49
+ *
50
+ * @desc Used to link multiple IC10 compilation units, merge their symbol tables,
51
+ * and collect all diagnostics.
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * // 创建链接器并链接多个编译单元
56
+ * const linker = new ic10.Linker();
57
+ *
58
+ * // 添加源代码字符串
59
+ * linker.addUnit('alias sensor0 console0');
60
+ * linker.addUnit('move r0 r1', 'file.ic10');
61
+ *
62
+ * // 添加已解析的 Program 对象
63
+ * const tokens = ic10.Lexer.tokenize('add r2 r0 r1');
64
+ * const parser = new ic10.Parser(tokens);
65
+ * const program = parser.parse();
66
+ * linker.addUnit(program, 'another.ic10');
67
+ *
68
+ * // 执行链接
69
+ * const symbolTable = linker.link();
70
+ *
71
+ * // 检查诊断信息
72
+ * if (linker.diagnostics.length > 0) {
73
+ * console.log('诊断信息:', linker.diagnostics);
74
+ * }
75
+ * ```
76
+ *
77
+ * @public
78
+ */
79
+ export class Linker {
80
+ /**
81
+ * @summary 构造函数
82
+ *
83
+ * @desc 创建一个新的链接器实例。
84
+ */
85
+ constructor();
86
+
87
+ /**
88
+ * @summary 添加编译单元(Program 对象)
89
+ *
90
+ * @param program - 要链接的 Program 对象
91
+ *
92
+ * @desc 将已解析的 AST 程序添加到链接器中。
93
+ */
94
+ addUnit(program: Program): void;
95
+
96
+ /**
97
+ * @summary 添加编译单元(源代码字符串)
98
+ *
99
+ * @param source - IC10 源代码字符串
100
+ *
101
+ * @desc 将源代码字符串添加到链接器,内部会自动进行词法分析和语法分析。
102
+ */
103
+ addUnit(source: string): void;
104
+
105
+ /**
106
+ * @summary 添加编译单元(带路径)
107
+ *
108
+ * @param program - 要链接的 Program 对象
109
+ * @param path - 源文件路径
110
+ *
111
+ * @desc 将已解析的 AST 程序添加到链接器中,并关联源文件路径。
112
+ */
113
+ addUnit(program: Program, path: string): void;
114
+
115
+ /**
116
+ * @summary 添加编译单元(源代码字符串带路径)
117
+ *
118
+ * @param source - IC10 源代码字符串
119
+ * @param path - 源文件路径
120
+ *
121
+ * @desc 将源代码字符串添加到链接器,内部会自动进行词法分析和语法分析,并关联源文件路径。
122
+ */
123
+ addUnit(source: string, path: string): void;
124
+
125
+ /**
126
+ * @summary 执行链接操作
127
+ *
128
+ * @returns 合并后的 SymbolTable 对象
129
+ *
130
+ * @desc 对所有已添加的编译单元执行语义分析,合并符号表,并返回最终的符号表。
131
+ */
132
+ link(): SymbolTable;
133
+
134
+ /**
135
+ * @summary 诊断列表
136
+ *
137
+ * @desc 链接过程中产生的所有诊断信息(包含错误、警告、提示)。
138
+ * 每个诊断对象包含 level、id、start、end、message 字段。
139
+ */
140
+ get diagnostics(): Diagnostic[];
141
+
142
+ /**
143
+ * @summary 编译单元列表
144
+ *
145
+ * @desc 所有已添加的编译单元信息,每个单元包含路径和诊断信息。
146
+ */
147
+ get units(): UnitInfo[];
148
+
149
+ /**
150
+ * @summary 全局类型表
151
+ *
152
+ * @desc 链接过程中合并的全局类型表,包含所有编译单元通过文档注释定义的设备类型和枚举类型。
153
+ * 应在调用 {@link Linker.link} 之后访问以获取完整结果。
154
+ */
155
+ get typeTable(): TypeTable;
156
+ }
@@ -0,0 +1,36 @@
1
+ // Copyright (c) 2026. All rights reserved.
2
+ // This source code is licensed under the CC BY-NC-SA
3
+ // (Creative Commons Attribution-NonCommercial-NoDerivatives) License, By Xiao Songtao.
4
+ // This software is protected by copyright law. Reproduction, distribution, or use for commercial
5
+ // purposes is prohibited without the author's permission. If you have any questions or require
6
+ // permission, please contact the author: edocsitahw@qq.com
7
+
8
+ /**
9
+ * @file locale.d.ts
10
+ * @author edocsitahw
11
+ * @version 1.1
12
+ * @date 2026/07/22 17:21
13
+ * @desc
14
+ * @copyright CC BY-NC-SA 2026. All rights reserved.
15
+ * */
16
+
17
+ /**
18
+ * @summary 本地化设置类
19
+ *
20
+ * @desc 提供 IC10 编译器的本地化支持,允许设置错误消息和诊断信息的语言。
21
+ *
22
+ * @public
23
+ */
24
+ export class IC10CompilerLocal {
25
+ /**
26
+ * @summary 设置编译器的语言环境
27
+ *
28
+ * @param language - 语言代码(如 'en'、'zh' 等)
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * ic10.IC10Local.setLanguage('zh');
33
+ * ```
34
+ */
35
+ static setLanguage(language: string): void;
36
+ }