Skip to main content

scarf_syntax/expressions/
expressions.rs

1// =======================================================================
2// expressions.rs
3// =======================================================================
4//! CST Nodes from 1800-2023 A.8.3
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum IncOrDecExpression<'a> {
9    Preop(
10        Box<(
11            IncOrDecOperator<'a>,
12            Vec<AttributeInstance<'a>>,
13            VariableLvalue<'a>,
14        )>,
15    ),
16    Postop(
17        Box<(
18            VariableLvalue<'a>,
19            Vec<AttributeInstance<'a>>,
20            IncOrDecOperator<'a>,
21        )>,
22    ),
23}
24
25#[derive(Clone, Debug, PartialEq)]
26pub struct ConditionalExpression<'a>(
27    pub CondPredicate<'a>,
28    pub Metadata<'a>, // ?
29    pub Vec<AttributeInstance<'a>>,
30    pub Expression<'a>,
31    pub Metadata<'a>, // :
32    pub Expression<'a>,
33);
34
35#[derive(Clone, Debug, PartialEq)]
36pub enum ConstantExpression<'a> {
37    Primary(Box<ConstantPrimary<'a>>),
38    Unary(
39        Box<(
40            UnaryOperator<'a>,
41            Vec<AttributeInstance<'a>>,
42            ConstantPrimary<'a>,
43        )>,
44    ),
45    Binary(
46        Box<(
47            ConstantExpression<'a>,
48            BinaryOperator<'a>,
49            Vec<AttributeInstance<'a>>,
50            ConstantExpression<'a>,
51        )>,
52    ),
53    Ternary(
54        Box<(
55            ConstantExpression<'a>,
56            Metadata<'a>, // ?
57            Vec<AttributeInstance<'a>>,
58            ConstantExpression<'a>,
59            Metadata<'a>, // :
60            ConstantExpression<'a>,
61        )>,
62    ),
63}
64
65#[derive(Clone, Debug, PartialEq)]
66pub enum ConstantMintypmaxExpression<'a> {
67    Single(Box<ConstantExpression<'a>>),
68    Mintypmax(
69        Box<(
70            ConstantExpression<'a>,
71            Metadata<'a>,
72            ConstantExpression<'a>,
73            Metadata<'a>,
74            ConstantExpression<'a>,
75        )>,
76    ),
77}
78
79#[derive(Clone, Debug, PartialEq)]
80pub enum ConstantParamExpression<'a> {
81    Mintypmax(Box<ConstantMintypmaxExpression<'a>>),
82    Data(Box<DataType<'a>>),
83    Dollar(Box<Metadata<'a>>),
84}
85
86#[derive(Clone, Debug, PartialEq)]
87pub enum ParamExpression<'a> {
88    Mintypmax(Box<MintypmaxExpression<'a>>),
89    Data(Box<DataType<'a>>),
90    Dollar(Box<Metadata<'a>>),
91}
92
93#[derive(Clone, Debug, PartialEq)]
94pub enum ConstantRangeExpression<'a> {
95    Expression(Box<ConstantExpression<'a>>),
96    PartSelectRange(Box<ConstantPartSelectRange<'a>>),
97}
98
99#[derive(Clone, Debug, PartialEq)]
100pub enum ConstantPartSelectRange<'a> {
101    Range(Box<ConstantRange<'a>>),
102    IndexedRange(Box<ConstantIndexedRange<'a>>),
103}
104
105#[derive(Clone, Debug, PartialEq)]
106pub struct ConstantRange<'a>(
107    pub ConstantExpression<'a>,
108    pub Metadata<'a>, // :
109    pub ConstantExpression<'a>,
110);
111
112#[derive(Clone, Debug, PartialEq)]
113pub enum ConstantIndexedRange<'a> {
114    Plus(
115        Box<(
116            ConstantExpression<'a>,
117            Metadata<'a>, // +:
118            ConstantExpression<'a>,
119        )>,
120    ),
121    Minus(
122        Box<(
123            ConstantExpression<'a>,
124            Metadata<'a>, // -:
125            ConstantExpression<'a>,
126        )>,
127    ),
128}
129
130#[derive(Clone, Debug, PartialEq)]
131pub enum Expression<'a> {
132    Primary(Box<Primary<'a>>),
133    Unary(Box<(UnaryOperator<'a>, Vec<AttributeInstance<'a>>, Primary<'a>)>),
134    IncOrDecExpression(Box<IncOrDecExpression<'a>>),
135    OperatorAssignment(
136        Box<(Metadata<'a>, OperatorAssignment<'a>, Metadata<'a>)>,
137    ),
138    Binary(
139        Box<(
140            Expression<'a>,
141            BinaryOperator<'a>,
142            Vec<AttributeInstance<'a>>,
143            Expression<'a>,
144        )>,
145    ),
146    ConditionalExpression(Box<ConditionalExpression<'a>>),
147    InsideExpression(Box<InsideExpression<'a>>),
148    TaggedUnionExpression(Box<TaggedUnionExpression<'a>>),
149}
150
151#[derive(Clone, Debug, PartialEq)]
152pub struct TaggedUnionExpression<'a>(
153    pub Metadata<'a>, // tagged
154    pub MemberIdentifier<'a>,
155    pub Option<Primary<'a>>,
156);
157
158#[derive(Clone, Debug, PartialEq)]
159pub struct InsideExpression<'a>(
160    pub Expression<'a>,
161    pub Metadata<'a>, // inside
162    pub Metadata<'a>, // {
163    pub RangeList<'a>,
164    pub Metadata<'a>, // }
165);
166
167#[derive(Clone, Debug, PartialEq)]
168pub enum MintypmaxExpression<'a> {
169    Single(Box<Expression<'a>>),
170    Mintypmax(
171        Box<(
172            Expression<'a>,
173            Metadata<'a>,
174            Expression<'a>,
175            Metadata<'a>,
176            Expression<'a>,
177        )>,
178    ),
179}
180
181#[derive(Clone, Debug, PartialEq)]
182pub struct ModulePathConditionalExpression<'a>(
183    pub ModulePathExpression<'a>,
184    pub Metadata<'a>, // ?
185    pub Vec<AttributeInstance<'a>>,
186    pub ModulePathExpression<'a>,
187    pub Metadata<'a>, // :
188    pub ModulePathExpression<'a>,
189);
190
191#[derive(Clone, Debug, PartialEq)]
192pub enum ModulePathExpression<'a> {
193    Primary(Box<ModulePathPrimary<'a>>),
194    Unary(
195        Box<(
196            UnaryModulePathOperator<'a>,
197            Vec<AttributeInstance<'a>>,
198            ModulePathPrimary<'a>,
199        )>,
200    ),
201    Binary(
202        Box<(
203            ModulePathExpression<'a>,
204            BinaryModulePathOperator<'a>,
205            Vec<AttributeInstance<'a>>,
206            ModulePathExpression<'a>,
207        )>,
208    ),
209    Conditional(Box<ModulePathConditionalExpression<'a>>),
210}
211
212#[derive(Clone, Debug, PartialEq)]
213pub enum ModulePathMintypmaxExpression<'a> {
214    Single(Box<ModulePathExpression<'a>>),
215    Mintypmax(
216        Box<(
217            ModulePathExpression<'a>,
218            Metadata<'a>,
219            ModulePathExpression<'a>,
220            Metadata<'a>,
221            ModulePathExpression<'a>,
222        )>,
223    ),
224}
225
226#[derive(Clone, Debug, PartialEq)]
227pub enum PartSelectRange<'a> {
228    ConstantRange(Box<ConstantRange<'a>>),
229    IndexedRange(Box<IndexedRange<'a>>),
230}
231
232#[derive(Clone, Debug, PartialEq)]
233pub enum IndexedRange<'a> {
234    Plus(
235        Box<(
236            Expression<'a>,
237            Metadata<'a>, // +:
238            ConstantExpression<'a>,
239        )>,
240    ),
241    Minus(
242        Box<(
243            Expression<'a>,
244            Metadata<'a>, // -:
245            ConstantExpression<'a>,
246        )>,
247    ),
248}
249
250#[derive(Clone, Debug, PartialEq)]
251pub struct GenvarExpression<'a>(pub ConstantExpression<'a>);