oak_ruby/ast/
mod.rs

1/// Ruby AST 根节点
2pub type RubyAst = ProgramNode;
3
4/// 程序节点
5#[derive(Debug, Clone, PartialEq)]
6pub struct ProgramNode {
7    pub statements: Vec<StatementNode>,
8}
9
10/// Ruby 语句节点
11#[derive(Debug, Clone, PartialEq)]
12pub enum StatementNode {
13    /// 表达式语句
14    Expression(ExpressionNode),
15    /// 方法定义
16    MethodDef { name: String, params: Vec<String>, body: Vec<StatementNode> },
17    /// 类定义
18    ClassDef { name: String, superclass: Option<String>, body: Vec<StatementNode> },
19    /// 赋值语句
20    Assignment { target: String, value: ExpressionNode },
21    /// 条件语句
22    If { condition: ExpressionNode, then_body: Vec<StatementNode>, else_body: Option<Vec<StatementNode>> },
23    /// 循环语句
24    While { condition: ExpressionNode, body: Vec<StatementNode> },
25    /// 返回语句
26    Return(Option<ExpressionNode>),
27}
28
29/// Ruby 表达式节点
30#[derive(Debug, Clone, PartialEq)]
31pub enum ExpressionNode {
32    /// 标识符
33    Identifier(String),
34    /// 字面量
35    Literal(LiteralNode),
36    /// 方法调用
37    MethodCall { receiver: Option<Box<ExpressionNode>>, method: String, args: Vec<ExpressionNode> },
38    /// 二元操作
39    BinaryOp { left: Box<ExpressionNode>, operator: String, right: Box<ExpressionNode> },
40    /// 一元操作
41    UnaryOp { operator: String, operand: Box<ExpressionNode> },
42    /// 数组
43    Array(Vec<ExpressionNode>),
44    /// 哈希
45    Hash(Vec<(ExpressionNode, ExpressionNode)>),
46}
47
48/// 字面量节点
49#[derive(Debug, Clone, PartialEq)]
50pub enum LiteralNode {
51    /// 整数
52    Integer(i64),
53    /// 浮点数
54    Float(f64),
55    /// 字符串
56    String(String),
57    /// 符号
58    Symbol(String),
59    /// 布尔值
60    Boolean(bool),
61    /// nil
62    Nil,
63}
64
65/// Ruby AST 访问者 trait
66pub trait RubyAstVisitor {
67    fn visit_program(&mut self, node: &ProgramNode);
68    fn visit_statement(&mut self, stmt: &StatementNode);
69    fn visit_expression(&mut self, expr: &ExpressionNode);
70    fn visit_literal(&mut self, literal: &LiteralNode);
71}