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}