1#[derive(Debug, Clone)]
3pub struct LineInfo {
4 pub line: usize,
5 pub column: usize,
6}
7
8impl LineInfo {
9 pub fn new(line: usize, column: usize) -> Self {
11 LineInfo { line, column }
12 }
13}
14
15#[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#[derive(Debug, Clone)]
165pub struct ConditionalAssignment {
166 pub variable: String,
167 pub expression: Box<AST>,
168 pub line_info: Option<LineInfo>,
169}
170
171#[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#[derive(Debug, Clone)]
188pub enum AssignmentOp {
189 Assign,
190 AddAssign,
191 SubAssign,
192 MulAssign,
193 DivAssign,
194 ModAssign,
195 PowArcanaAssign,
196 PowAetherAssign,
197}