Skip to main content

oak_ruby/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6/// Ruby AST 根节点
7pub type RubyAst = RubyRoot;
8
9/// 程序节点
10#[derive(Debug, Clone, PartialEq)]
11#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
12pub struct RubyRoot {
13    pub statements: Vec<StatementNode>,
14    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
15    pub span: Range<usize>,
16}
17
18/// Ruby 语句节点
19#[derive(Debug, Clone, PartialEq)]
20#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
21pub enum StatementNode {
22    /// 表达式语句
23    Expression(ExpressionNode),
24    /// 方法定义
25    MethodDef {
26        name: String,
27        params: Vec<String>,
28        body: Vec<StatementNode>,
29        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
30        span: Range<usize>,
31    },
32    /// 类定义
33    ClassDef {
34        name: String,
35        superclass: Option<String>,
36        body: Vec<StatementNode>,
37        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
38        span: Range<usize>,
39    },
40    /// 赋值语句
41    Assignment {
42        target: String,
43        value: ExpressionNode,
44        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
45        span: Range<usize>,
46    },
47    /// 条件语句
48    If {
49        condition: ExpressionNode,
50        then_body: Vec<StatementNode>,
51        else_body: Option<Vec<StatementNode>>,
52        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
53        span: Range<usize>,
54    },
55    /// 循环语句
56    While {
57        condition: ExpressionNode,
58        body: Vec<StatementNode>,
59        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
60        span: Range<usize>,
61    },
62    /// 返回语句
63    Return {
64        value: Option<ExpressionNode>,
65        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
66        span: Range<usize>,
67    },
68}
69
70/// Ruby 表达式节点
71#[derive(Debug, Clone, PartialEq)]
72#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
73pub enum ExpressionNode {
74    /// 标识符
75    Identifier {
76        name: String,
77        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
78        span: Range<usize>,
79    },
80    /// 字面量
81    Literal(LiteralNode),
82    /// 方法调用
83    MethodCall {
84        receiver: Option<Box<ExpressionNode>>,
85        method: String,
86        args: Vec<ExpressionNode>,
87        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
88        span: Range<usize>,
89    },
90    /// 二元操作
91    BinaryOp {
92        left: Box<ExpressionNode>,
93        operator: String,
94        right: Box<ExpressionNode>,
95        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
96        span: Range<usize>,
97    },
98    /// 一元操作
99    UnaryOp {
100        operator: String,
101        operand: Box<ExpressionNode>,
102        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
103        span: Range<usize>,
104    },
105    /// 数组
106    Array {
107        elements: Vec<ExpressionNode>,
108        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
109        span: Range<usize>,
110    },
111    /// 哈希
112    Hash {
113        pairs: Vec<(ExpressionNode, ExpressionNode)>,
114        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
115        span: Range<usize>,
116    },
117}
118
119/// 字面量节点
120#[derive(Debug, Clone, PartialEq)]
121#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
122pub enum LiteralNode {
123    /// 整数
124    Integer {
125        value: i64,
126        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
127        span: Range<usize>,
128    },
129    /// 浮点数
130    Float {
131        value: f64,
132        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
133        span: Range<usize>,
134    },
135    /// 字符串
136    String {
137        value: String,
138        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
139        span: Range<usize>,
140    },
141    /// 符号
142    Symbol {
143        value: String,
144        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
145        span: Range<usize>,
146    },
147    /// 布尔值
148    Boolean {
149        value: bool,
150        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
151        span: Range<usize>,
152    },
153    /// nil
154    Nil {
155        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
156        span: Range<usize>,
157    },
158}
159
160/// Ruby AST 访问者 trait
161pub trait RubyAstVisitor {
162    fn visit_program(&mut self, node: &RubyRoot);
163    fn visit_statement(&mut self, stmt: &StatementNode);
164    fn visit_expression(&mut self, expr: &ExpressionNode);
165    fn visit_literal(&mut self, literal: &LiteralNode);
166}