8
8
import java .io .InputStreamReader ;
9
9
import java .io .PushbackReader ;
10
10
import java .util .ArrayList ;
11
+ import java .util .Arrays ;
11
12
import java .util .List ;
12
13
import java .util .Objects ;
13
14
import java .util .stream .Collectors ;
14
- import java .util .stream .IntStream ;
15
+
16
+ import static io .polypen .Polynomial .ONE ;
17
+ import static io .polypen .Polynomial .ZERO ;
18
+ import static io .polypen .parse .Parser .Symbol .M ;
19
+ import static io .polypen .parse .Parser .Symbol .P ;
15
20
16
21
public final class Parser {
17
22
@@ -111,7 +116,7 @@ public static ListToken parse(String s) {
111
116
}
112
117
}
113
118
114
- public sealed interface Token permits PlusToken , MinusToken , MultToken , ListToken , VarExp , PlusListToken , MultListToken {
119
+ public sealed interface Token permits PlusToken , MinusToken , MultToken , ListToken , VarExp , HeadToken {
115
120
int size ();
116
121
117
122
Token getFirst ();
@@ -198,43 +203,26 @@ public static Polynomial eval(ListToken token) {
198
203
199
204
private static Polynomial _eval (Token exprs ) {
200
205
return switch (exprs ) {
201
- case PlusListToken listExpr -> {
206
+ case HeadToken listExpr -> {
202
207
if (listExpr .value .size () == 1 ) {
203
208
yield _eval (listExpr .value ().getFirst ());
204
209
}
205
- if ( exprs . size () == 1 ) {
206
- yield _eval ( exprs . getFirst ());
207
- }
208
- Polynomial result = Polynomial . ZERO ;
209
- for ( Token exp : exprs . getExprs ()) {
210
- if ( isMinus ( exp )) {
211
- continue ;
210
+ yield switch ( listExpr . head ) {
211
+ case P -> {
212
+ Polynomial result = ZERO ;
213
+ for ( Token exp : exprs . getExprs ()) {
214
+ result = result . add ( _eval ( exp ));
215
+ }
216
+ yield result ;
212
217
}
213
- if (isPlus (exp )) {
214
- continue ;
215
- }
216
- Polynomial p = _eval (exp );
217
- result = result .add (p );
218
- }
219
- yield result ;
220
- }
221
- case MultListToken listExpr -> {
222
- if (listExpr .value .size () == 1 ) {
223
- yield _eval (listExpr .value ().getFirst ());
224
- }
225
- if (exprs .size () == 1 ) {
226
- yield _eval (exprs .getFirst ());
227
- }
228
- Polynomial result ;
229
- result = Polynomial .ONE ;
230
- for (Token exp : exprs .getExprs ()) {
231
- if (isOperator (exp )) {
232
- continue ;
218
+ case M -> {
219
+ Polynomial result = ONE ;
220
+ for (Token exp : exprs .getExprs ()) {
221
+ result = result .multiply (_eval (exp ));
222
+ }
223
+ yield result ;
233
224
}
234
- Polynomial p = _eval (exp );
235
- result = result .multiply (p );
236
- }
237
- yield result ;
225
+ };
238
226
}
239
227
case VarExp varExp -> new Monomial (varExp .factor , varExp .exp ).polynomial ();
240
228
default -> throw new IllegalStateException (exprs .toString ());
@@ -258,75 +246,50 @@ private static boolean isMinus(Token token) {
258
246
return token instanceof MinusToken ;
259
247
}
260
248
261
- public record MultListToken (List <Token > value ) implements Token {
262
- public static MultListToken create ( int capacity ) {
263
- return new MultListToken ( new ArrayList <>( capacity ) );
249
+ private static void addIfNotOperator (List <Token > tokens , Token token ) {
250
+ if (! isOperator ( token ) ) {
251
+ tokens . add ( token );
264
252
}
253
+ }
265
254
266
- public static MultListToken of (Token ... value ) {
267
- return new MultListToken (List .of (value ));
255
+ enum Symbol {
256
+ P ('+' ), M ('*' );
257
+ final char c ;
258
+
259
+ Symbol (char c ) {
260
+ this .c = c ;
268
261
}
269
262
270
263
@ Override
271
264
public String toString () {
272
- return value .stream ().map (Objects ::toString ).collect (Collectors .joining (" " , "(* " , ")" ));
273
- }
274
-
275
- public static MultListToken of (int ... value ) {
276
- List <Token > list = IntStream .of (value ).mapToObj (value1 -> VarExp .constant (value1 )).map (s -> (Token ) s ).toList ();
277
- return new MultListToken (list );
278
- }
279
-
280
- public void add (Token token ) {
281
- addIfNotOperator (value , token );
282
- }
283
-
284
- public MultListToken copy () {
285
- return new MultListToken (List .copyOf (value ));
286
- }
287
-
288
- public void clear () {
289
- value .clear ();
290
- }
291
-
292
- public boolean isEmpty () {
293
- return value .isEmpty ();
265
+ return Character .toString (c );
294
266
}
267
+ }
295
268
296
- @ Override
297
- public int size ( ) {
298
- return value (). size ( );
269
+ public record HeadToken ( Symbol head , List < Token > value ) implements Token {
270
+ public static HeadToken createPlus ( int capacity ) {
271
+ return new HeadToken ( P , new ArrayList <>( capacity ) );
299
272
}
300
273
301
- @ Override
302
- public Token getFirst () {
303
- return value .getFirst ();
274
+ public static HeadToken createMult (int capacity ) {
275
+ return new HeadToken (M , new ArrayList <>(capacity ));
304
276
}
305
277
306
278
@ Override
307
- public List <Token > getExprs () {
308
- return value ;
309
- }
310
- }
311
-
312
- private static void addIfNotOperator (List <Token > tokens , Token token ) {
313
- if (!isOperator (token )) {
314
- tokens .add (token );
279
+ public String toString () {
280
+ return value .stream ().map (Objects ::toString ).collect (Collectors .joining (" " , "(" + head + " " , ")" ));
315
281
}
316
- }
317
282
318
- public record PlusListToken (List <Token > value ) implements Token {
319
- public static PlusListToken create (int capacity ) {
320
- return new PlusListToken (new ArrayList <>(capacity ));
283
+ public static HeadToken ofPlus (Token ... value ) {
284
+ return new HeadToken (P , List .of (value ));
321
285
}
322
286
323
- @ Override
324
- public String toString () {
325
- return value .stream ().map (Objects ::toString ).collect (Collectors .joining (" " , "(+ " , ")" ));
287
+ public static HeadToken ofMult (Token ... value ) {
288
+ return new HeadToken (M , List .of (value ));
326
289
}
327
290
328
- public static PlusListToken of ( Token ... value ) {
329
- return new PlusListToken ( List . of (value ));
291
+ public static HeadToken ofMult ( int ... value ) {
292
+ return new HeadToken ( M , Arrays . stream (value ). mapToObj ( VarExp :: constant ). map ( t -> ( Token ) t ). toList ( ));
330
293
}
331
294
332
295
public void add (Token token ) {
@@ -351,6 +314,14 @@ public Token getFirst() {
351
314
public List <Token > getExprs () {
352
315
return value ;
353
316
}
317
+
318
+ void clear () {
319
+ value .clear ();
320
+ }
321
+
322
+ HeadToken copy () {
323
+ return new HeadToken (head , List .copyOf (value ));
324
+ }
354
325
}
355
326
356
327
public record ListToken (List <Token > value ) implements Token {
0 commit comments