Skip to main content

oak_lua/ast/
mod.rs

1use core::range::Range;
2use oak_core::source::{SourceBuffer, ToSource};
3use serde::{Deserialize, Serialize};
4
5/// Lua 根节点
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct LuaRoot {
8    pub statements: Vec<LuaStatement>,
9    #[serde(with = "oak_core::serde_range")]
10    pub span: Range<usize>,
11}
12
13impl ToSource for LuaRoot {
14    fn to_source(&self, buffer: &mut SourceBuffer) {
15        for stmt in &self.statements {
16            stmt.to_source(buffer);
17            buffer.push("\n");
18        }
19    }
20}
21
22/// Lua 语句
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub enum LuaStatement {
25    Local(LuaLocalStatement),
26    Assignment(LuaAssignmentStatement),
27    Expression(LuaExpression),
28    Return(LuaReturnStatement),
29    // ... 其他语句
30}
31
32impl ToSource for LuaStatement {
33    fn to_source(&self, buffer: &mut SourceBuffer) {
34        match self {
35            LuaStatement::Local(s) => s.to_source(buffer),
36            LuaStatement::Assignment(s) => s.to_source(buffer),
37            LuaStatement::Expression(e) => e.to_source(buffer),
38            LuaStatement::Return(s) => s.to_source(buffer),
39        }
40    }
41}
42
43/// 本地变量声明
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct LuaLocalStatement {
46    pub names: Vec<String>,
47    pub values: Vec<LuaExpression>,
48}
49
50impl ToSource for LuaLocalStatement {
51    fn to_source(&self, buffer: &mut SourceBuffer) {
52        buffer.push("local ");
53        for (i, name) in self.names.iter().enumerate() {
54            if i > 0 {
55                buffer.push(", ");
56            }
57            buffer.push(name);
58        }
59        if !self.values.is_empty() {
60            buffer.push(" = ");
61            for (i, val) in self.values.iter().enumerate() {
62                if i > 0 {
63                    buffer.push(", ");
64                }
65                val.to_source(buffer);
66            }
67        }
68    }
69}
70
71/// 赋值语句
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct LuaAssignmentStatement {
74    pub targets: Vec<LuaExpression>,
75    pub values: Vec<LuaExpression>,
76}
77
78impl ToSource for LuaAssignmentStatement {
79    fn to_source(&self, buffer: &mut SourceBuffer) {
80        for (i, target) in self.targets.iter().enumerate() {
81            if i > 0 {
82                buffer.push(", ");
83            }
84            target.to_source(buffer);
85        }
86        buffer.push(" = ");
87        for (i, val) in self.values.iter().enumerate() {
88            if i > 0 {
89                buffer.push(", ");
90            }
91            val.to_source(buffer);
92        }
93    }
94}
95
96/// 返回语句
97#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct LuaReturnStatement {
99    pub values: Vec<LuaExpression>,
100}
101
102impl ToSource for LuaReturnStatement {
103    fn to_source(&self, buffer: &mut SourceBuffer) {
104        buffer.push("return ");
105        for (i, val) in self.values.iter().enumerate() {
106            if i > 0 {
107                buffer.push(", ");
108            }
109            val.to_source(buffer);
110        }
111    }
112}
113
114/// Lua 表达式
115#[derive(Debug, Clone, Serialize, Deserialize)]
116pub enum LuaExpression {
117    Identifier(String),
118    Number(f64),
119    String(String),
120    Boolean(bool),
121    Nil,
122    Binary(Box<LuaBinaryExpression>),
123    // ... 其他表达式
124}
125
126impl ToSource for LuaExpression {
127    fn to_source(&self, buffer: &mut SourceBuffer) {
128        match self {
129            LuaExpression::Identifier(id) => buffer.push(id),
130            LuaExpression::Number(n) => buffer.push(&n.to_string()),
131            LuaExpression::String(s) => {
132                buffer.push("\"");
133                buffer.push(s);
134                buffer.push("\"");
135            }
136            LuaExpression::Boolean(b) => buffer.push(if *b { "true" } else { "false" }),
137            LuaExpression::Nil => buffer.push("nil"),
138            LuaExpression::Binary(bin) => bin.to_source(buffer),
139        }
140    }
141}
142
143/// 二元表达式
144#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct LuaBinaryExpression {
146    pub left: LuaExpression,
147    pub op: String,
148    pub right: LuaExpression,
149}
150
151impl ToSource for LuaBinaryExpression {
152    fn to_source(&self, buffer: &mut SourceBuffer) {
153        self.left.to_source(buffer);
154        buffer.push(" ");
155        buffer.push(&self.op);
156        buffer.push(" ");
157        self.right.to_source(buffer);
158    }
159}