/* e.g. overlay <- ScreenOverlay bounds <- rightScreenBounds overlay bounds bounds overlay show */ sclass GazelleV_LeftArrowScript > SimpleLeftToRightParser { interface Evaluable { public O get(VarContext ctx default new); } // We're using SynchronizedList as a list wrapper //sclass Script extends ArrayList { sclass Script extends SynchronizedList is Evaluable { *() { super(new L); } public O get(VarContext ctx) { O result = null; for (step : this) result = step.get(ctx); ret result; } toString { ret pnlToLines(this); } } srecord noeq Assignment(S var, Evaluable expression) is Evaluable { public O get(VarContext ctx) { O o = expression.get(ctx); ctx.set(var, o); ret o; } toString { ret var + " <- " + expression; } } srecord noeq NewObject(Class c) is Evaluable { public O get(VarContext ctx) { ret callConstructor(c); } toString { ret "new " + className(c); } } srecord noeq GetVar(S var) is Evaluable { public O get(VarContext ctx) { ret ctx.get(var); } toString { ret var; } } srecord noeq Const(O value) is Evaluable { public O get(VarContext ctx) { ret strOrClassName(value); } toString { ret value; } } srecord CallMethod(Evaluable target, S methodName, L args) is Evaluable { public O get(VarContext ctx) { ret call(target.get(ctx), methodName, mapToArray(args, arg -> arg.get(ctx))); } toString { ret target + "." + formatFunctionCall(methodName, args); } } }