From 06fe09ce98f3820cc7d1e4e7b5384f58d5c873bd Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 31 Jul 2016 12:48:17 +0300 Subject: [PATCH] =?UTF-8?q?ContainerAccessExpression=20=D1=82=D0=B5=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D1=81=20Expression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parser/ast/ContainerAccessExpression.java | 24 +++++++++++++++---- .../optimization/OptimizationVisitor.java | 6 +++-- .../parser/optimization/VariablesGrabber.java | 7 ++++-- .../parser/visitors/AbstractVisitor.java | 1 + .../ownlang/parser/visitors/PrintVisitor.java | 2 +- .../parser/visitors/VariablePrinter.java | 6 ----- 6 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/annimon/ownlang/parser/ast/ContainerAccessExpression.java b/src/main/java/com/annimon/ownlang/parser/ast/ContainerAccessExpression.java index 3526610..794b842 100644 --- a/src/main/java/com/annimon/ownlang/parser/ast/ContainerAccessExpression.java +++ b/src/main/java/com/annimon/ownlang/parser/ast/ContainerAccessExpression.java @@ -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 indices; + private boolean rootIsVariable; public ContainerAccessExpression(String variable, List indices) { - this.variable = variable; + this(new VariableExpression(variable), indices); + } + + public ContainerAccessExpression(Expression root, List 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; } } diff --git a/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java b/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java index 399bd21..46696ad 100644 --- a/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java +++ b/src/main/java/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java @@ -87,8 +87,10 @@ public abstract class OptimizationVisitor implements ResultVisitor { @Override public Node visit(ContainerAccessExpression s, T t) { + final Node root = s.root.accept(this, t); + boolean changed = (root != s.root); + final List 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 implements ResultVisitor { indices.add((Expression) node); } if (changed) { - return new ContainerAccessExpression(s.variable, indices); + return new ContainerAccessExpression((Expression) root, indices); } return s; } diff --git a/src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java b/src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java index cd4e2a1..7ea484e 100644 --- a/src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java +++ b/src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java @@ -100,8 +100,11 @@ public class VariablesGrabber extends OptimizationVisitor @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); diff --git a/src/main/java/com/annimon/ownlang/parser/visitors/VariablePrinter.java b/src/main/java/com/annimon/ownlang/parser/visitors/VariablePrinter.java index 4f29f3a..ed2b6e2 100644 --- a/src/main/java/com/annimon/ownlang/parser/visitors/VariablePrinter.java +++ b/src/main/java/com/annimon/ownlang/parser/visitors/VariablePrinter.java @@ -14,12 +14,6 @@ public final class VariablePrinter extends AbstractVisitor { super.visit(s); Console.println(s.target); } - - @Override - public void visit(ContainerAccessExpression s) { - super.visit(s); - Console.println(s.variable); - } @Override public void visit(VariableExpression s) {