1pub type RubyAst = ProgramNode;
3
4#[derive(Debug, Clone, PartialEq)]
6pub struct ProgramNode {
7 pub statements: Vec<StatementNode>,
8}
9
10#[derive(Debug, Clone, PartialEq)]
12pub enum StatementNode {
13 Expression(ExpressionNode),
15 MethodDef { name: String, params: Vec<String>, body: Vec<StatementNode> },
17 ClassDef { name: String, superclass: Option<String>, body: Vec<StatementNode> },
19 Assignment { target: String, value: ExpressionNode },
21 If { condition: ExpressionNode, then_body: Vec<StatementNode>, else_body: Option<Vec<StatementNode>> },
23 While { condition: ExpressionNode, body: Vec<StatementNode> },
25 Return(Option<ExpressionNode>),
27}
28
29#[derive(Debug, Clone, PartialEq)]
31pub enum ExpressionNode {
32 Identifier(String),
34 Literal(LiteralNode),
36 MethodCall { receiver: Option<Box<ExpressionNode>>, method: String, args: Vec<ExpressionNode> },
38 BinaryOp { left: Box<ExpressionNode>, operator: String, right: Box<ExpressionNode> },
40 UnaryOp { operator: String, operand: Box<ExpressionNode> },
42 Array(Vec<ExpressionNode>),
44 Hash(Vec<(ExpressionNode, ExpressionNode)>),
46}
47
48#[derive(Debug, Clone, PartialEq)]
50pub enum LiteralNode {
51 Integer(i64),
53 Float(f64),
55 String(String),
57 Symbol(String),
59 Boolean(bool),
61 Nil,
63}
64
65pub 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}