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.
- package/CHANGELOG.md +10 -0
- package/README.md +300 -0
- package/README.zh.md +300 -0
- package/package.json +50 -0
- package/src/ic10c-node.node +0 -0
- package/src/stdLib.ic +692 -0
- package/static/stdLib.ic.json +3 -0
- package/tsconfig.json +16 -0
- package/types/common.d.ts +145 -0
- package/types/incremental.d.ts +83 -0
- package/types/index.d.ts +53 -0
- package/types/lexer/index.d.ts +18 -0
- package/types/lexer/lexer.d.ts +83 -0
- package/types/lexer/token.d.ts +341 -0
- package/types/linker.d.ts +156 -0
- package/types/locale.d.ts +36 -0
- package/types/parser/ast.d.ts +848 -0
- package/types/parser/index.d.ts +19 -0
- package/types/parser/instructions/binary.d.ts +1209 -0
- package/types/parser/instructions/index.d.ts +22 -0
- package/types/parser/instructions/nullary.d.ts +85 -0
- package/types/parser/instructions/quaternary.d.ts +603 -0
- package/types/parser/instructions/quinary.d.ts +150 -0
- package/types/parser/instructions/senary.d.ts +104 -0
- package/types/parser/instructions/ternary.d.ts +1551 -0
- package/types/parser/instructions/unary.d.ts +518 -0
- package/types/parser/parser.d.ts +84 -0
- package/types/parser/program.d.ts +136 -0
- package/types/semantic/analyser.d.ts +98 -0
- package/types/semantic/index.d.ts +19 -0
- package/types/semantic/semantic.d.ts +81 -0
- package/types/semantic/type_table.d.ts +119 -0
- package/types/semantic/types.d.ts +100 -0
|
@@ -0,0 +1,848 @@
|
|
|
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 ast.d.ts
|
|
10
|
+
* @author edocsitahw
|
|
11
|
+
* @version 1.1
|
|
12
|
+
* @date 2026/07/22 15:38
|
|
13
|
+
* @desc
|
|
14
|
+
* @copyright CC BY-NC-SA 2026. All rights reserved.
|
|
15
|
+
* */
|
|
16
|
+
import {Position} from "../common";
|
|
17
|
+
import {Token} from "../lexer";
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* IC10 操作数类型枚举。
|
|
22
|
+
*
|
|
23
|
+
* 对应 C++ `ic10::OperandType`,值从 0 开始递增。
|
|
24
|
+
* 运行时由原生模块通过 `enum_to_str` 编译期反射导出,
|
|
25
|
+
* 用于 AST JSON 序列化中 `type1`/`type2`/... 字段的数值表示。
|
|
26
|
+
*
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
export enum OperandType {
|
|
30
|
+
/** 寄存器或标识符 */
|
|
31
|
+
REG_IDENT = 0,
|
|
32
|
+
/** 设备别名引用 */
|
|
33
|
+
DEV_ALIAS,
|
|
34
|
+
/** 寄存器或数字 */
|
|
35
|
+
REG_NUM,
|
|
36
|
+
/** 设备引用 */
|
|
37
|
+
DEV_REF,
|
|
38
|
+
/** 逻辑槽类型 */
|
|
39
|
+
LOGIC_SLOT,
|
|
40
|
+
/** 试剂模式 */
|
|
41
|
+
REAGENT_MODE,
|
|
42
|
+
/** 跳转目标 */
|
|
43
|
+
JUMP_TARGET,
|
|
44
|
+
/** 逻辑类型 */
|
|
45
|
+
LOGIC_TYPE,
|
|
46
|
+
/** 槽索引 */
|
|
47
|
+
SLOT_IDX,
|
|
48
|
+
/** 批处理模式 */
|
|
49
|
+
BATCH_MODE
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
// =========================================================================
|
|
54
|
+
// AST 节点类型定义
|
|
55
|
+
// AST 节点通过 toJSON() 序列化为普通 JavaScript 对象
|
|
56
|
+
// 每个节点都包含 type 和 position 字段
|
|
57
|
+
// =========================================================================
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @summary 所有 AST 节点的基础接口
|
|
61
|
+
*
|
|
62
|
+
* @desc 所有 IC10 AST 节点都继承自此接口,提供公共的 `type` 和 `position` 字段。
|
|
63
|
+
* - `type`: 节点类型标识符,用于区分不同种类的 AST 节点
|
|
64
|
+
* - `position`: 节点在源代码中的位置
|
|
65
|
+
*
|
|
66
|
+
* @note
|
|
67
|
+
* 此接口仅用于类型推断,不应在运行时直接实例化。
|
|
68
|
+
*
|
|
69
|
+
* @public
|
|
70
|
+
*/
|
|
71
|
+
export interface ASTNode {
|
|
72
|
+
/**
|
|
73
|
+
* @summary 节点类型
|
|
74
|
+
* @desc 标识 AST 节点的类型,如 `"Integer"`、`"Identifier"`、`"addInstruction"` 等。
|
|
75
|
+
* 可用于在运行时进行类型守卫和节点分类。
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* function processNode(node: ASTNode) {
|
|
80
|
+
* if (node.type === 'addInstruction') {
|
|
81
|
+
* // 处理加法指令
|
|
82
|
+
* }
|
|
83
|
+
* }
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
type: string;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @summary 节点位置
|
|
90
|
+
* @desc 节点在源代码中的起始位置
|
|
91
|
+
*/
|
|
92
|
+
position: Position;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @summary 节点结束位置
|
|
96
|
+
* @desc 节点在源代码中的结束位置
|
|
97
|
+
*/
|
|
98
|
+
end: Position;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
// -------------------------------------------------------------------------
|
|
103
|
+
// 字面量 / 叶子节点
|
|
104
|
+
// -------------------------------------------------------------------------
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* @summary 字面量/叶子节点概述
|
|
108
|
+
*
|
|
109
|
+
* @desc 字面量节点是 AST 中的最小语义单元,表示不可再分的基本值。
|
|
110
|
+
* 这些节点包括:
|
|
111
|
+
* - **数值字面量**:{@link IntegerNode}、{@link FloatNode}、{@link HexNumberNode}、{@link BinaryNumberNode}
|
|
112
|
+
* - **标识符**:{@link IdentifierNode}
|
|
113
|
+
* - **字符串字面量**:{@link StringNode}
|
|
114
|
+
* - **寄存器引用**:{@link RegisterNode}
|
|
115
|
+
* - **设备引用**:{@link DeviceNode}
|
|
116
|
+
* - **常量关键字**:{@link ConstantNode}
|
|
117
|
+
* - **宏调用**:{@link HashCallNode}、{@link StrCallNode}
|
|
118
|
+
* - **错误节点**:{@link ErrorNode}
|
|
119
|
+
*
|
|
120
|
+
* @see {@link NumberNode} - 数值字面量的联合类型
|
|
121
|
+
* @see {@link OperandNode} - 操作数类型的联合类型
|
|
122
|
+
*/
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @summary 整数字面量节点
|
|
126
|
+
*
|
|
127
|
+
* @desc 表示 IC10 程序中的十进制整数值。
|
|
128
|
+
* 例如 `42`、`-17`、`0` 等。
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* // JSON 表示
|
|
133
|
+
* {
|
|
134
|
+
* "type": "Integer",
|
|
135
|
+
* "position": { "line": 0, "column": 5 },
|
|
136
|
+
* "value": 42
|
|
137
|
+
* }
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* @public
|
|
141
|
+
*/
|
|
142
|
+
export interface IntegerNode extends ASTNode {
|
|
143
|
+
type: "Integer";
|
|
144
|
+
/**
|
|
145
|
+
* @summary 整数值
|
|
146
|
+
* @desc 十进制整数,可正可负
|
|
147
|
+
*/
|
|
148
|
+
value: number;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @summary 浮点数字面量节点
|
|
154
|
+
*
|
|
155
|
+
* @desc 表示 IC10 程序中的十进制浮点数值。
|
|
156
|
+
* 例如 `3.14`、`-0.5`、`.5` 等。
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* // JSON 表示
|
|
161
|
+
* {
|
|
162
|
+
* "type": "Float",
|
|
163
|
+
* "position": { "line": 0, "column": 5 },
|
|
164
|
+
* "value": 3.14
|
|
165
|
+
* }
|
|
166
|
+
* ```
|
|
167
|
+
*
|
|
168
|
+
* @public
|
|
169
|
+
*/
|
|
170
|
+
export interface FloatNode extends ASTNode {
|
|
171
|
+
type: "Float";
|
|
172
|
+
/**
|
|
173
|
+
* @summary 浮点数值
|
|
174
|
+
* @desc 十进制浮点数
|
|
175
|
+
*/
|
|
176
|
+
value: number;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* @summary 十六进制数字面量节点
|
|
182
|
+
*
|
|
183
|
+
* @desc 表示 IC10 程序中的十六进制整数值。
|
|
184
|
+
* 以 `0x` 或 `0X` 前缀开头。
|
|
185
|
+
* 例如 `0xFF`、`0X1A` 等。
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```typescript
|
|
189
|
+
* // JSON 表示
|
|
190
|
+
* {
|
|
191
|
+
* "type": "HexNumber",
|
|
192
|
+
* "position": { "line": 0, "column": 5 },
|
|
193
|
+
* "value": "0xFF"
|
|
194
|
+
* }
|
|
195
|
+
* ```
|
|
196
|
+
*
|
|
197
|
+
* @public
|
|
198
|
+
*/
|
|
199
|
+
export interface HexNumberNode extends ASTNode {
|
|
200
|
+
type: "HexNumber";
|
|
201
|
+
/**
|
|
202
|
+
* @summary 十六进制字符串
|
|
203
|
+
* @desc 包含前缀的十六进制字符串,如 "0xFF"
|
|
204
|
+
*/
|
|
205
|
+
value: string;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @summary 二进制数字面量节点
|
|
211
|
+
*
|
|
212
|
+
* @desc 表示 IC10 程序中的二进制整数值。
|
|
213
|
+
* 以 `0b` 或 `0B` 前缀开头。
|
|
214
|
+
* 例如 `0b1010`、`0B11` 等。
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```typescript
|
|
218
|
+
* // JSON 表示
|
|
219
|
+
* {
|
|
220
|
+
* "type": "BinaryNumber",
|
|
221
|
+
* "position": { "line": 0, "column": 5 },
|
|
222
|
+
* "value": "0b1010"
|
|
223
|
+
* }
|
|
224
|
+
* ```
|
|
225
|
+
*
|
|
226
|
+
* @public
|
|
227
|
+
*/
|
|
228
|
+
export interface BinaryNumberNode extends ASTNode {
|
|
229
|
+
type: "BinaryNumber";
|
|
230
|
+
/**
|
|
231
|
+
* @summary 二进制字符串
|
|
232
|
+
* @desc 包含前缀的二进制字符串,如 "0b1010"
|
|
233
|
+
*/
|
|
234
|
+
value: string;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* @summary 标识符节点
|
|
240
|
+
*
|
|
241
|
+
* @desc 表示 IC10 程序中的标识符,如变量名、标签名、别名等。
|
|
242
|
+
* 标识符必须以字母或下划线开头,后续字符可以是字母、数字或下划线。
|
|
243
|
+
*
|
|
244
|
+
* @example
|
|
245
|
+
* ```typescript
|
|
246
|
+
* // JSON 表示
|
|
247
|
+
* {
|
|
248
|
+
* "type": "Identifier",
|
|
249
|
+
* "position": { "line": 0, "column": 0 },
|
|
250
|
+
* "value": "myVariable"
|
|
251
|
+
* }
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
254
|
+
* @public
|
|
255
|
+
*/
|
|
256
|
+
export interface IdentifierNode extends ASTNode {
|
|
257
|
+
type: "Identifier";
|
|
258
|
+
/**
|
|
259
|
+
* @summary 标识符名称
|
|
260
|
+
* @desc 标识符的字符串名称
|
|
261
|
+
*/
|
|
262
|
+
value: string;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* @summary 字符串字面量节点
|
|
268
|
+
*
|
|
269
|
+
* @desc 表示 IC10 程序中的字符串字面量。
|
|
270
|
+
* 字符串由双引号包围,支持转义字符。
|
|
271
|
+
*
|
|
272
|
+
* @example
|
|
273
|
+
* ```typescript
|
|
274
|
+
* // JSON 表示
|
|
275
|
+
* {
|
|
276
|
+
* "type": "String",
|
|
277
|
+
* "position": { "line": 0, "column": 0 },
|
|
278
|
+
* "value": "\"Hello, World!\""
|
|
279
|
+
* }
|
|
280
|
+
* ```
|
|
281
|
+
*
|
|
282
|
+
* @public
|
|
283
|
+
*/
|
|
284
|
+
export interface StringNode extends ASTNode {
|
|
285
|
+
type: "String";
|
|
286
|
+
/**
|
|
287
|
+
* @summary 字符串内容
|
|
288
|
+
* @desc 包括引号的完整字符串值
|
|
289
|
+
*/
|
|
290
|
+
value: string;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* @summary 寄存器引用节点
|
|
296
|
+
*
|
|
297
|
+
* @desc 表示 IC10 程序中对寄存器的引用。
|
|
298
|
+
* 寄存器是 IC10 CPU 的内部存储单元,名称格式为 `r0` 到 `r15`(共16个寄存器)。
|
|
299
|
+
*
|
|
300
|
+
* @example
|
|
301
|
+
* ```typescript
|
|
302
|
+
* // JSON 表示
|
|
303
|
+
* {
|
|
304
|
+
* "type": "Register",
|
|
305
|
+
* "position": { "line": 0, "column": 5 },
|
|
306
|
+
* "value": "r0"
|
|
307
|
+
* }
|
|
308
|
+
* ```
|
|
309
|
+
*
|
|
310
|
+
* @public
|
|
311
|
+
*/
|
|
312
|
+
export interface RegisterNode extends ASTNode {
|
|
313
|
+
type: "Register";
|
|
314
|
+
/**
|
|
315
|
+
* @summary 寄存器名称
|
|
316
|
+
* @desc 格式为 "r0" 到 "r15"
|
|
317
|
+
*/
|
|
318
|
+
value: string;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* @summary 设备引用节点
|
|
324
|
+
*
|
|
325
|
+
* @desc 表示 IC10 程序中对设备的引用。
|
|
326
|
+
* 设备是通过 `alias` 指令定义的逻辑设备名称。
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```typescript
|
|
330
|
+
* // JSON 表示
|
|
331
|
+
* {
|
|
332
|
+
* "type": "Device",
|
|
333
|
+
* "position": { "line": 0, "column": 6 },
|
|
334
|
+
* "value": "console1"
|
|
335
|
+
* }
|
|
336
|
+
* ```
|
|
337
|
+
*
|
|
338
|
+
* @public
|
|
339
|
+
*/
|
|
340
|
+
export interface DeviceNode extends ASTNode {
|
|
341
|
+
type: "Device";
|
|
342
|
+
/**
|
|
343
|
+
* @summary 设备名称
|
|
344
|
+
* @desc 通过 alias 指令定义的设备别名
|
|
345
|
+
*/
|
|
346
|
+
value: string;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* @summary 常量关键字节点
|
|
352
|
+
*
|
|
353
|
+
* @desc 表示 IC10 程序中的预定义常量关键字。
|
|
354
|
+
* 常用常量包括:`nan`(非数字)、`pi`(圆周率)、`e`(自然常数)等。
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```typescript
|
|
358
|
+
* // JSON 表示
|
|
359
|
+
* {
|
|
360
|
+
* "type": "Constant",
|
|
361
|
+
* "position": { "line": 0, "column": 5 },
|
|
362
|
+
* "keyword": "pi"
|
|
363
|
+
* }
|
|
364
|
+
* ```
|
|
365
|
+
*
|
|
366
|
+
* @public
|
|
367
|
+
*/
|
|
368
|
+
export interface ConstantNode extends ASTNode {
|
|
369
|
+
type: "Constant";
|
|
370
|
+
/**
|
|
371
|
+
* @summary 常量关键字
|
|
372
|
+
* @desc 如 "nan"、"pi"、"e" 等
|
|
373
|
+
*/
|
|
374
|
+
keyword: string;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* @summary HASH 宏调用节点
|
|
380
|
+
*
|
|
381
|
+
* @desc 表示 IC10 程序中的 HASH 宏调用。
|
|
382
|
+
* HASH 宏用于计算字符串的哈希值,格式为 `HASH("string")`。
|
|
383
|
+
* 返回值为给定字符串的 32 位无符号整数哈希。
|
|
384
|
+
*
|
|
385
|
+
* @example
|
|
386
|
+
* ```typescript
|
|
387
|
+
* // JSON 表示
|
|
388
|
+
* {
|
|
389
|
+
* "type": "HashCall",
|
|
390
|
+
* "position": { "line": 0, "column": 0 },
|
|
391
|
+
* "value": {
|
|
392
|
+
* "type": "String",
|
|
393
|
+
* "position": { "line": 0, "column": 6 },
|
|
394
|
+
* "value": "\"Example\""
|
|
395
|
+
* }
|
|
396
|
+
* }
|
|
397
|
+
* ```
|
|
398
|
+
*
|
|
399
|
+
* @public
|
|
400
|
+
*/
|
|
401
|
+
export interface HashCallNode extends ASTNode {
|
|
402
|
+
type: "HashCall";
|
|
403
|
+
/**
|
|
404
|
+
* @summary 参数字符串
|
|
405
|
+
* @desc 要计算哈希的字符串参数
|
|
406
|
+
*/
|
|
407
|
+
value: StringNode;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* @summary STR 宏调用节点
|
|
413
|
+
*
|
|
414
|
+
* @desc 表示 IC10 程序中的 STR 宏调用。
|
|
415
|
+
* STR 宏用于获取字符串的长度,格式为 `STR("string")`。
|
|
416
|
+
*
|
|
417
|
+
* @example
|
|
418
|
+
* ```typescript
|
|
419
|
+
* // JSON 表示
|
|
420
|
+
* {
|
|
421
|
+
* "type": "StrCall",
|
|
422
|
+
* "position": { "line": 0, "column": 0 },
|
|
423
|
+
* "value": {
|
|
424
|
+
* "type": "String",
|
|
425
|
+
* "position": { "line": 0, "column": 4 },
|
|
426
|
+
* "value": "\"Example\""
|
|
427
|
+
* }
|
|
428
|
+
* }
|
|
429
|
+
* ```
|
|
430
|
+
*
|
|
431
|
+
* @public
|
|
432
|
+
*/
|
|
433
|
+
export interface StrCallNode extends ASTNode {
|
|
434
|
+
type: "StrCall";
|
|
435
|
+
/**
|
|
436
|
+
* @summary 参数字符串
|
|
437
|
+
* @desc 要获取长度的字符串参数
|
|
438
|
+
*/
|
|
439
|
+
value: StringNode;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* @summary 错误节点
|
|
445
|
+
*
|
|
446
|
+
* @desc 表示词法分析或语法分析过程中产生的错误。
|
|
447
|
+
* 当无法识别有效的 Token 或无法解析正确的语法结构时,会生成错误节点。
|
|
448
|
+
* 错误节点会被嵌入到正常的 AST 结构中,作为 {@link Errorable} 联合类型的一部分。
|
|
449
|
+
*
|
|
450
|
+
* @note
|
|
451
|
+
* 错误节点的存在允许编译器继续处理其余代码,同时报告已发生的错误。
|
|
452
|
+
*
|
|
453
|
+
* @example
|
|
454
|
+
* ```typescript
|
|
455
|
+
* // JSON 表示
|
|
456
|
+
* {
|
|
457
|
+
* "type": "Error",
|
|
458
|
+
* "position": { "line": 0, "column": 0 },
|
|
459
|
+
* "token": { ... },
|
|
460
|
+
* "message": "Unexpected token"
|
|
461
|
+
* }
|
|
462
|
+
* ```
|
|
463
|
+
*
|
|
464
|
+
* @public
|
|
465
|
+
*/
|
|
466
|
+
export interface ErrorNode extends ASTNode {
|
|
467
|
+
type: "Error";
|
|
468
|
+
/**
|
|
469
|
+
* @summary 导致错误的 Token
|
|
470
|
+
* @desc 触发错误的源 Token,用于定位错误位置
|
|
471
|
+
*/
|
|
472
|
+
token: Token;
|
|
473
|
+
/**
|
|
474
|
+
* @summary 错误消息
|
|
475
|
+
* @desc 描述错误原因的文本
|
|
476
|
+
*/
|
|
477
|
+
message: string;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
// -------------------------------------------------------------------------
|
|
482
|
+
// 类型别名(联合类型)
|
|
483
|
+
// -------------------------------------------------------------------------
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* @summary 类型别名概述
|
|
487
|
+
*
|
|
488
|
+
* @desc 以下是 IC10 AST 中常用的类型别名,它们通常是多种具体节点类型的联合。
|
|
489
|
+
* 使用类型别名可以简化复杂类型签名,提高代码可读性。
|
|
490
|
+
*
|
|
491
|
+
* 重要类型别名说明:
|
|
492
|
+
* - {@link NumberNode}:所有数值字面量的联合
|
|
493
|
+
* - {@link OperandNode}:指令操作数可能的所有类型
|
|
494
|
+
* - {@link RegisterOrIdentifierNode}:寄存器或标识符(用于可读写的位置)
|
|
495
|
+
*/
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* @summary 数值字面量联合类型
|
|
499
|
+
*
|
|
500
|
+
* @desc 表示所有可能的数值字面量类型,包括十进制整数、浮点数、十六进制数和二进制数。
|
|
501
|
+
* 也可能包含错误节点(当数值解析失败时)。
|
|
502
|
+
*
|
|
503
|
+
* @example
|
|
504
|
+
* ```typescript
|
|
505
|
+
* function processNumber(node: NumberNode) {
|
|
506
|
+
* if (node.type === 'Integer') {
|
|
507
|
+
* console.log('Integer:', node.value);
|
|
508
|
+
* } else if (node.type === 'Float') {
|
|
509
|
+
* console.log('Float:', node.value);
|
|
510
|
+
* } else if (node.type === 'HexNumber') {
|
|
511
|
+
* console.log('Hex:', node.value);
|
|
512
|
+
* } else if (node.type === 'BinaryNumber') {
|
|
513
|
+
* console.log('Binary:', node.value);
|
|
514
|
+
* }
|
|
515
|
+
* }
|
|
516
|
+
* ```
|
|
517
|
+
*
|
|
518
|
+
* @public
|
|
519
|
+
*/
|
|
520
|
+
export type NumberNode =
|
|
521
|
+
| IntegerNode
|
|
522
|
+
| FloatNode
|
|
523
|
+
| HexNumberNode
|
|
524
|
+
| BinaryNumberNode
|
|
525
|
+
| ErrorNode;
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* @summary 宏调用联合类型
|
|
529
|
+
*
|
|
530
|
+
* @desc 表示宏调用的可能类型,包括 HASH 宏和 STR 宏。
|
|
531
|
+
*
|
|
532
|
+
* @public
|
|
533
|
+
*/
|
|
534
|
+
export type MacroCallNode = HashCallNode | StrCallNode | ErrorNode;
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* @summary 寄存器或标识符联合类型
|
|
538
|
+
*
|
|
539
|
+
* @desc 表示可以作为寄存器或标识符的位置。
|
|
540
|
+
* 在 IC10 中,某些位置既可以是具体的寄存器(如 `r0`),也可以是变量名(标识符)。
|
|
541
|
+
* 此类型用于区分可写位置和只读操作数。
|
|
542
|
+
*
|
|
543
|
+
* @public
|
|
544
|
+
*/
|
|
545
|
+
export type RegisterOrIdentifierNode = RegisterNode | IdentifierNode | ErrorNode;
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* @summary 设备引用联合类型
|
|
549
|
+
*
|
|
550
|
+
* @desc 表示设备引用的可能形式:
|
|
551
|
+
* - 直接的设备名称(如 `console1`)
|
|
552
|
+
* - 寄存器或标识符(用于间接引用)
|
|
553
|
+
* - 数值(用于立即数地址)
|
|
554
|
+
*
|
|
555
|
+
* @public
|
|
556
|
+
*/
|
|
557
|
+
export type DeviceReferenceNode =
|
|
558
|
+
| DeviceNode
|
|
559
|
+
| RegisterOrIdentifierNode
|
|
560
|
+
| NumberNode;
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* @summary 寄存器或设备联合类型
|
|
564
|
+
*
|
|
565
|
+
* @desc 表示可以绑定到 alias 的目标类型。
|
|
566
|
+
* alias 指令可以将设备绑定到寄存器,或将设备绑定到另一个设备别名。
|
|
567
|
+
*
|
|
568
|
+
* @example
|
|
569
|
+
* ```typescript
|
|
570
|
+
* // alias myReg r0 - 将寄存器绑定到别名
|
|
571
|
+
* // alias console1 console0 - 将设备绑定到别名
|
|
572
|
+
* ```
|
|
573
|
+
*
|
|
574
|
+
* @public
|
|
575
|
+
*/
|
|
576
|
+
export type RegisterOrDeviceNode = RegisterOrIdentifierNode | DeviceNode;
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* @summary 试剂模式联合类型
|
|
580
|
+
*
|
|
581
|
+
* @desc 用于库存管理指令中的试剂筛选模式。
|
|
582
|
+
* 可以是标识符(如 `"ic2"`)或数值。
|
|
583
|
+
*
|
|
584
|
+
* @public
|
|
585
|
+
*/
|
|
586
|
+
export type ReagentModeNode = IdentifierNode | NumberNode;
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* @summary 批处理模式联合类型
|
|
590
|
+
*
|
|
591
|
+
* @desc 用于库存管理指令中的批处理控制。
|
|
592
|
+
* 可以是标识符或数值。
|
|
593
|
+
*
|
|
594
|
+
* @public
|
|
595
|
+
*/
|
|
596
|
+
export type BatchModeNode = IdentifierNode | NumberNode;
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* @summary 逻辑槽类型联合类型
|
|
600
|
+
*
|
|
601
|
+
* @desc 用于指定设备逻辑槽的类型。
|
|
602
|
+
* 可以是标识符(如 `"logic"`)或数值编码。
|
|
603
|
+
*
|
|
604
|
+
* @public
|
|
605
|
+
*/
|
|
606
|
+
export type LogicSlotTypeNode = IdentifierNode | NumberNode;
|
|
607
|
+
|
|
608
|
+
/**
|
|
609
|
+
* @summary 槽索引类型
|
|
610
|
+
*
|
|
611
|
+
* @desc 用于指定设备槽的索引位置。
|
|
612
|
+
* 通常为数值类型。
|
|
613
|
+
*
|
|
614
|
+
* @public
|
|
615
|
+
*/
|
|
616
|
+
export type SlotIndexNode = NumberNode;
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* @summary 逻辑类型联合类型
|
|
620
|
+
*
|
|
621
|
+
* @desc 用于指定逻辑类型(如数字、逻辑、字符等)。
|
|
622
|
+
* 可以是标识符或数值编码。
|
|
623
|
+
*
|
|
624
|
+
* @public
|
|
625
|
+
*/
|
|
626
|
+
export type LogicTypeNode = IdentifierNode | NumberNode;
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* @summary 操作数联合类型
|
|
630
|
+
*
|
|
631
|
+
* @desc 表示指令中操作数可能的所有类型。
|
|
632
|
+
* 操作数是指令的参数,可以是:
|
|
633
|
+
* - 寄存器(r0-r15)
|
|
634
|
+
* - 设备引用
|
|
635
|
+
* - 数值(整数、浮点、十六进制、二进制)
|
|
636
|
+
* - 标识符
|
|
637
|
+
* - 常量关键字
|
|
638
|
+
* - 宏调用(HASH、STR)
|
|
639
|
+
*
|
|
640
|
+
* @example
|
|
641
|
+
* ```typescript
|
|
642
|
+
* function processOperand(op: OperandNode) {
|
|
643
|
+
* switch (op.type) {
|
|
644
|
+
* case 'Register':
|
|
645
|
+
* return `Register ${op.value}`;
|
|
646
|
+
* case 'Integer':
|
|
647
|
+
* case 'Float':
|
|
648
|
+
* case 'HexNumber':
|
|
649
|
+
* case 'BinaryNumber':
|
|
650
|
+
* return `Number ${op.value}`;
|
|
651
|
+
* case 'Identifier':
|
|
652
|
+
* return `Variable ${op.value}`;
|
|
653
|
+
* case 'Device':
|
|
654
|
+
* return `Device ${op.value}`;
|
|
655
|
+
* case 'Constant':
|
|
656
|
+
* return `Constant ${op.keyword}`;
|
|
657
|
+
* case 'HashCall':
|
|
658
|
+
* return `Hash of ${op.value.value}`;
|
|
659
|
+
* case 'StrCall':
|
|
660
|
+
* return `Length of ${op.value.value}`;
|
|
661
|
+
* }
|
|
662
|
+
* }
|
|
663
|
+
* ```
|
|
664
|
+
*
|
|
665
|
+
* @see {@link RegisterOrIdentifierNode} - 可写位置的类型
|
|
666
|
+
* @see {@link DeviceReferenceNode} - 设备引用类型
|
|
667
|
+
*
|
|
668
|
+
* @public
|
|
669
|
+
*/
|
|
670
|
+
export type OperandNode =
|
|
671
|
+
| RegisterNode
|
|
672
|
+
| DeviceNode
|
|
673
|
+
| NumberNode
|
|
674
|
+
| IdentifierNode
|
|
675
|
+
| ConstantNode
|
|
676
|
+
| MacroCallNode;
|
|
677
|
+
|
|
678
|
+
// -------------------------------------------------------------------------
|
|
679
|
+
// 预处理指令节点
|
|
680
|
+
// -------------------------------------------------------------------------
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* @summary 预处理指令概述
|
|
684
|
+
*
|
|
685
|
+
* @desc 预处理指令在程序编译前处理,用于定义别名、常量等。
|
|
686
|
+
* IC10 支持的预处理指令包括:
|
|
687
|
+
* - {@link AliasDirectiveNode}:`alias` - 为设备或寄存器定义别名
|
|
688
|
+
* - {@link DefineDirectiveNode}:`define` - 定义常量
|
|
689
|
+
*
|
|
690
|
+
* 预处理指令必须在程序主体之前声明。
|
|
691
|
+
*
|
|
692
|
+
* @see {@link PreprocessorDirectiveNode} - 预处理指令联合类型
|
|
693
|
+
*/
|
|
694
|
+
|
|
695
|
+
/**
|
|
696
|
+
* @summary alias 预处理指令节点
|
|
697
|
+
*
|
|
698
|
+
* @desc 表示 IC10 程序中的 `alias` 预处理指令。
|
|
699
|
+
* alias 指令用于为设备引用或寄存器定义别名,使代码更易读。
|
|
700
|
+
*
|
|
701
|
+
* 语法:`alias <identifier> <registerOrDevice>`
|
|
702
|
+
*
|
|
703
|
+
* @example
|
|
704
|
+
* ```typescript
|
|
705
|
+
* // alias console1 console0
|
|
706
|
+
* // 含义:将 console0 设备绑定到别名 console1
|
|
707
|
+
*
|
|
708
|
+
* // JSON 表示
|
|
709
|
+
* {
|
|
710
|
+
* "type": "AliasDirective",
|
|
711
|
+
* "position": { "line": 0, "column": 0 },
|
|
712
|
+
* "identifier": { "type": "Identifier", "value": "console1", ... },
|
|
713
|
+
* "registerOrDevice": { "type": "Identifier", "value": "console0", ... }
|
|
714
|
+
* }
|
|
715
|
+
* ```
|
|
716
|
+
*
|
|
717
|
+
* @public
|
|
718
|
+
*/
|
|
719
|
+
export interface AliasDirectiveNode extends ASTNode {
|
|
720
|
+
type: "AliasDirective";
|
|
721
|
+
/**
|
|
722
|
+
* @summary 别名标识符
|
|
723
|
+
* @desc 别名的名称,用于在后续代码中引用
|
|
724
|
+
*/
|
|
725
|
+
identifier: IdentifierNode;
|
|
726
|
+
/**
|
|
727
|
+
* @summary 被绑定的寄存器或设备
|
|
728
|
+
* @desc 实际的目标,可以是寄存器或设备
|
|
729
|
+
*/
|
|
730
|
+
registerOrDevice: RegisterOrDeviceNode;
|
|
731
|
+
/**
|
|
732
|
+
* @summary 类型名(可选)
|
|
733
|
+
* @desc 由 @type 注解指定的设备类型名
|
|
734
|
+
*/
|
|
735
|
+
typeName?: string;
|
|
736
|
+
/**
|
|
737
|
+
* @summary 描述(可选)
|
|
738
|
+
* @desc 由 @desc 注解指定的描述(与 typeName 互斥)
|
|
739
|
+
*/
|
|
740
|
+
desc?: string;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* @summary define 预处理指令节点
|
|
746
|
+
*
|
|
747
|
+
* @desc 表示 IC10 程序中的 `define` 预处理指令。
|
|
748
|
+
* define 指令用于定义常量,可以在代码中像使用字面量一样使用常量名。
|
|
749
|
+
*
|
|
750
|
+
* 语法:`define <identifier> <operand>`
|
|
751
|
+
*
|
|
752
|
+
* @example
|
|
753
|
+
* ```typescript
|
|
754
|
+
* // define MAX_VAL 100
|
|
755
|
+
* // 含义:定义常量 MAX_VAL,值为 100
|
|
756
|
+
*
|
|
757
|
+
* // JSON 表示
|
|
758
|
+
* {
|
|
759
|
+
* "type": "DefineDirective",
|
|
760
|
+
* "position": { "line": 0, "column": 0 },
|
|
761
|
+
* "identifier": { "type": "Identifier", "value": "MAX_VAL", ... },
|
|
762
|
+
* "number": { "type": "Integer", "value": 100, ... }
|
|
763
|
+
* }
|
|
764
|
+
* ```
|
|
765
|
+
*
|
|
766
|
+
* @public
|
|
767
|
+
*/
|
|
768
|
+
export interface DefineDirectiveNode extends ASTNode {
|
|
769
|
+
type: "DefineDirective";
|
|
770
|
+
/**
|
|
771
|
+
* @summary 常量标识符
|
|
772
|
+
* @desc 常量的名称
|
|
773
|
+
*/
|
|
774
|
+
identifier: IdentifierNode;
|
|
775
|
+
/**
|
|
776
|
+
* @summary 常量值
|
|
777
|
+
* @desc 可以是任何操作数类型(寄存器、设备、数值、标识符等)
|
|
778
|
+
*/
|
|
779
|
+
number: OperandNode;
|
|
780
|
+
/**
|
|
781
|
+
* @summary 类型名(可选)
|
|
782
|
+
* @desc 由 @type 注解指定的类型名
|
|
783
|
+
*/
|
|
784
|
+
typeName?: string;
|
|
785
|
+
/**
|
|
786
|
+
* @summary 描述(可选)
|
|
787
|
+
* @desc 由 @desc 注解指定的描述(与 typeName 互斥)
|
|
788
|
+
*/
|
|
789
|
+
desc?: string;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
/**
|
|
794
|
+
* @summary 预处理指令联合类型
|
|
795
|
+
*
|
|
796
|
+
* @desc 表示所有预处理指令的可能类型。
|
|
797
|
+
*
|
|
798
|
+
* @public
|
|
799
|
+
*/
|
|
800
|
+
export type PreprocessorDirectiveNode =
|
|
801
|
+
| AliasDirectiveNode
|
|
802
|
+
| DefineDirectiveNode
|
|
803
|
+
| ErrorNode;
|
|
804
|
+
|
|
805
|
+
// -------------------------------------------------------------------------
|
|
806
|
+
// 标签定义节点
|
|
807
|
+
// -------------------------------------------------------------------------
|
|
808
|
+
|
|
809
|
+
/**
|
|
810
|
+
* @summary 标签定义节点
|
|
811
|
+
*
|
|
812
|
+
* @desc 表示 IC10 程序中的标签定义。
|
|
813
|
+
* 标签是代码中的跳转目标,用于控制程序流程。
|
|
814
|
+
* 标签以冒号(`:`)结尾,位于语句之前。
|
|
815
|
+
*
|
|
816
|
+
* 语法:`<identifier>:`
|
|
817
|
+
*
|
|
818
|
+
* @example
|
|
819
|
+
* ```typescript
|
|
820
|
+
* // main:
|
|
821
|
+
* // 定义名为 main 的标签
|
|
822
|
+
*
|
|
823
|
+
* // JSON 表示
|
|
824
|
+
* {
|
|
825
|
+
* "type": "LabelDef",
|
|
826
|
+
* "position": { "line": 0, "column": 0 },
|
|
827
|
+
* "identifier": { "type": "Identifier", "value": "main", ... }
|
|
828
|
+
* }
|
|
829
|
+
* ```
|
|
830
|
+
*
|
|
831
|
+
* @see {@link JInstructionNode} - 跳转指令
|
|
832
|
+
* @see {@link JrInstructionNode} - 寄存器跳转指令
|
|
833
|
+
*
|
|
834
|
+
* @public
|
|
835
|
+
*/
|
|
836
|
+
export interface LabelDefNode extends ASTNode {
|
|
837
|
+
type: "LabelDef";
|
|
838
|
+
/**
|
|
839
|
+
* @summary 标签标识符
|
|
840
|
+
* @desc 标签的名称,用于作为跳转目标
|
|
841
|
+
*/
|
|
842
|
+
identifier: IdentifierNode;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
|
|
846
|
+
export interface InstructionNode extends ASTNode {
|
|
847
|
+
keyword: string;
|
|
848
|
+
}
|