@@ -114,31 +114,23 @@ Sets
114114
115115set_operator_intersection returns[Entity value]
116116 : left = sum_expression { $value = $left.value; }
117- (
118- ' intersect' right = sum_expression { $value = $value.Intersect($right.value); } |
119- ' / \\' right = sum_expression { $value = $value.Intersect($right.value); }
117+ ( ' intersect' right = sum_expression { $value = $value.Intersect($right.value); }
118+ | ' / \\' right = sum_expression { $value = $value.Intersect($right.value); }
120119 )*
121120 ;
122121
123- set_operator_union returns[Entity value]
122+ set_operator_union_setsubtraction returns[Entity value]
124123 : left = set_operator_intersection { $value = $left.value; }
125- (
126- ' unite' right = set_operator_intersection { $value = $value.Unite($right.value); } |
127- ' \\/ ' right = set_operator_intersection { $value = $value.Unite($right.value); }
128- )*
129- ;
130-
131- set_operator_setsubtraction returns[Entity value]
132- : left = set_operator_union { $value = $left.value; }
133- (
134- ' setsubtract' right = set_operator_union { $value = $value.SetSubtract($right.value); } |
135- ' \\' right = set_operator_union { $value = $value.SetSubtract($right.value); }
124+ ( ' unite' right = set_operator_intersection { $value = $value.Unite($right.value); }
125+ | ' \\/ ' right = set_operator_intersection { $value = $value.Unite($right.value); }
126+ | ' setsubtract' right = set_operator_intersection { $value = $value.SetSubtract($right.value); }
127+ | ' \\' right = set_operator_intersection { $value = $value.SetSubtract($right.value); }
136128 )*
137129 ;
138130
139131in_operator returns[Entity value]
140- : m1 = set_operator_setsubtraction { $value = $m1.value; }
141- (' in ' m2 = set_operator_setsubtraction { $value = $value.In($m2.value); })*
132+ : m1 = set_operator_union_setsubtraction { $value = $m1.value; }
133+ (' in ' m2 = set_operator_union_setsubtraction { $value = $value.In($m2.value); })*
142134 ;
143135
144136
@@ -148,42 +140,50 @@ Equality/inequality nodes
148140
149141*/
150142
151- inequality_expression returns[Entity value]
152- : m1 = in_operator { $value = $m1.value; }
143+ comparison_expression returns[Entity value]
144+ @init { List<Entity> terms = []; List<string> operators = []; }
145+ : m1 = in_operator { terms.Add($m1.value); }
153146 (
154- ' >= ' m2 = in_operator { $value = $value >= $m2.value; } |
155- ' <= ' m2 = in_operator { $value = $value <= $m2.value; } |
156- ' > ' m2 = in_operator { $value = $value > $m2.value; } |
157- ' < ' m2 = in_operator { $value = $value < $m2.value; } |
158- ' equalizes' m2 = in_operator { $value = MathS.Equality($value, $m2.value); })*
147+ (' >= ' { operators.Add(">="); } |
148+ ' <= ' { operators.Add("<="); } |
149+ ' > ' { operators.Add(">"); } |
150+ ' < ' { operators.Add("<"); } |
151+ ' = ' { operators.Add("="); } |
152+ ' <> ' { operators.Add("<>"); })
153+ m2 = in_operator { terms.Add($m2.value); }
154+ )*
155+ {
156+ if (terms.Count == 1)
157+ $value = terms[0];
158+ else
159+ // Create chain: a < b = c < d becomes (a < b) and (b = c) and (c < d)
160+ for (int i = 0; i < operators.Count; i++)
161+ {
162+ var connective = operators[i] switch
163+ { // Directly construct the nodes instead of using convenience methods to avoid built-in chained comparisons
164+ ">=" => new GreaterOrEqualf(terms[i], terms[i + 1]),
165+ "<=" => new LessOrEqualf(terms[i], terms[i + 1]),
166+ ">" => new Greaterf(terms[i], terms[i + 1]),
167+ "<" => new Lessf(terms[i], terms[i + 1]),
168+ "=" => new Equalsf(terms[i], terms[i + 1]),
169+ "<>" => !new Equalsf(terms[i], terms[i + 1]),
170+ _ => throw new AngouriBugException($"Unknown operator in chained comparison: {operators[i]}")
171+ };
172+ if (i == 0) $value = connective; else $value &= connective;
173+ }
174+ }
159175 ;
160176
161- terms_list returns[List<Entity> terms]
162- @init { $terms = new(); }
163- : (' = ' term = inequality_expression { $terms.Add($term.value); })+
164- ;
165-
166- equality_expression returns[Entity value]
167- : expr = inequality_expression { $value = $expr.value; } (terms_list
168- {
169- var list = $terms_list.terms.Prepend($value).ToArray();
170- List<Entity> eqTerms = new();
171- for (int i = 0; i < list.Length - 1; i++)
172- eqTerms.Add(list[i].Equalizes(list[i + 1]));
173- $value = eqTerms.Aggregate((eq1, eq2) => eq1 & eq2);
174- })?
175- ;
176-
177177/*
178178
179179Boolean nodes
180180
181181*/
182182
183183negate_expression returns[Entity value]
184- : ' not ' op = equality_expression { $value = !$op.value; }
184+ : ' not ' op = comparison_expression { $value = !$op.value; }
185185 | ' not ' opn = negate_expression { $value = !$opn.value; }
186- | op = equality_expression { $value = $op.value; }
186+ | op = comparison_expression { $value = $op.value; }
187187 ;
188188
189189and_expression returns[Entity value]
@@ -200,8 +200,8 @@ xor_expression returns[Entity value]
200200
201201or_expression returns[Entity value]
202202 : m1 = xor_expression { $value = $m1.value; }
203- (' or ' m2 = xor_expression { $value = $value | $m2.value; } |
204- ' |' m2 = xor_expression { $value = $value | $m2.value; })*
203+ ( ' or ' m2 = xor_expression { $value = $value | $m2.value; }
204+ | ' |' m2 = xor_expression { $value = $value | $m2.value; })*
205205 ;
206206
207207implies_expression returns[Entity value]
@@ -218,7 +218,7 @@ Keyword nodes
218218
219219provided_expression returns[Entity value]
220220 : expr = implies_expression { $value = $expr.value; }
221- (' provided' pred = implies_expression { $value = $value.Provided($pred.value); })*
221+ (' provided' pred = provided_expression { $value = $value.Provided($pred.value); })?
222222 ;
223223
224224/*
0 commit comments