Warning: session_start(): open(/var/lib/php/sessions/sess_nt445rcq13drc5812li8k82ut6, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
/* e.g.
overlay <- ScreenOverlay
bounds <- rightScreenBounds
overlay bounds bounds
overlay show
*/
sclass GazelleV_LeftArrowScriptParser > SimpleLeftToRightParser {
new Script script;
new LinkedHashSet knownVars;
// object can be a class
srecord MethodOnObject(O object, S method) {}
interface Evaluable {
public O get(VarContext ctx);
}
sclass Script extends ArrayList {
void run(VarContext ctx) {
main forEach(this, step -> step.get(ctx));
}
}
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;
}
}
srecord noeq NewObject(Class c) is Evaluable {
public O get(VarContext ctx) {
ret callConstructor(c);
}
}
srecord noeq GetVar(S var) is Evaluable {
public O get(VarContext ctx) {
ret ctx.get(var);
}
}
srecord noeq Const(O value) is Evaluable {
public O get(VarContext ctx) {
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)));
}
}
Script parse() {
while (mainLoop()) {
S t = token();
if (isIdentifier(t) && eq(token(1), "<") && eq(token(2), "-")) {
next(3);
script.add(new Assignment(t, parseExpr()));
knownVars.add(t);
} else
script.add(parseExpr());
}
ret script;
}
Evaluable parseExpr() {
if (atEndOrLineBreak()) null;
S t = tpp();
if (knownVars.contains(t))
ret parseCall(new GetVar(t));
O o = findExternalObject(t);
if (o == null)
fail("Unknown object: " + o);
else if (o cast Class)
ret new NewObject(o);
else if (o cast MethodOnObject)
ret new CallMethod(new Const(o.object), o.method, parseExpressions());
else
ret parseCall(new Const(o));
}
L parseExpressions() {
ret collectWhileNotNull(-> parseExpr());
}
Evaluable parseCall(Evaluable target) {
if (atEndOrLineBreak()) ret target;
S methodName = tpp();
var args = parseExpressions();
ret new CallMethod(target, methodName, args);
}
// can return MethodOnObject
swappable O findExternalObject(S name) { null; }
}