@@ -11729,6 +11729,77 @@ public Expression jsfeatureAccess(Expression obj,
1172911729 }
1173011730 }
1173111731
11732+ if ("reduce".equals(feature) &&
11733+ obj.isSequence() &&
11734+ pars.size() > 1)
11735+ { // obj.reduce(f,init) is
11736+ // obj->iterate(_z; _acc = init | f(_z,_acc))
11737+
11738+ Expression fexpr = (Expression) pars.get(0);
11739+ Expression init = (Expression) pars.get(1);
11740+
11741+ Expression targ =
11742+ BasicExpression.newVariableBasicExpression("self");
11743+
11744+ String acc = Identifier.nextIdentifier("_acc");
11745+ String var = Identifier.nextIdentifier("_var");
11746+
11747+ BasicExpression varexpr =
11748+ BasicExpression.newVariableBasicExpression(var);
11749+
11750+ BasicExpression accexpr =
11751+ BasicExpression.newVariableBasicExpression(acc);
11752+
11753+ Expression rrhs =
11754+ Expression.simplifyApply2(
11755+ fexpr, varexpr, accexpr);
11756+
11757+ BinaryExpression iter =
11758+ new BinaryExpression("->iterate",
11759+ obj, rrhs);
11760+ iter.iteratorVariable = var;
11761+ Attribute accum = new Attribute(acc, init.getType(),
11762+ ModelElement.INTERNAL);
11763+ accum.setInitialExpression(init);
11764+ iter.accumulator = accum;
11765+ iter.setType(init.getType());
11766+ return iter;
11767+ }
11768+
11769+ if ("reduceRight".equals(feature) &&
11770+ obj.isSequence() &&
11771+ pars.size() > 1)
11772+ { // obj.reduceRight(f,init) is
11773+ // obj->reverse()->iterate(_z; _acc = init | f(_z,_acc))
11774+
11775+ Expression fexpr = (Expression) pars.get(0);
11776+ Expression init = (Expression) pars.get(1);
11777+
11778+ Expression targ =
11779+ BasicExpression.newVariableBasicExpression("self");
11780+
11781+ String acc = Identifier.nextIdentifier("_acc");
11782+ String var = Identifier.nextIdentifier("_var");
11783+
11784+ BasicExpression varexpr =
11785+ BasicExpression.newVariableBasicExpression(
11786+ "(" + acc + "," + var + ")");
11787+ Expression rrhs =
11788+ Expression.simplifyApply(
11789+ fexpr, varexpr);
11790+ Expression rev = new UnaryExpression("->reverse", obj);
11791+ BinaryExpression iter =
11792+ new BinaryExpression("->iterate",
11793+ rev, rrhs);
11794+ iter.iteratorVariable = var;
11795+ Attribute accum = new Attribute(acc, init.getType(),
11796+ ModelElement.INTERNAL);
11797+ accum.setInitialExpression(init);
11798+ iter.accumulator = accum;
11799+ iter.setType(init.getType());
11800+ return iter;
11801+ }
11802+
1173211803 if ("filter".equals(feature) &&
1173311804 obj.isSequence() &&
1173411805 pars.size() > 0)
@@ -22321,6 +22392,111 @@ else if ("NORM_PRIORITY".equals(e2 + ""))
2232122392 return "(" + e1x + " := " + qf + " ; " + e2x + ")";
2232222393 }
2232322394
22395+ if ("=".equals(op + "") && e1.hasSideEffect() &&
22396+ e2.hasSideEffect())
22397+ { // pre sideeffect of e1 ;
22398+ // pre sideeffect of e2 ;
22399+ // e1x := result of e2 ;
22400+ // post sideeffect of e1 -- the e1.toKM3()
22401+ // post sideeffect of e2 -- the e2.toKM3()
22402+
22403+ System.out.println(">>> Expression with side effects on LHS and RHS: " + this);
22404+
22405+ String prese1 = e1.preSideEffect();
22406+ Statement preStat1 = e1.statement;
22407+ String postse1 = e1.postSideEffect();
22408+ Statement postStat1 = e1.statement;
22409+
22410+ String prese = e2.preSideEffect();
22411+ Statement preStat = e2.statement;
22412+ String postse = e2.postSideEffect();
22413+ Statement postStat = e2.statement;
22414+
22415+ if (prese == null && prese1 == null &&
22416+ postse1 != null && postse != null)
22417+ { String qf = e2.queryForm();
22418+
22419+ String res = " " + e1x + " := " +
22420+ qf + " ;\n " + postse1 +
22421+ " ;\n " + postse;
22422+ Expression queryExp = e2.expression;
22423+ Expression lhs = e1.expression;
22424+ if (postStat != null && postStat1 != null &&
22425+ queryExp != null &&
22426+ lhs != null)
22427+ { SequenceStatement stat =
22428+ new SequenceStatement();
22429+ if ((lhs + "").equals(queryExp + "")) { }
22430+ else
22431+ { stat.addStatement(
22432+ new AssignStatement(lhs,queryExp));
22433+ }
22434+ stat.addStatement(postStat1);
22435+ stat.addStatement(postStat);
22436+ statement = stat;
22437+ }
22438+ return res;
22439+ }
22440+ else if (postse == null && postse1 == null)
22441+ { String qf1 = e1.queryForm();
22442+ String qf = e2.queryForm();
22443+
22444+ Expression queryExp = e2.expression;
22445+ Expression lhs = e1.expression;
22446+ if (preStat != null && preStat1 != null &&
22447+ queryExp != null &&
22448+ lhs != null)
22449+ { SequenceStatement stat =
22450+ new SequenceStatement();
22451+ stat.addStatement(preStat1);
22452+ stat.addStatement(preStat);
22453+ if ((lhs + "").equals(queryExp + "")) { }
22454+ else
22455+ { stat.addStatement(
22456+ new AssignStatement(lhs,queryExp));
22457+ }
22458+ statement = stat;
22459+ }
22460+
22461+ return prese1 + " ; " + prese + " ;" +
22462+ "\n " + qf1 + " := " + qf;
22463+ }
22464+ else
22465+ { String qf = e2.queryForm();
22466+
22467+ Expression queryExp = e2.expression;
22468+ Expression lhs = e1.expression;
22469+ if (queryExp != null &&
22470+ lhs != null)
22471+ { SequenceStatement stat =
22472+ new SequenceStatement();
22473+
22474+ if (preStat1 != null)
22475+ { stat.addStatement(preStat1); }
22476+
22477+ if (preStat != null)
22478+ { stat.addStatement(preStat); }
22479+
22480+ if ((lhs + "").equals(queryExp + "")) { }
22481+ else
22482+ { stat.addStatement(
22483+ new AssignStatement(lhs,queryExp));
22484+ }
22485+
22486+ if (postStat1 != null)
22487+ { stat.addStatement(postStat1); }
22488+
22489+ if (postStat != null)
22490+ { stat.addStatement(postStat); }
22491+
22492+ statement = stat;
22493+ }
22494+
22495+ return prese1 + " ; " + prese + " ;" +
22496+ "\n " + e1x + " := " + qf + " ;\n " + postse1 + " ; " + postse;
22497+ }
22498+ }
22499+
2232422500 if ("=".equals(op + "") && e2.hasSideEffect())
2232522501 { // pre sideeffect of e2 ;
2232622502 // e1x := result of e2 ;
@@ -22400,6 +22576,88 @@ else if (postse == null)
2240022576 }
2240122577 }
2240222578
22579+ if ("=".equals(op + "") && e1.hasSideEffect())
22580+ { // pre sideeffect of e1 ;
22581+ // e1x := result of e1 ;
22582+ // post sideeffect of e1 -- the e1.toKM3()
22583+
22584+ System.out.println(">>> Expression with side effect: " + this);
22585+
22586+ String prese = e1.preSideEffect();
22587+ Statement preStat = e1.statement;
22588+ String postse = e1.postSideEffect();
22589+ Statement postStat = e1.statement;
22590+
22591+ if (prese == null && postse != null)
22592+ { String qf1 = e1.queryForm();
22593+ String qf = e2.queryForm();
22594+
22595+ String res = " " + qf1 + " := " +
22596+ qf + " ;\n " + postse;
22597+ Expression queryExp = e2.expression;
22598+ Expression lhs = e1.expression;
22599+ if (postStat != null && queryExp != null &&
22600+ lhs != null)
22601+ { SequenceStatement stat =
22602+ new SequenceStatement();
22603+ if ((lhs + "").equals(queryExp + "")) { }
22604+ else
22605+ { stat.addStatement(
22606+ new AssignStatement(lhs,queryExp));
22607+ }
22608+ stat.addStatement(postStat);
22609+ statement = stat;
22610+ }
22611+ return res;
22612+ }
22613+ else if (postse == null)
22614+ { String qf1 = e1.queryForm();
22615+ String qf = e2.queryForm();
22616+
22617+ Expression queryExp = e2.expression;
22618+ Expression lhs = e1.expression;
22619+ if (preStat != null && queryExp != null &&
22620+ lhs != null)
22621+ { SequenceStatement stat =
22622+ new SequenceStatement();
22623+ stat.addStatement(preStat);
22624+ if ((lhs + "").equals(queryExp + "")) { }
22625+ else
22626+ { stat.addStatement(
22627+ new AssignStatement(lhs,queryExp));
22628+ }
22629+ statement = stat;
22630+ }
22631+
22632+ return prese + " ;" +
22633+ "\n " + qf1 + " := " + qf;
22634+ }
22635+ else
22636+ { String qf1 = e1.queryForm();
22637+ String qf = e2.queryForm();
22638+
22639+ Expression queryExp = e2.expression;
22640+ Expression lhs = e1.expression;
22641+ if (preStat != null &&
22642+ postStat != null && queryExp != null &&
22643+ lhs != null)
22644+ { SequenceStatement stat =
22645+ new SequenceStatement();
22646+ stat.addStatement(preStat);
22647+ if ((lhs + "").equals(queryExp + "")) { }
22648+ else
22649+ { stat.addStatement(
22650+ new AssignStatement(lhs,queryExp));
22651+ }
22652+ stat.addStatement(postStat);
22653+ statement = stat;
22654+ }
22655+
22656+ return prese + " ;" +
22657+ "\n " + qf1 + " := " + qf + " ;\n " + postse;
22658+ }
22659+ }
22660+
2240322661 if ("=".equals(op + ""))
2240422662 { if (e1.expression != null && e2.expression != null)
2240522663 { statement =
0 commit comments