mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
ContainerAccessExpression теперь работает с Expression
This commit is contained in:
parent
55d892727d
commit
06fe09ce98
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -100,10 +100,13 @@ 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;
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user