Skip to main content

scarf_syntax/source_text/
constraints.rs

1// =======================================================================
2// constraints.rs
3// =======================================================================
4// CST Nodes from 1800-2023 A.1.10
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub struct ConstraintDeclaration<'a>(
9    pub Option<Metadata<'a>>, // static
10    pub Metadata<'a>,         // constraint
11    pub Option<DynamicOverrideSpecifiers<'a>>,
12    pub ConstraintIdentifier<'a>,
13    pub ConstraintBlock<'a>,
14);
15
16#[derive(Clone, Debug, PartialEq)]
17pub struct ConstraintBlock<'a>(
18    pub Metadata<'a>, // {
19    pub Vec<ConstraintBlockItem<'a>>,
20    pub Metadata<'a>, // }
21);
22
23#[derive(Clone, Debug, PartialEq)]
24pub enum ConstraintBlockItem<'a> {
25    Ordering(
26        Box<(
27            Metadata<'a>, // solve
28            SolveBeforeList<'a>,
29            Metadata<'a>, // before
30            SolveBeforeList<'a>,
31            Metadata<'a>, // ;
32        )>,
33    ),
34    Expression(Box<ConstraintExpression<'a>>),
35}
36
37#[derive(Clone, Debug, PartialEq)]
38pub struct SolveBeforeList<'a>(
39    pub ConstraintPrimary<'a>,
40    pub  Vec<(
41        Metadata<'a>, // ,
42        ConstraintPrimary<'a>,
43    )>,
44);
45
46#[derive(Clone, Debug, PartialEq)]
47pub struct ConstraintPrimary<'a>(
48    pub ImplicitClassHandleOrClassScope<'a>,
49    pub HierarchicalIdentifier<'a>,
50    pub Select<'a>,
51    pub  Option<(
52        Metadata<'a>, // (
53        Metadata<'a>, // )
54    )>,
55);
56
57#[derive(Clone, Debug, PartialEq)]
58pub enum ConstraintExpression<'a> {
59    Expression(
60        Box<(
61            Option<Metadata<'a>>, // soft
62            ExpressionOrDist<'a>,
63            Metadata<'a>, // ;
64        )>,
65    ),
66    Uniqueness(
67        Box<(
68            UniquenessConstraint<'a>,
69            Metadata<'a>, // ;
70        )>,
71    ),
72    Implication(
73        Box<(
74            Expression<'a>,
75            Metadata<'a>, // ->
76            ConstraintSet<'a>,
77        )>,
78    ),
79    Conditional(
80        Box<(
81            Metadata<'a>, // if
82            Metadata<'a>, // (
83            Expression<'a>,
84            Metadata<'a>, // )
85            ConstraintSet<'a>,
86            Option<(
87                Metadata<'a>, // else
88                ConstraintSet<'a>,
89            )>,
90        )>,
91    ),
92    Foreach(
93        Box<(
94            Metadata<'a>, // foreach
95            Metadata<'a>, // (
96            PsOrHierarchicalArrayIdentifier<'a>,
97            Metadata<'a>, // [
98            LoopVariables<'a>,
99            Metadata<'a>, // ]
100            Metadata<'a>, // )
101            ConstraintSet<'a>,
102        )>,
103    ),
104    Disable(
105        Box<(
106            Metadata<'a>, // disable
107            Metadata<'a>, // soft
108            ConstraintPrimary<'a>,
109            Metadata<'a>, // ;
110        )>,
111    ),
112}
113
114#[derive(Clone, Debug, PartialEq)]
115pub struct UniquenessConstraint<'a>(
116    pub Metadata<'a>, // unique
117    pub Metadata<'a>, // {
118    pub RangeList<'a>,
119    pub Metadata<'a>, // }
120);
121
122#[derive(Clone, Debug, PartialEq)]
123pub enum ConstraintSet<'a> {
124    Single(Box<ConstraintExpression<'a>>),
125    Multi(
126        Box<(
127            Metadata<'a>, // {
128            Vec<ConstraintExpression<'a>>,
129            Metadata<'a>, // }
130        )>,
131    ),
132}
133
134#[derive(Clone, Debug, PartialEq)]
135pub struct ExpressionOrDist<'a>(
136    pub Expression<'a>,
137    pub  Option<(
138        Metadata<'a>, // dist
139        Metadata<'a>, // {
140        DistList<'a>,
141        Metadata<'a>, // }
142    )>,
143);
144
145#[derive(Clone, Debug, PartialEq)]
146pub struct DistList<'a>(
147    pub DistItem<'a>,
148    pub  Vec<(
149        Metadata<'a>, // ,
150        DistItem<'a>,
151    )>,
152);
153
154#[derive(Clone, Debug, PartialEq)]
155pub enum DistItem<'a> {
156    Value(Box<(ValueRange<'a>, Option<DistWeight<'a>>)>),
157    Default(
158        Box<(
159            Metadata<'a>, // default
160            Metadata<'a>, // :/
161            Expression<'a>,
162        )>,
163    ),
164}
165
166#[derive(Clone, Debug, PartialEq)]
167pub enum DistWeight<'a> {
168    IndvWeight(
169        Metadata<'a>, // :=
170        Expression<'a>,
171    ),
172    RangeWeight(
173        Metadata<'a>, // :/
174        Expression<'a>,
175    ),
176}
177
178#[derive(Clone, Debug, PartialEq)]
179pub struct ConstraintPrototype<'a>(
180    pub Option<ConstraintPrototypeQualifier<'a>>,
181    pub Option<Metadata<'a>>, // static
182    pub Metadata<'a>,         // constraint
183    pub Option<DynamicOverrideSpecifiers<'a>>,
184    pub ConstraintIdentifier<'a>,
185    pub Metadata<'a>, // ;
186);
187
188#[derive(Clone, Debug, PartialEq)]
189pub enum ConstraintPrototypeQualifier<'a> {
190    Extern(Metadata<'a>),
191    Pure(Metadata<'a>),
192}
193
194#[derive(Clone, Debug, PartialEq)]
195pub struct ExternConstraintDeclaration<'a>(
196    pub Option<Metadata<'a>>, // static
197    pub Metadata<'a>,         // constraint
198    pub Option<DynamicOverrideSpecifiers<'a>>,
199    pub ClassScope<'a>,
200    pub ConstraintIdentifier<'a>,
201    pub ConstraintBlock<'a>,
202);