Skip to main content

abyss_core/
ast.rs

1/// Represents line and column information for debugging purposes.
2#[derive(Debug, Clone)]
3pub struct LineInfo {
4    pub line: usize,
5    pub column: usize,
6}
7
8impl LineInfo {
9    /// Creates a `LineInfo` from explicit 1-based line and column values.
10    pub fn new(line: usize, column: usize) -> Self {
11        LineInfo { line, column }
12    }
13}
14
15/// Represents the abstract syntax tree (AST) for the language.
16#[derive(Debug, Clone)]
17pub enum AST {
18    Statement(Box<AST>, Option<LineInfo>),
19    Omen(bool, Option<LineInfo>),
20    Arcana(i64, Option<LineInfo>),
21    Aether(f64, Option<LineInfo>),
22    Rune(String, Option<LineInfo>),
23    Abyss(Option<LineInfo>),
24    Add(Box<AST>, Box<AST>, Option<LineInfo>),
25    Sub(Box<AST>, Box<AST>, Option<LineInfo>),
26    Mul(Box<AST>, Box<AST>, Option<LineInfo>),
27    Div(Box<AST>, Box<AST>, Option<LineInfo>),
28    Mod(Box<AST>, Box<AST>, Option<LineInfo>),
29    PowArcana(Box<AST>, Box<AST>, Option<LineInfo>),
30    PowAether(Box<AST>, Box<AST>, Option<LineInfo>),
31    Equal(Box<AST>, Box<AST>, Option<LineInfo>),
32    NotEqual(Box<AST>, Box<AST>, Option<LineInfo>),
33    LessThan(Box<AST>, Box<AST>, Option<LineInfo>),
34    LessThanOrEqual(Box<AST>, Box<AST>, Option<LineInfo>),
35    GreaterThan(Box<AST>, Box<AST>, Option<LineInfo>),
36    GreaterThanOrEqual(Box<AST>, Box<AST>, Option<LineInfo>),
37    LogicalAnd(Box<AST>, Box<AST>, Option<LineInfo>),
38    LogicalOr(Box<AST>, Box<AST>, Option<LineInfo>),
39    LogicalNot(Box<AST>, Option<LineInfo>),
40    VarAssign {
41        name: String,
42        value: Box<AST>,
43        var_type: Type,
44        is_morph: bool,
45        line_info: Option<LineInfo>,
46    },
47    Assignment {
48        name: String,
49        value: Box<AST>,
50        op: AssignmentOp,
51        line_info: Option<LineInfo>,
52    },
53    Var(String, Option<LineInfo>),
54    Reveal(Box<AST>, Option<LineInfo>),
55    Oracle {
56        is_match: bool,
57        conditionals: Vec<ConditionalAssignment>,
58        branches: Vec<AST>,
59        line_info: Option<LineInfo>,
60    },
61    OracleBranch {
62        pattern: Vec<AST>,
63        body: Box<AST>,
64        line_info: Option<LineInfo>,
65    },
66    OracleDontCareItem(Option<LineInfo>),
67    Block(Vec<AST>, Option<LineInfo>),
68    Comment(String, Option<LineInfo>),
69    Orbit {
70        params: Vec<AST>,
71        body: Box<AST>,
72        line_info: Option<LineInfo>,
73    },
74    OrbitParam {
75        name: String,
76        start: Box<AST>,
77        end: Box<AST>,
78        op: String,
79        line_info: Option<LineInfo>,
80    },
81    Resume(Option<String>, Option<LineInfo>),
82    Eject(Option<String>, Option<LineInfo>),
83    Engrave {
84        name: String,
85        params: Vec<AST>,
86        return_type: Type,
87        body: Box<AST>,
88        method_target: Option<ArtifactMethodTarget>,
89        line_info: Option<LineInfo>,
90    },
91    EngraveParam {
92        name: String,
93        param_type: Type,
94        is_morph: bool,
95        line_info: Option<LineInfo>,
96    },
97    FuncCall {
98        name: String,
99        args: Vec<AST>,
100        line_info: Option<LineInfo>,
101    },
102    ListLiteral {
103        elements: Vec<AST>,
104        line_info: Option<LineInfo>,
105    },
106    MapLiteral {
107        entries: Vec<(String, AST)>,
108        line_info: Option<LineInfo>,
109    },
110    IndexAccess {
111        target: Box<AST>,
112        index: Box<AST>,
113        line_info: Option<LineInfo>,
114    },
115    IndexAssignment {
116        target: Box<AST>,
117        index: Box<AST>,
118        value: Box<AST>,
119        line_info: Option<LineInfo>,
120    },
121    ArtifactDef {
122        name: String,
123        fields: Vec<ArtifactField>,
124        line_info: Option<LineInfo>,
125    },
126    ArtifactLiteral {
127        type_name: String,
128        fields: Vec<(String, AST)>,
129        line_info: Option<LineInfo>,
130    },
131    FieldAccess {
132        target: Box<AST>,
133        field: String,
134        line_info: Option<LineInfo>,
135    },
136    FieldAssignment {
137        target: Box<AST>,
138        field: String,
139        value: Box<AST>,
140        line_info: Option<LineInfo>,
141    },
142    MethodCall {
143        receiver: Box<AST>,
144        method: String,
145        args: Vec<AST>,
146        line_info: Option<LineInfo>,
147    },
148}
149
150#[derive(Debug, Clone)]
151pub struct ArtifactField {
152    pub name: String,
153    pub field_type: Type,
154    pub line_info: Option<LineInfo>,
155}
156
157#[derive(Debug, Clone)]
158pub struct ArtifactMethodTarget {
159    pub artifact: String,
160    pub requires_morph: bool,
161}
162
163/// Represents a conditional assignment within an oracle statement.
164#[derive(Debug, Clone)]
165pub struct ConditionalAssignment {
166    pub variable: String,
167    pub expression: Box<AST>,
168    pub line_info: Option<LineInfo>,
169}
170
171/// Represents the type of a variable or expression.
172#[derive(Debug, Clone, PartialEq, Eq, Hash)]
173pub enum Type {
174    Arcana,
175    Aether,
176    Rune,
177    Omen,
178    Abyss,
179    Scroll,
180    Lexicon,
181    Materia,
182    Glyph,
183    Artifact(String),
184}
185
186/// Represents an assignment operation.
187#[derive(Debug, Clone)]
188pub enum AssignmentOp {
189    Assign,
190    AddAssign,
191    SubAssign,
192    MulAssign,
193    DivAssign,
194    ModAssign,
195    PowArcanaAssign,
196    PowAetherAssign,
197}