Skip to main content

oak_matlab/ast/
mod.rs

1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4/// MATLAB 抽象语法树的根节点
5#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct MatlabRoot {
7    /// 脚本或函数中的项目列表
8    pub items: Vec<Item>,
9}
10
11/// MATLAB 中的顶级项目
12#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
13pub enum Item {
14    /// 函数定义
15    Function(Function),
16    /// 类定义
17    Class(Class),
18    /// 语句
19    Statement(Statement),
20}
21
22/// 函数定义
23#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
24pub struct Function {
25    /// 函数名
26    pub name: String,
27    /// 输入参数
28    pub inputs: Vec<String>,
29    /// 输出参数
30    pub outputs: Vec<String>,
31    /// 函数体
32    pub body: Vec<Statement>,
33    /// 源代码范围
34    #[serde(with = "oak_core::serde_range")]
35    pub span: Range<usize>,
36}
37
38/// 类定义
39#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
40pub struct Class {
41    /// 类名
42    pub name: String,
43    /// 基类
44    pub superclasses: Vec<String>,
45    /// 属性块
46    pub properties: Vec<Property>,
47    /// 方法块
48    pub methods: Vec<Function>,
49    /// 源代码范围
50    #[serde(with = "oak_core::serde_range")]
51    pub span: Range<usize>,
52}
53
54/// 属性
55#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
56pub struct Property {
57    /// 属性名
58    pub name: String,
59    /// 默认值
60    pub default_value: Option<String>,
61    /// 源代码范围
62    #[serde(with = "oak_core::serde_range")]
63    pub span: Range<usize>,
64}
65
66/// 语句
67#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
68pub enum Statement {
69    /// 赋值语句
70    Assignment {
71        target: String,
72        value: String,
73        #[serde(with = "oak_core::serde_range")]
74        span: Range<usize>,
75    },
76    /// 表达式语句
77    Expression {
78        value: String,
79        #[serde(with = "oak_core::serde_range")]
80        span: Range<usize>,
81    },
82    /// If 语句
83    If {
84        condition: String,
85        body: Vec<Statement>,
86        else_ifs: Vec<(String, Vec<Statement>)>,
87        else_body: Option<Vec<Statement>>,
88        #[serde(with = "oak_core::serde_range")]
89        span: Range<usize>,
90    },
91    /// For 循环
92    For {
93        variable: String,
94        range: String,
95        body: Vec<Statement>,
96        #[serde(with = "oak_core::serde_range")]
97        span: Range<usize>,
98    },
99    /// While 循环
100    While {
101        condition: String,
102        body: Vec<Statement>,
103        #[serde(with = "oak_core::serde_range")]
104        span: Range<usize>,
105    },
106}
107
108pub struct MatlabScript {
109    pub items: Vec<Item>,
110}
111
112impl MatlabScript {
113    pub fn new(items: Vec<Item>) -> Self {
114        Self { items }
115    }
116}