88import java .io .InputStreamReader ;
99import java .io .PushbackReader ;
1010import java .util .ArrayList ;
11+ import java .util .Arrays ;
1112import java .util .List ;
1213import java .util .Objects ;
1314import 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 ;
1520
1621public final class Parser {
1722
@@ -111,7 +116,7 @@ public static ListToken parse(String s) {
111116 }
112117 }
113118
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 {
115120 int size ();
116121
117122 Token getFirst ();
@@ -198,43 +203,26 @@ public static Polynomial eval(ListToken token) {
198203
199204 private static Polynomial _eval (Token exprs ) {
200205 return switch (exprs ) {
201- case PlusListToken listExpr -> {
206+ case HeadToken listExpr -> {
202207 if (listExpr .value .size () == 1 ) {
203208 yield _eval (listExpr .value ().getFirst ());
204209 }
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 ;
212217 }
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 ;
233224 }
234- Polynomial p = _eval (exp );
235- result = result .multiply (p );
236- }
237- yield result ;
225+ };
238226 }
239227 case VarExp varExp -> new Monomial (varExp .factor , varExp .exp ).polynomial ();
240228 default -> throw new IllegalStateException (exprs .toString ());
@@ -258,75 +246,50 @@ private static boolean isMinus(Token token) {
258246 return token instanceof MinusToken ;
259247 }
260248
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 );
264252 }
253+ }
265254
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 ;
268261 }
269262
270263 @ Override
271264 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 );
294266 }
267+ }
295268
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 ) );
299272 }
300273
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 ));
304276 }
305277
306278 @ 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 + " " , ")" ));
315281 }
316- }
317282
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 ));
321285 }
322286
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 ));
326289 }
327290
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 ( ));
330293 }
331294
332295 public void add (Token token ) {
@@ -351,6 +314,14 @@ public Token getFirst() {
351314 public List <Token > getExprs () {
352315 return value ;
353316 }
317+
318+ void clear () {
319+ value .clear ();
320+ }
321+
322+ HeadToken copy () {
323+ return new HeadToken (head , List .copyOf (value ));
324+ }
354325 }
355326
356327 public record ListToken (List <Token > value ) implements Token {
0 commit comments