Skip to content

Commit fb96c6e

Browse files
authored
Added "From JavaScript" option
1 parent 42910d2 commit fb96c6e

17 files changed

+779
-22
lines changed

ASTCompositeTerm.java

Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 =

AttributeMatching.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,10 @@ public String toCSTL(String category, Expression cond,
171171
CGRule rle = new CGRule(rulelhs, rulerhs);
172172
Vector vars = rle.getVariables();
173173
if (cond != null && vars.size() > 0)
174-
{ CGCondition cc = new CGCondition(cond);
175-
rle.addCondition(cc);
174+
{ CGCondition cc =
175+
CGCondition.newCGCondition(category,cond,vars);
176+
if (cc != null)
177+
{ rle.addCondition(cc); }
176178
}
177179

178180
cg.addCategoryRuleInOrder(category,rle);

BinaryExpression.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -938,13 +938,28 @@ public String toString()
938938
{ String basicString =
939939
left + " " + operator + " " + right;
940940

941-
if ("let".equals(operator) && accumulator != null)
941+
if ("let".equals(operator) &&
942+
accumulator != null)
942943
{ String res = "let " + accumulator.getName() + " : " + accumulator.getType() + " = " + left + " in (" + right + ")";
943944
if (needsBracket)
944945
{ return "(" + res + ")"; }
945946
return res;
946947
}
947948

949+
if ("->iterate".equals(operator) &&
950+
iteratorVariable != null && accumulator != null)
951+
{ String rangestring = "" + left;
952+
if (left.needsBracket)
953+
{ rangestring = "(" + rangestring + ")"; }
954+
955+
String res = rangestring + "->iterate(" +
956+
iteratorVariable + "; " +
957+
accumulator.getName() + " = " +
958+
accumulator.getInitialExpression() +
959+
" | " + right + ")";
960+
return res;
961+
}
962+
948963
if (operator.equals("#"))
949964
{ Expression range = ((BinaryExpression) left).right;
950965
String rangestring = "" + range;
@@ -3064,6 +3079,40 @@ public boolean typeCheck(final Vector types,
30643079
return true;
30653080
}
30663081

3082+
if (operator.equals("->iterate") &&
3083+
iteratorVariable != null &&
3084+
accumulator != null)
3085+
{ boolean lrt = left.typeCheck(types,entities,contexts,env);
3086+
context.addAll(contexts);
3087+
Expression init = accumulator.getInitialExpression();
3088+
// assumed non-null
3089+
3090+
if (init != null)
3091+
{ init.typeCheck(types,entities,context,env); }
3092+
3093+
Attribute itvar =
3094+
new Attribute(iteratorVariable, left.getElementType(),
3095+
ModelElement.INTERNAL);
3096+
Vector env1 = new Vector();
3097+
env1.addAll(env);
3098+
env1.add(itvar);
3099+
env1.add(accumulator);
3100+
boolean rtc = right.typeCheck(types,entities,context,env1);
3101+
3102+
if (init != null)
3103+
{ type = init.getType();
3104+
elementType = init.getElementType();
3105+
}
3106+
else
3107+
{ type = right.getType();
3108+
elementType = right.getElementType();
3109+
}
3110+
3111+
3112+
System.out.println(">>> Typechecked ->iterate expression: " + lrt + " " + rtc + " " + type);
3113+
return true;
3114+
}
3115+
30673116

30683117
if (operator.equals("#") || operator.equals("#1") || operator.equals("#LC") || operator.equals("!"))
30693118
{ BinaryExpression lexp = (BinaryExpression) left;

0 commit comments

Comments
 (0)