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,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
+ }