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 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user