@@ -111,14 +111,34 @@ public static ListExpr parse(String s) {
111
111
}
112
112
}
113
113
114
- public sealed interface Expr permits PlusExpr , MinusExpr , MultExpr , ListExpr , NumberExpr , VarExp {
114
+ public sealed interface Expr permits PlusExpr , MinusExpr , MultExpr , ListExpr , NumberExpr , VarExp , PlusListExpr , MultListExpr {
115
+ int size ();
116
+
117
+ Expr getFirst ();
118
+
119
+ List <Expr > getExprs ();
115
120
}
116
121
117
122
public static final class PlusExpr implements Expr {
118
123
@ Override
119
124
public String toString () {
120
125
return "+" ;
121
126
}
127
+
128
+ @ Override
129
+ public int size () {
130
+ return 0 ;
131
+ }
132
+
133
+ @ Override
134
+ public Expr getFirst () {
135
+ return null ;
136
+ }
137
+
138
+ @ Override
139
+ public List <Expr > getExprs () {
140
+ return List .of ();
141
+ }
122
142
}
123
143
124
144
public static final Expr PLUS = new PlusExpr ();
@@ -128,6 +148,21 @@ public static final class MinusExpr implements Expr {
128
148
public String toString () {
129
149
return "-" ;
130
150
}
151
+
152
+ @ Override
153
+ public int size () {
154
+ return 0 ;
155
+ }
156
+
157
+ @ Override
158
+ public Expr getFirst () {
159
+ return null ;
160
+ }
161
+
162
+ @ Override
163
+ public List <Expr > getExprs () {
164
+ return List .of ();
165
+ }
131
166
}
132
167
133
168
public static final Expr MINUS = new MinusExpr ();
@@ -137,25 +172,112 @@ public static final class MultExpr implements Expr {
137
172
public String toString () {
138
173
return "*" ;
139
174
}
175
+
176
+ @ Override
177
+ public int size () {
178
+ return 0 ;
179
+ }
180
+
181
+ @ Override
182
+ public Expr getFirst () {
183
+ return null ;
184
+ }
185
+
186
+ @ Override
187
+ public List <Expr > getExprs () {
188
+ return List .of ();
189
+ }
140
190
}
141
191
142
192
public static final Expr MULT = new MultExpr ();
143
193
144
194
public static Polynomial eval (Expr expr ) {
145
195
return switch (expr ) {
196
+ case PlusListExpr listExpr -> {
197
+ if (listExpr .value .size () == 1 ) {
198
+ yield eval (listExpr .value ().getFirst ());
199
+ }
200
+ Expr exprs = Macro .applyStarMacro (listExpr .value );
201
+ if (exprs .size () == 1 ) {
202
+ yield eval (exprs .getFirst ());
203
+ }
204
+ Polynomial result ;
205
+ if (hasPlus (exprs )) {
206
+ result = Polynomial .ZERO ;
207
+ int sign = 1 ;
208
+ for (Expr exp : exprs .getExprs ()) {
209
+ if (isMinus (exp )) {
210
+ sign = -1 ;
211
+ continue ;
212
+ }
213
+ if (isPlus (exp )) {
214
+ sign = 1 ;
215
+ continue ;
216
+ }
217
+ Polynomial p = eval (exp );
218
+ result = result .add (p .multiply (sign ));
219
+ }
220
+ } else {
221
+ result = Polynomial .ONE ;
222
+ for (Expr exp : exprs .getExprs ()) {
223
+ if (isOperator (exp )) {
224
+ continue ;
225
+ }
226
+ Polynomial p = eval (exp );
227
+ result = result .multiply (p );
228
+ }
229
+ }
230
+ yield result ;
231
+ }
232
+ case MultListExpr listExpr -> {
233
+ if (listExpr .value .size () == 1 ) {
234
+ yield eval (listExpr .value ().getFirst ());
235
+ }
236
+ Expr exprs = Macro .applyStarMacro (listExpr .value );
237
+ if (exprs .size () == 1 ) {
238
+ yield eval (exprs .getFirst ());
239
+ }
240
+ Polynomial result ;
241
+ if (hasPlus (exprs )) {
242
+ result = Polynomial .ZERO ;
243
+ int sign = 1 ;
244
+ for (Expr exp : exprs .getExprs ()) {
245
+ if (isMinus (exp )) {
246
+ sign = -1 ;
247
+ continue ;
248
+ }
249
+ if (isPlus (exp )) {
250
+ sign = 1 ;
251
+ continue ;
252
+ }
253
+ Polynomial p = eval (exp );
254
+ result = result .add (p .multiply (sign ));
255
+ }
256
+ } else {
257
+ result = Polynomial .ONE ;
258
+ for (Expr exp : exprs .getExprs ()) {
259
+ if (isOperator (exp )) {
260
+ continue ;
261
+ }
262
+ Polynomial p = eval (exp );
263
+ result = result .multiply (p );
264
+ }
265
+ }
266
+ yield result ;
267
+ }
146
268
case ListExpr listExpr -> {
147
269
if (listExpr .value .size () == 1 ) {
148
270
yield eval (listExpr .value ().getFirst ());
149
271
}
150
- List < Expr > exprs = Macro .applyStarMacro (listExpr );
272
+ Expr exprs = Macro .applyStarMacro (listExpr . value );
151
273
if (exprs .size () == 1 ) {
152
274
yield eval (exprs .getFirst ());
153
275
}
154
276
Polynomial result ;
155
277
if (hasPlus (exprs )) {
156
278
result = Polynomial .ZERO ;
157
279
int sign = 1 ;
158
- for (Expr exp : exprs ) {
280
+ for (Expr exp : exprs . getExprs () ) {
159
281
if (isMinus (exp )) {
160
282
sign = -1 ;
161
283
continue ;
@@ -169,7 +291,7 @@ public static Polynomial eval(Expr expr) {
169
291
}
170
292
} else {
171
293
result = Polynomial .ONE ;
172
- for (Expr exp : exprs ) {
294
+ for (Expr exp : exprs . getExprs () ) {
173
295
if (isOperator (exp )) {
174
296
continue ;
175
297
}
@@ -202,32 +324,119 @@ private static boolean isMinus(Expr expr) {
202
324
return expr instanceof MinusExpr ;
203
325
}
204
326
205
- private static boolean hasPlus (List < Expr > exprs ) {
206
- for (Expr expr : exprs ) {
327
+ private static boolean hasPlus (Expr exprs ) {
328
+ for (Expr expr : exprs . getExprs () ) {
207
329
if (expr instanceof PlusExpr || expr instanceof MinusExpr ) {
208
330
return true ;
209
331
}
210
332
}
211
333
return false ;
212
334
}
213
335
336
+ public record MultListExpr (List <Expr > value ) implements Expr {
337
+ public static MultListExpr of (Expr ... value ) {
338
+ return new MultListExpr (List .of (value ));
339
+ }
340
+
341
+ @ Override
342
+ public int size () {
343
+ return value ().size ();
344
+ }
345
+
346
+ @ Override
347
+ public Expr getFirst () {
348
+ return value .getFirst ();
349
+ }
350
+
351
+ @ Override
352
+ public List <Expr > getExprs () {
353
+ return value ;
354
+ }
355
+ }
356
+
357
+ public record PlusListExpr (List <Expr > value ) implements Expr {
358
+ public static PlusListExpr of (Expr ... value ) {
359
+ return new PlusListExpr (List .of (value ));
360
+ }
361
+
362
+
363
+ @ Override
364
+ public int size () {
365
+ return value ().size ();
366
+ }
367
+
368
+ @ Override
369
+ public Expr getFirst () {
370
+ return value .getFirst ();
371
+ }
372
+
373
+ @ Override
374
+ public List <Expr > getExprs () {
375
+ return value ;
376
+ }
377
+ }
378
+
214
379
public record ListExpr (List <Expr > value ) implements Expr {
215
380
public static ListExpr of (Expr ... value ) {
216
381
return new ListExpr (List .of (value ));
217
382
}
218
383
384
+ @ Override
385
+ public int size () {
386
+ return value ().size ();
387
+ }
388
+
389
+ @ Override
390
+ public Expr getFirst () {
391
+ return value .getFirst ();
392
+ }
393
+
394
+ @ Override
395
+ public List <Expr > getExprs () {
396
+ return value ;
397
+ }
219
398
}
220
399
221
400
public record NumberExpr (int value ) implements Expr {
222
401
public static NumberExpr of (int value ) {
223
402
return new NumberExpr (value );
224
403
}
404
+
405
+ @ Override
406
+ public int size () {
407
+ return 1 ;
408
+ }
409
+
410
+ @ Override
411
+ public Expr getFirst () {
412
+ return this ;
413
+ }
414
+
415
+ @ Override
416
+ public List <Expr > getExprs () {
417
+ return List .of (this );
418
+ }
225
419
}
226
420
227
421
public record VarExp (String var , int exp ) implements Expr {
228
422
public static VarExp of (String var , int exp ) {
229
423
return new VarExp (var , exp );
230
424
}
425
+
426
+ @ Override
427
+ public int size () {
428
+ return 1 ;
429
+ }
430
+
431
+ @ Override
432
+ public Expr getFirst () {
433
+ return this ;
434
+ }
435
+
436
+ @ Override
437
+ public List <Expr > getExprs () {
438
+ return List .of (this );
439
+ }
231
440
}
232
441
233
442
private Parser () {
0 commit comments