mf_expression/compiler/opcode.rs
1use crate::functions::{FunctionKind, MethodKind};
2use crate::lexer::Bracket;
3use rust_decimal::Decimal;
4use std::sync::Arc;
5use strum_macros::Display;
6
7/// 快速获取目标枚举
8/// 用于优化成员访问的路径表示
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub enum FetchFastTarget {
11 Root, // 根对象引用
12 String(Arc<str>), // 字符串属性名
13 Number(u32), // 数字索引
14}
15
16/// 虚拟机操作码枚举
17/// 定义了虚拟机可执行的所有指令类型,采用栈式架构
18#[derive(Debug, PartialEq, Eq, Clone, Display)]
19pub enum Opcode {
20 // 基本值入栈操作
21 PushNull, // 将 null 值压入栈
22 PushBool(bool), // 将布尔值压入栈
23 PushString(Arc<str>), // 将字符串压入栈
24 PushNumber(Decimal), // 将数字压入栈
25
26 // 栈操作
27 Pop, // 弹出栈顶元素
28 Flatten, // 展平数组(将嵌套数组合并)
29 Join, // 连接数组元素为字符串
30
31 // 数据获取操作
32 Fetch, // 获取对象属性(从栈中获取对象和属性名)
33 FetchRootEnv, // 获取根环境
34 FetchEnv(Arc<str>), // 从环境中获取指定名称的值
35 FetchFast(Vec<FetchFastTarget>), // 快速获取(优化的属性访问路径)
36
37 // 一元操作
38 Negate, // 数值取负
39 Not, // 逻辑非
40
41 // 比较操作
42 Equal, // 相等比较
43 Jump(Jump, u32), // 条件或无条件跳转(跳转类型,跳转距离)
44 In, // 包含检查(检查元素是否在集合中)
45 Compare(Compare), // 数值大小比较
46
47 // 算术操作
48 Add, // 加法
49 Subtract, // 减法
50 Multiply, // 乘法
51 Divide, // 除法
52 Modulo, // 取模
53 Exponent, // 幂运算
54
55 // 数据结构操作
56 Slice, // 切片操作
57 Array, // 创建数组
58 Object, // 创建对象
59
60 // 循环和迭代相关
61 Len, // 获取长度
62 IncrementIt, // 增加迭代器
63 IncrementCount, // 增加计数器
64 GetCount, // 获取计数值
65 GetLen, // 获取长度值
66 Pointer, // 获取当前指针值
67 Begin, // 开始循环/作用域
68 End, // 结束循环/作用域
69
70 // 函数和方法调用
71 CallFunction {
72 kind: FunctionKind, // 函数类型
73 arg_count: u32, // 参数数量
74 },
75 CallMethod {
76 kind: MethodKind, // 方法类型
77 arg_count: u32, // 参数数量
78 },
79
80 // 区间操作
81 Interval {
82 left_bracket: Bracket, // 左括号类型(开区间或闭区间)
83 right_bracket: Bracket, // 右括号类型(开区间或闭区间)
84 },
85}
86
87/// 跳转类型枚举
88/// 定义了不同的条件跳转和无条件跳转类型
89#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
90pub enum Jump {
91 Forward, // 向前跳转
92 Backward, // 向后跳转
93 IfTrue, // 条件为真时跳转
94 IfFalse, // 条件为假时跳转
95 IfNotNull, // 值不为null时跳转
96 IfEnd, // 到达结束条件时跳转
97}
98
99/// 比较操作类型枚举
100/// 定义了数值比较的不同操作
101#[derive(Debug, PartialEq, Eq, Clone, Copy, Display)]
102pub enum Compare {
103 More, // 大于
104 Less, // 小于
105 MoreOrEqual, // 大于等于
106 LessOrEqual, // 小于等于
107}