Skip to main content

oak_matlab/ast/
mod.rs

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