ContainerAccessExpression теперь работает с Expression

This commit is contained in:
Victor 2016-07-31 12:48:17 +03:00
parent 55d892727d
commit 06fe09ce98
6 changed files with 30 additions and 16 deletions

View File

@ -10,14 +10,28 @@ import java.util.List;
*/
public final class ContainerAccessExpression implements Expression, Accessible {
public final String variable;
public final Expression root;
public final List<Expression> indices;
private boolean rootIsVariable;
public ContainerAccessExpression(String variable, List<Expression> indices) {
this.variable = variable;
this(new VariableExpression(variable), indices);
}
public ContainerAccessExpression(Expression root, List<Expression> indices) {
rootIsVariable = root instanceof VariableExpression;
this.root = root;
this.indices = indices;
}
public boolean rootIsVariable() {
return rootIsVariable;
}
public Expression getRoot() {
return root;
}
@Override
public Value eval() {
return get();
@ -60,7 +74,7 @@ public final class ContainerAccessExpression implements Expression, Accessible {
}
public Value getContainer() {
Value container = Variables.get(variable);
Value container = root.eval();
final int last = indices.size() - 1;
for (int i = 0; i < last; i++) {
final Value index = index(i);
@ -108,6 +122,6 @@ public final class ContainerAccessExpression implements Expression, Accessible {
@Override
public String toString() {
return variable + indices;
return root.toString() + indices;
}
}

View File

@ -87,8 +87,10 @@ public abstract class OptimizationVisitor<T> implements ResultVisitor<Node, T> {
@Override
public Node visit(ContainerAccessExpression s, T t) {
final Node root = s.root.accept(this, t);
boolean changed = (root != s.root);
final List<Expression> indices = new ArrayList<>(s.indices.size());
boolean changed = false;
for (Expression expression : s.indices) {
final Node node = expression.accept(this, t);
if (node != expression) {
@ -97,7 +99,7 @@ public abstract class OptimizationVisitor<T> implements ResultVisitor<Node, T> {
indices.add((Expression) node);
}
if (changed) {
return new ContainerAccessExpression(s.variable, indices);
return new ContainerAccessExpression((Expression) root, indices);
}
return s;
}

View File

@ -100,8 +100,11 @@ public class VariablesGrabber extends OptimizationVisitor<Map<String, VariableIn
t.put(variableName, variableInfo(t, variableName));
}
if (s.expr1 instanceof ContainerAccessExpression) {
final String variableName = ((ContainerAccessExpression) s.expr1).variable;
t.put(variableName, variableInfo(t, variableName));
ContainerAccessExpression conExpr = (ContainerAccessExpression) s.expr1;
if (conExpr.rootIsVariable()) {
final String variableName = ((VariableExpression) conExpr.root).name;
t.put(variableName, variableInfo(t, variableName));
}
}
}
return super.visit(s, t);

View File

@ -47,6 +47,7 @@ public abstract class AbstractVisitor implements Visitor {
@Override
public void visit(ContainerAccessExpression s) {
s.root.accept(this);
for (Expression index : s.indices) {
index.accept(this);
}

View File

@ -88,7 +88,7 @@ public class PrintVisitor implements ResultVisitor<StringBuilder, StringBuilder>
@Override
public StringBuilder visit(ContainerAccessExpression s, StringBuilder t) {
visitVariable(s.variable, t);
s.root.accept(this, t);
for (Expression index : s.indices) {
t.append('[');
index.accept(this, t);

View File

@ -15,12 +15,6 @@ public final class VariablePrinter extends AbstractVisitor {
Console.println(s.target);
}
@Override
public void visit(ContainerAccessExpression s) {
super.visit(s);
Console.println(s.variable);
}
@Override
public void visit(VariableExpression s) {
super.visit(s);