Skip to main content

scarf_syntax/behavioral_statements/
case_statements.rs

1// =======================================================================
2// case_statements.rs
3// =======================================================================
4// CST Nodes from 1800-2023 A.6.7
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum CaseStatement<'a> {
9    Regular(
10        Box<(
11            Option<UniquePriority<'a>>,
12            CaseKeyword<'a>,
13            Metadata<'a>, // (
14            CaseExpression<'a>,
15            Metadata<'a>, // )
16            CaseItem<'a>,
17            Vec<CaseItem<'a>>,
18            Metadata<'a>, // endcase
19        )>,
20    ),
21    Matches(
22        Box<(
23            Option<UniquePriority<'a>>,
24            CaseKeyword<'a>,
25            Metadata<'a>, // (
26            CaseExpression<'a>,
27            Metadata<'a>, // )
28            Metadata<'a>, // matches
29            CasePatternItem<'a>,
30            Vec<CasePatternItem<'a>>,
31            Metadata<'a>, // endcase
32        )>,
33    ),
34    Inside(
35        Box<(
36            Option<UniquePriority<'a>>,
37            CaseKeyword<'a>,
38            Metadata<'a>, // (
39            CaseExpression<'a>,
40            Metadata<'a>, // )
41            Metadata<'a>, // inside
42            CaseInsideItem<'a>,
43            Vec<CaseInsideItem<'a>>,
44            Metadata<'a>, // endcase
45        )>,
46    ),
47}
48
49#[derive(Clone, Debug, PartialEq)]
50pub enum CaseKeyword<'a> {
51    Case(Metadata<'a>),
52    Casez(Metadata<'a>),
53    Casex(Metadata<'a>),
54}
55
56#[derive(Clone, Debug, PartialEq)]
57pub struct CaseExpression<'a>(pub Expression<'a>);
58
59#[derive(Clone, Debug, PartialEq)]
60pub enum CaseItem<'a> {
61    Expression(
62        Box<(
63            CaseItemExpression<'a>,
64            Vec<(
65                Metadata<'a>, // ,
66                CaseItemExpression<'a>,
67            )>,
68            Metadata<'a>, // :
69            StatementOrNull<'a>,
70        )>,
71    ),
72    Default(
73        Box<(
74            Metadata<'a>,         // default
75            Option<Metadata<'a>>, // :
76            StatementOrNull<'a>,
77        )>,
78    ),
79}
80
81#[derive(Clone, Debug, PartialEq)]
82pub enum CasePatternItem<'a> {
83    Expression(
84        Box<(
85            Pattern<'a>,
86            Option<(
87                Metadata<'a>, // &&&
88                Expression<'a>,
89            )>,
90            Metadata<'a>, // :
91            StatementOrNull<'a>,
92        )>,
93    ),
94    Default(
95        Box<(
96            Metadata<'a>,         // default
97            Option<Metadata<'a>>, // :
98            StatementOrNull<'a>,
99        )>,
100    ),
101}
102
103#[derive(Clone, Debug, PartialEq)]
104pub enum CaseInsideItem<'a> {
105    Expression(
106        Box<(
107            RangeList<'a>,
108            Metadata<'a>, // :
109            StatementOrNull<'a>,
110        )>,
111    ),
112    Default(
113        Box<(
114            Metadata<'a>,         // default
115            Option<Metadata<'a>>, // :
116            StatementOrNull<'a>,
117        )>,
118    ),
119}
120
121#[derive(Clone, Debug, PartialEq)]
122pub struct CaseItemExpression<'a>(pub Expression<'a>);
123
124#[derive(Clone, Debug, PartialEq)]
125pub struct RandcaseStatement<'a>(
126    pub Metadata<'a>, // randcase
127    pub RandcaseItem<'a>,
128    pub Vec<RandcaseItem<'a>>,
129    pub Metadata<'a>, // endcase
130);
131
132#[derive(Clone, Debug, PartialEq)]
133pub struct RandcaseItem<'a>(
134    pub Expression<'a>,
135    pub Metadata<'a>, // ,
136    pub StatementOrNull<'a>,
137);
138
139#[derive(Clone, Debug, PartialEq)]
140pub struct RangeList<'a>(
141    pub ValueRange<'a>,
142    pub Vec<(Metadata<'a>, ValueRange<'a>)>,
143);
144
145#[derive(Clone, Debug, PartialEq)]
146pub enum ValueRange<'a> {
147    Expression(Box<Expression<'a>>),
148    Slice(
149        Box<(
150            Metadata<'a>, // [
151            Expression<'a>,
152            Metadata<'a>, // :
153            Expression<'a>,
154            Metadata<'a>, // ]
155        )>,
156    ),
157    DollarLow(
158        Box<(
159            Metadata<'a>, // [
160            Metadata<'a>, // $
161            Metadata<'a>, // :
162            Expression<'a>,
163            Metadata<'a>, // ]
164        )>,
165    ),
166    DollarHigh(
167        Box<(
168            Metadata<'a>, // [
169            Expression<'a>,
170            Metadata<'a>, // :
171            Metadata<'a>, // $
172            Metadata<'a>, // ]
173        )>,
174    ),
175    AbsoluteTolerance(
176        Box<(
177            Metadata<'a>, // [
178            Expression<'a>,
179            Metadata<'a>, // +/-
180            Expression<'a>,
181            Metadata<'a>, // ]
182        )>,
183    ),
184    RelativeTolerance(
185        Box<(
186            Metadata<'a>, // [
187            Expression<'a>,
188            Metadata<'a>, // +%-
189            Expression<'a>,
190            Metadata<'a>, // ]
191        )>,
192    ),
193}