package gve.calc.formula;
public class OperatorAssign extends InfixBinaryOp {
private byte kind;
public static final byte UNION = 0;
public static final byte ASSIGN = 1;
public static final byte PLUS = 2;
private static String [] names = { "union=",":=","+=" };
public OperatorAssign(String name,Part l,Part r) {
super(l,r);
for (int i = names.length-1; i>=0; i--) {
if (names[i].equals(name)) {
kind = (byte)i;
break;
}
}
}
public String getName() { return names[kind]; }
public int getPri() { return 600; }
public int getLeftPri() { return 610; }
public int getRightPri() { return 590; }
public Part evaluate(Evaluator ev) {
Part righthand = right.evaluate(ev);
switch (kind) {
case UNION:
// PENDING: this code doesn't seem to work.
if (left instanceof Identifier) {
String name = ((Identifier)left).getString();
if (!(right instanceof Brackets)) {
System.out.println("rhs no set");
return null;
}
Brackets rhs = (Brackets)right;
if (rhs.getKind() != Brackets.CURLY) {
System.out.println("rhs no set");
return null;
}
Part lhs = ev.getValue(name);
if (!(lhs instanceof Brackets)) {
System.out.println("lhs no set");
return null;
}
if (((Brackets)lhs).getKind() != Brackets.CURLY) {
System.out.println("lhs no set");
return null;
}
Part rd = rhs.child;
Part newval = (Part)((Brackets)lhs).child.clone();
while (true) {
if (rd instanceof OperatorComma) {
OperatorComma comma = (OperatorComma)rd;
if (!OperatorComma.listContains(newval,comma.left)) {
newval = new OperatorComma((Part)comma.left.clone(),newval);
}
rd = comma.right;
continue;
}
if (!OperatorComma.listContains(newval,rd))
newval = new OperatorComma((Part)rd.clone(),newval);
break;
}
ev.setValue(name,newval);
} else System.out.println("Can't union= with lhs "+left);
break;
case ASSIGN:
if (left instanceof Identifier) {
String name = ((Identifier)left).getString();
Part newval = (Part)righthand.clone();
ev.setValue(name,newval);
return (Part)righthand.clone();
} else System.out.println("can't assign to "+left);
break;
case PLUS:
break;
}
return null;
}
}