2015-06-23 17:23:32 +03:00
|
|
|
package com.annimon.ownlang.parser.ast;
|
|
|
|
|
|
|
|
import com.annimon.ownlang.lib.ArrayValue;
|
|
|
|
import com.annimon.ownlang.lib.Value;
|
|
|
|
import com.annimon.ownlang.lib.Variables;
|
2015-06-27 13:58:02 +03:00
|
|
|
import java.util.List;
|
2015-06-23 17:23:32 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @author aNNiMON
|
|
|
|
*/
|
|
|
|
public final class ArrayAccessExpression implements Expression {
|
|
|
|
|
2015-06-29 20:50:59 +03:00
|
|
|
public final String variable;
|
|
|
|
public final List<Expression> indices;
|
2015-06-23 17:23:32 +03:00
|
|
|
|
2015-06-27 13:58:02 +03:00
|
|
|
public ArrayAccessExpression(String variable, List<Expression> indices) {
|
2015-06-23 17:23:32 +03:00
|
|
|
this.variable = variable;
|
2015-06-27 13:58:02 +03:00
|
|
|
this.indices = indices;
|
2015-06-23 17:23:32 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Value eval() {
|
2015-06-27 13:58:02 +03:00
|
|
|
return getArray().get(lastIndex());
|
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayValue getArray() {
|
|
|
|
ArrayValue array = consumeArray(Variables.get(variable));
|
|
|
|
final int last = indices.size() - 1;
|
|
|
|
for (int i = 0; i < last; i++) {
|
|
|
|
array = consumeArray( array.get(index(i)) );
|
|
|
|
}
|
|
|
|
return array;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int lastIndex() {
|
|
|
|
return index(indices.size() - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
private int index(int index) {
|
|
|
|
return (int) indices.get(index).eval().asNumber();
|
|
|
|
}
|
|
|
|
|
|
|
|
private ArrayValue consumeArray(Value value) {
|
|
|
|
if (value instanceof ArrayValue) {
|
|
|
|
return (ArrayValue) value;
|
2015-06-23 17:23:32 +03:00
|
|
|
} else {
|
|
|
|
throw new RuntimeException("Array expected");
|
|
|
|
}
|
|
|
|
}
|
2015-06-29 20:50:59 +03:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void accept(Visitor visitor) {
|
|
|
|
visitor.visit(this);
|
|
|
|
}
|
2015-06-23 17:23:32 +03:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
2015-06-27 13:58:02 +03:00
|
|
|
return variable + indices;
|
2015-06-23 17:23:32 +03:00
|
|
|
}
|
|
|
|
}
|