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 class ContainerAccessExpression implements Expression, Accessible {
public final String variable; public final Expression root;
public final List<Expression> indices; public final List<Expression> indices;
private boolean rootIsVariable;
public ContainerAccessExpression(String variable, List<Expression> indices) { 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; this.indices = indices;
} }
public boolean rootIsVariable() {
return rootIsVariable;
}
public Expression getRoot() {
return root;
}
@Override @Override
public Value eval() { public Value eval() {
return get(); return get();
@ -60,7 +74,7 @@ public final class ContainerAccessExpression implements Expression, Accessible {
} }
public Value getContainer() { public Value getContainer() {
Value container = Variables.get(variable); Value container = root.eval();
final int last = indices.size() - 1; final int last = indices.size() - 1;
for (int i = 0; i < last; i++) { for (int i = 0; i < last; i++) {
final Value index = index(i); final Value index = index(i);
@ -108,6 +122,6 @@ public final class ContainerAccessExpression implements Expression, Accessible {
@Override @Override
public String toString() { 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 @Override
public Node visit(ContainerAccessExpression s, T t) { 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()); final List<Expression> indices = new ArrayList<>(s.indices.size());
boolean changed = false;
for (Expression expression : s.indices) { for (Expression expression : s.indices) {
final Node node = expression.accept(this, t); final Node node = expression.accept(this, t);
if (node != expression) { if (node != expression) {
@ -97,7 +99,7 @@ public abstract class OptimizationVisitor<T> implements ResultVisitor<Node, T> {
indices.add((Expression) node); indices.add((Expression) node);
} }
if (changed) { if (changed) {
return new ContainerAccessExpression(s.variable, indices); return new ContainerAccessExpression((Expression) root, indices);
} }
return s; return s;
} }

View File

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

View File

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

View File

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

View File

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