From ebed6c56d2c1c2c0b26c856d431c69ad92128599 Mon Sep 17 00:00:00 2001 From: Victor Date: Mon, 29 Jun 2015 20:50:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D1=80=D0=BE=D0=BA=2013.=20=D0=A8=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BD=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=C2=AB=D0=9F?= =?UTF-8?q?=D0=BE=D1=81=D0=B5=D1=82=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/ownlang/Main.java | 8 +- .../parser/ast/ArrayAccessExpression.java | 9 +- .../parser/ast/ArrayAssignmentStatement.java | 9 +- .../ownlang/parser/ast/ArrayExpression.java | 7 +- .../parser/ast/AssignmentStatement.java | 9 +- .../ownlang/parser/ast/BinaryExpression.java | 9 +- .../ownlang/parser/ast/BlockStatement.java | 7 +- .../ownlang/parser/ast/BreakStatement.java | 5 + .../parser/ast/ConditionalExpression.java | 9 +- .../ownlang/parser/ast/ContinueStatement.java | 5 + .../ownlang/parser/ast/DoWhileStatement.java | 9 +- .../ownlang/parser/ast/Expression.java | 2 +- .../ownlang/parser/ast/ForStatement.java | 13 +- .../parser/ast/FunctionDefineStatement.java | 11 +- .../ownlang/parser/ast/FunctionStatement.java | 7 +- .../parser/ast/FunctionalExpression.java | 11 +- .../ownlang/parser/ast/IfStatement.java | 9 +- src/com/annimon/ownlang/parser/ast/Node.java | 10 ++ .../ownlang/parser/ast/PrintStatement.java | 7 +- .../ownlang/parser/ast/ReturnStatement.java | 7 +- .../annimon/ownlang/parser/ast/Statement.java | 2 +- .../ownlang/parser/ast/UnaryExpression.java | 11 +- .../ownlang/parser/ast/ValueExpression.java | 7 +- .../parser/ast/VariableExpression.java | 7 +- .../annimon/ownlang/parser/ast/Visitor.java | 30 ++++ .../ownlang/parser/ast/WhileStatement.java | 9 +- .../parser/visitors/AbstractVisitor.java | 132 ++++++++++++++++++ .../parser/visitors/AssignValidator.java | 19 +++ .../parser/visitors/FunctionAdder.java | 16 +++ .../parser/visitors/VariablePrinter.java | 28 ++++ visitor.own | 5 + 31 files changed, 390 insertions(+), 39 deletions(-) create mode 100644 src/com/annimon/ownlang/parser/ast/Node.java create mode 100644 src/com/annimon/ownlang/parser/ast/Visitor.java create mode 100644 src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java create mode 100644 src/com/annimon/ownlang/parser/visitors/AssignValidator.java create mode 100644 src/com/annimon/ownlang/parser/visitors/FunctionAdder.java create mode 100644 src/com/annimon/ownlang/parser/visitors/VariablePrinter.java create mode 100644 visitor.own diff --git a/src/com/annimon/ownlang/Main.java b/src/com/annimon/ownlang/Main.java index 285df0b..5b1d950 100644 --- a/src/com/annimon/ownlang/Main.java +++ b/src/com/annimon/ownlang/Main.java @@ -4,6 +4,9 @@ import com.annimon.ownlang.parser.Lexer; import com.annimon.ownlang.parser.Parser; import com.annimon.ownlang.parser.Token; import com.annimon.ownlang.parser.ast.Statement; +import com.annimon.ownlang.parser.visitors.AssignValidator; +import com.annimon.ownlang.parser.visitors.FunctionAdder; +import com.annimon.ownlang.parser.visitors.VariablePrinter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -15,7 +18,7 @@ import java.util.List; public final class Main { public static void main(String[] args) throws IOException { - final String input = new String( Files.readAllBytes(Paths.get("program.own")), "UTF-8"); + final String input = new String( Files.readAllBytes(Paths.get("visitor.own")), "UTF-8"); final List tokens = new Lexer(input).tokenize(); for (Token token : tokens) { System.out.println(token); @@ -23,6 +26,9 @@ public final class Main { final Statement program = new Parser(tokens).parse(); System.out.println(program.toString()); + program.accept(new FunctionAdder()); + program.accept(new VariablePrinter()); + program.accept(new AssignValidator()); program.execute(); } } diff --git a/src/com/annimon/ownlang/parser/ast/ArrayAccessExpression.java b/src/com/annimon/ownlang/parser/ast/ArrayAccessExpression.java index d71e09b..10bba7f 100644 --- a/src/com/annimon/ownlang/parser/ast/ArrayAccessExpression.java +++ b/src/com/annimon/ownlang/parser/ast/ArrayAccessExpression.java @@ -11,8 +11,8 @@ import java.util.List; */ public final class ArrayAccessExpression implements Expression { - private final String variable; - private final List indices; + public final String variable; + public final List indices; public ArrayAccessExpression(String variable, List indices) { this.variable = variable; @@ -48,6 +48,11 @@ public final class ArrayAccessExpression implements Expression { throw new RuntimeException("Array expected"); } } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/ArrayAssignmentStatement.java b/src/com/annimon/ownlang/parser/ast/ArrayAssignmentStatement.java index 29e6820..14f4439 100644 --- a/src/com/annimon/ownlang/parser/ast/ArrayAssignmentStatement.java +++ b/src/com/annimon/ownlang/parser/ast/ArrayAssignmentStatement.java @@ -6,8 +6,8 @@ package com.annimon.ownlang.parser.ast; */ public final class ArrayAssignmentStatement implements Statement { - private final ArrayAccessExpression array; - private final Expression expression; + public final ArrayAccessExpression array; + public final Expression expression; public ArrayAssignmentStatement(ArrayAccessExpression array, Expression expression) { this.array = array; @@ -18,6 +18,11 @@ public final class ArrayAssignmentStatement implements Statement { public void execute() { array.getArray().set(array.lastIndex(), expression.eval()); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/ArrayExpression.java b/src/com/annimon/ownlang/parser/ast/ArrayExpression.java index 0deae75..8ea8af2 100644 --- a/src/com/annimon/ownlang/parser/ast/ArrayExpression.java +++ b/src/com/annimon/ownlang/parser/ast/ArrayExpression.java @@ -10,7 +10,7 @@ import java.util.List; */ public final class ArrayExpression implements Expression { - private final List elements; + public final List elements; public ArrayExpression(List arguments) { this.elements = arguments; @@ -25,6 +25,11 @@ public final class ArrayExpression implements Expression { } return array; } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/AssignmentStatement.java b/src/com/annimon/ownlang/parser/ast/AssignmentStatement.java index 02ecf80..3293cef 100644 --- a/src/com/annimon/ownlang/parser/ast/AssignmentStatement.java +++ b/src/com/annimon/ownlang/parser/ast/AssignmentStatement.java @@ -9,8 +9,8 @@ import com.annimon.ownlang.lib.Variables; */ public final class AssignmentStatement implements Statement { - private final String variable; - private final Expression expression; + public final String variable; + public final Expression expression; public AssignmentStatement(String variable, Expression expression) { this.variable = variable; @@ -22,6 +22,11 @@ public final class AssignmentStatement implements Statement { final Value result = expression.eval(); Variables.set(variable, result); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java index 4693e12..a4bc430 100644 --- a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java @@ -11,8 +11,8 @@ import com.annimon.ownlang.lib.Value; */ public final class BinaryExpression implements Expression { - private final Expression expr1, expr2; - private final char operation; + public final Expression expr1, expr2; + public final char operation; public BinaryExpression(char operation, Expression expr1, Expression expr2) { this.operation = operation; @@ -52,6 +52,11 @@ public final class BinaryExpression implements Expression { return new NumberValue(number1 + number2); } } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/BlockStatement.java b/src/com/annimon/ownlang/parser/ast/BlockStatement.java index 5eb93b7..0e4fce8 100644 --- a/src/com/annimon/ownlang/parser/ast/BlockStatement.java +++ b/src/com/annimon/ownlang/parser/ast/BlockStatement.java @@ -9,7 +9,7 @@ import java.util.List; */ public final class BlockStatement implements Statement { - private final List statements; + public final List statements; public BlockStatement() { statements = new ArrayList<>(); @@ -25,6 +25,11 @@ public final class BlockStatement implements Statement { statement.execute(); } } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/BreakStatement.java b/src/com/annimon/ownlang/parser/ast/BreakStatement.java index 6bd79e9..8d65b57 100644 --- a/src/com/annimon/ownlang/parser/ast/BreakStatement.java +++ b/src/com/annimon/ownlang/parser/ast/BreakStatement.java @@ -10,6 +10,11 @@ public final class BreakStatement extends RuntimeException implements Statement public void execute() { throw this; } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/ConditionalExpression.java b/src/com/annimon/ownlang/parser/ast/ConditionalExpression.java index 76f25ce..0af25be 100644 --- a/src/com/annimon/ownlang/parser/ast/ConditionalExpression.java +++ b/src/com/annimon/ownlang/parser/ast/ConditionalExpression.java @@ -38,8 +38,8 @@ public final class ConditionalExpression implements Expression { } } - private final Expression expr1, expr2; - private final Operator operation; + public final Expression expr1, expr2; + public final Operator operation; public ConditionalExpression(Operator operation, Expression expr1, Expression expr2) { this.operation = operation; @@ -78,6 +78,11 @@ public final class ConditionalExpression implements Expression { } return new NumberValue(result); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/ContinueStatement.java b/src/com/annimon/ownlang/parser/ast/ContinueStatement.java index 9a8c459..6280a6d 100644 --- a/src/com/annimon/ownlang/parser/ast/ContinueStatement.java +++ b/src/com/annimon/ownlang/parser/ast/ContinueStatement.java @@ -10,6 +10,11 @@ public final class ContinueStatement extends RuntimeException implements Stateme public void execute() { throw this; } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/DoWhileStatement.java b/src/com/annimon/ownlang/parser/ast/DoWhileStatement.java index fdbfe0b..783098c 100644 --- a/src/com/annimon/ownlang/parser/ast/DoWhileStatement.java +++ b/src/com/annimon/ownlang/parser/ast/DoWhileStatement.java @@ -6,8 +6,8 @@ package com.annimon.ownlang.parser.ast; */ public final class DoWhileStatement implements Statement { - private final Expression condition; - private final Statement statement; + public final Expression condition; + public final Statement statement; public DoWhileStatement(Expression condition, Statement statement) { this.condition = condition; @@ -27,6 +27,11 @@ public final class DoWhileStatement implements Statement { } while (condition.eval().asNumber() != 0); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/Expression.java b/src/com/annimon/ownlang/parser/ast/Expression.java index b6ccec3..98865f5 100644 --- a/src/com/annimon/ownlang/parser/ast/Expression.java +++ b/src/com/annimon/ownlang/parser/ast/Expression.java @@ -6,7 +6,7 @@ import com.annimon.ownlang.lib.Value; * * @author aNNiMON */ -public interface Expression { +public interface Expression extends Node { Value eval(); } diff --git a/src/com/annimon/ownlang/parser/ast/ForStatement.java b/src/com/annimon/ownlang/parser/ast/ForStatement.java index fce6d2c..cd3d03f 100644 --- a/src/com/annimon/ownlang/parser/ast/ForStatement.java +++ b/src/com/annimon/ownlang/parser/ast/ForStatement.java @@ -6,10 +6,10 @@ package com.annimon.ownlang.parser.ast; */ public final class ForStatement implements Statement { - private final Statement initialization; - private final Expression termination; - private final Statement increment; - private final Statement statement; + public final Statement initialization; + public final Expression termination; + public final Statement increment; + public final Statement statement; public ForStatement(Statement initialization, Expression termination, Statement increment, Statement block) { this.initialization = initialization; @@ -30,6 +30,11 @@ public final class ForStatement implements Statement { } } } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/FunctionDefineStatement.java b/src/com/annimon/ownlang/parser/ast/FunctionDefineStatement.java index 8c7489a..fe3016b 100644 --- a/src/com/annimon/ownlang/parser/ast/FunctionDefineStatement.java +++ b/src/com/annimon/ownlang/parser/ast/FunctionDefineStatement.java @@ -10,9 +10,9 @@ import java.util.List; */ public final class FunctionDefineStatement implements Statement { - private final String name; - private final List argNames; - private final Statement body; + public final String name; + public final List argNames; + public final Statement body; public FunctionDefineStatement(String name, List argNames, Statement body) { this.name = name; @@ -24,6 +24,11 @@ public final class FunctionDefineStatement implements Statement { public void execute() { Functions.set(name, new UserDefinedFunction(argNames, body)); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/FunctionStatement.java b/src/com/annimon/ownlang/parser/ast/FunctionStatement.java index d749777..54cda62 100644 --- a/src/com/annimon/ownlang/parser/ast/FunctionStatement.java +++ b/src/com/annimon/ownlang/parser/ast/FunctionStatement.java @@ -6,7 +6,7 @@ package com.annimon.ownlang.parser.ast; */ public final class FunctionStatement implements Statement { - private final FunctionalExpression function; + public final FunctionalExpression function; public FunctionStatement(FunctionalExpression function) { this.function = function; @@ -16,6 +16,11 @@ public final class FunctionStatement implements Statement { public void execute() { function.eval(); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/FunctionalExpression.java b/src/com/annimon/ownlang/parser/ast/FunctionalExpression.java index 8288779..f996880 100644 --- a/src/com/annimon/ownlang/parser/ast/FunctionalExpression.java +++ b/src/com/annimon/ownlang/parser/ast/FunctionalExpression.java @@ -14,8 +14,8 @@ import java.util.List; */ public final class FunctionalExpression implements Expression { - private final String name; - private final List arguments; + public final String name; + public final List arguments; public FunctionalExpression(String name) { this.name = name; @@ -30,7 +30,7 @@ public final class FunctionalExpression implements Expression { public void addArgument(Expression arg) { arguments.add(arg); } - + @Override public Value eval() { final int size = arguments.size(); @@ -54,6 +54,11 @@ public final class FunctionalExpression implements Expression { } return function.execute(values); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/IfStatement.java b/src/com/annimon/ownlang/parser/ast/IfStatement.java index 87be67d..0ba8e23 100644 --- a/src/com/annimon/ownlang/parser/ast/IfStatement.java +++ b/src/com/annimon/ownlang/parser/ast/IfStatement.java @@ -6,8 +6,8 @@ package com.annimon.ownlang.parser.ast; */ public final class IfStatement implements Statement { - private final Expression expression; - private final Statement ifStatement, elseStatement; + public final Expression expression; + public final Statement ifStatement, elseStatement; public IfStatement(Expression expression, Statement ifStatement, Statement elseStatement) { this.expression = expression; @@ -24,6 +24,11 @@ public final class IfStatement implements Statement { elseStatement.execute(); } } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/Node.java b/src/com/annimon/ownlang/parser/ast/Node.java new file mode 100644 index 0000000..dd74f9f --- /dev/null +++ b/src/com/annimon/ownlang/parser/ast/Node.java @@ -0,0 +1,10 @@ +package com.annimon.ownlang.parser.ast; + +/** + * + * @author aNNiMON + */ +public interface Node { + + void accept(Visitor visitor); +} diff --git a/src/com/annimon/ownlang/parser/ast/PrintStatement.java b/src/com/annimon/ownlang/parser/ast/PrintStatement.java index c2d6d3c..e008879 100644 --- a/src/com/annimon/ownlang/parser/ast/PrintStatement.java +++ b/src/com/annimon/ownlang/parser/ast/PrintStatement.java @@ -6,7 +6,7 @@ package com.annimon.ownlang.parser.ast; */ public final class PrintStatement implements Statement { - private final Expression expression; + public final Expression expression; public PrintStatement(Expression expression) { this.expression = expression; @@ -16,6 +16,11 @@ public final class PrintStatement implements Statement { public void execute() { System.out.print(expression.eval()); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/ReturnStatement.java b/src/com/annimon/ownlang/parser/ast/ReturnStatement.java index 7826dad..a6cbf2e 100644 --- a/src/com/annimon/ownlang/parser/ast/ReturnStatement.java +++ b/src/com/annimon/ownlang/parser/ast/ReturnStatement.java @@ -8,7 +8,7 @@ import com.annimon.ownlang.lib.Value; */ public final class ReturnStatement extends RuntimeException implements Statement { - private final Expression expression; + public final Expression expression; private Value result; public ReturnStatement(Expression expression) { @@ -24,6 +24,11 @@ public final class ReturnStatement extends RuntimeException implements Statement result = expression.eval(); throw this; } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/Statement.java b/src/com/annimon/ownlang/parser/ast/Statement.java index 0c69260..db7ce9c 100644 --- a/src/com/annimon/ownlang/parser/ast/Statement.java +++ b/src/com/annimon/ownlang/parser/ast/Statement.java @@ -4,7 +4,7 @@ package com.annimon.ownlang.parser.ast; * * @author aNNiMON */ -public interface Statement { +public interface Statement extends Node { void execute(); } diff --git a/src/com/annimon/ownlang/parser/ast/UnaryExpression.java b/src/com/annimon/ownlang/parser/ast/UnaryExpression.java index 765f07f..7be2ca3 100644 --- a/src/com/annimon/ownlang/parser/ast/UnaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/UnaryExpression.java @@ -9,14 +9,14 @@ import com.annimon.ownlang.lib.Value; */ public final class UnaryExpression implements Expression { - private final Expression expr1; - private final char operation; + public final Expression expr1; + public final char operation; public UnaryExpression(char operation, Expression expr1) { this.operation = operation; this.expr1 = expr1; } - + @Override public Value eval() { switch (operation) { @@ -27,6 +27,11 @@ public final class UnaryExpression implements Expression { } } + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + @Override public String toString() { return String.format("%c %s", operation, expr1); diff --git a/src/com/annimon/ownlang/parser/ast/ValueExpression.java b/src/com/annimon/ownlang/parser/ast/ValueExpression.java index 24c9427..b4d03fa 100644 --- a/src/com/annimon/ownlang/parser/ast/ValueExpression.java +++ b/src/com/annimon/ownlang/parser/ast/ValueExpression.java @@ -10,7 +10,7 @@ import com.annimon.ownlang.lib.Value; */ public final class ValueExpression implements Expression { - private final Value value; + public final Value value; public ValueExpression(double value) { this.value = new NumberValue(value); @@ -24,6 +24,11 @@ public final class ValueExpression implements Expression { public Value eval() { return value; } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/VariableExpression.java b/src/com/annimon/ownlang/parser/ast/VariableExpression.java index 7cf40e5..3204ca0 100644 --- a/src/com/annimon/ownlang/parser/ast/VariableExpression.java +++ b/src/com/annimon/ownlang/parser/ast/VariableExpression.java @@ -9,7 +9,7 @@ import com.annimon.ownlang.lib.Variables; */ public final class VariableExpression implements Expression { - private final String name; + public final String name; public VariableExpression(String name) { this.name = name; @@ -20,6 +20,11 @@ public final class VariableExpression implements Expression { if (!Variables.isExists(name)) throw new RuntimeException("Variable does not exists"); return Variables.get(name); } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/ast/Visitor.java b/src/com/annimon/ownlang/parser/ast/Visitor.java new file mode 100644 index 0000000..977fac1 --- /dev/null +++ b/src/com/annimon/ownlang/parser/ast/Visitor.java @@ -0,0 +1,30 @@ +package com.annimon.ownlang.parser.ast; + +/** + * + * @author aNNiMON + */ +public interface Visitor { + + void visit(ArrayAccessExpression s); + void visit(ArrayAssignmentStatement s); + void visit(ArrayExpression s); + void visit(AssignmentStatement s); + void visit(BinaryExpression s); + void visit(BlockStatement s); + void visit(BreakStatement s); + void visit(ConditionalExpression s); + void visit(ContinueStatement s); + void visit(DoWhileStatement s); + void visit(ForStatement s); + void visit(FunctionDefineStatement s); + void visit(FunctionStatement s); + void visit(FunctionalExpression s); + void visit(IfStatement s); + void visit(PrintStatement s); + void visit(ReturnStatement s); + void visit(UnaryExpression s); + void visit(ValueExpression s); + void visit(VariableExpression s); + void visit(WhileStatement st); +} diff --git a/src/com/annimon/ownlang/parser/ast/WhileStatement.java b/src/com/annimon/ownlang/parser/ast/WhileStatement.java index cab4dde..4b43e61 100644 --- a/src/com/annimon/ownlang/parser/ast/WhileStatement.java +++ b/src/com/annimon/ownlang/parser/ast/WhileStatement.java @@ -6,8 +6,8 @@ package com.annimon.ownlang.parser.ast; */ public final class WhileStatement implements Statement { - private final Expression condition; - private final Statement statement; + public final Expression condition; + public final Statement statement; public WhileStatement(Expression condition, Statement statement) { this.condition = condition; @@ -26,6 +26,11 @@ public final class WhileStatement implements Statement { } } } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } @Override public String toString() { diff --git a/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java b/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java new file mode 100644 index 0000000..5a04dc0 --- /dev/null +++ b/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java @@ -0,0 +1,132 @@ +package com.annimon.ownlang.parser.visitors; + +import com.annimon.ownlang.parser.ast.*; + +/** + * + * @author aNNiMON + */ +public abstract class AbstractVisitor implements Visitor { + + @Override + public void visit(ArrayAccessExpression s) { + for (Expression index : s.indices) { + index.accept(this); + } + } + + @Override + public void visit(ArrayAssignmentStatement s) { + s.array.accept(this); + s.expression.accept(this); + } + + @Override + public void visit(ArrayExpression s) { + for (Expression index : s.elements) { + index.accept(this); + } + } + + @Override + public void visit(AssignmentStatement s) { + s.expression.accept(this); + } + + @Override + public void visit(BinaryExpression s) { + s.expr1.accept(this); + s.expr2.accept(this); + } + + @Override + public void visit(BlockStatement s) { + for (Statement statement : s.statements) { + statement.accept(this); + } + } + + @Override + public void visit(BreakStatement s) { + } + + @Override + public void visit(ConditionalExpression s) { + s.expr1.accept(this); + s.expr2.accept(this); + } + + @Override + public void visit(ContinueStatement s) { + } + + @Override + public void visit(DoWhileStatement s) { + s.condition.accept(this); + s.statement.accept(this); + } + + @Override + public void visit(ForStatement s) { + s.initialization.accept(this); + s.termination.accept(this); + s.increment.accept(this); + s.statement.accept(this); + } + + @Override + public void visit(FunctionDefineStatement s) { + s.body.accept(this); + } + + @Override + public void visit(FunctionStatement s) { + s.function.accept(this); + } + + @Override + public void visit(FunctionalExpression s) { + for (Expression argument : s.arguments) { + argument.accept(this); + } + } + + @Override + public void visit(IfStatement s) { + s.expression.accept(this); + s.ifStatement.accept(this); + if (s.elseStatement != null) { + s.elseStatement.accept(this); + } + } + + @Override + public void visit(PrintStatement s) { + s.expression.accept(this); + } + + @Override + public void visit(ReturnStatement s) { + s.expression.accept(this); + } + + @Override + public void visit(UnaryExpression s) { + s.expr1.accept(this); + } + + @Override + public void visit(ValueExpression s) { + } + + @Override + public void visit(VariableExpression s) { + } + + @Override + public void visit(WhileStatement st) { + st.condition.accept(this); + st.statement.accept(this); + } + +} \ No newline at end of file diff --git a/src/com/annimon/ownlang/parser/visitors/AssignValidator.java b/src/com/annimon/ownlang/parser/visitors/AssignValidator.java new file mode 100644 index 0000000..dd11a2b --- /dev/null +++ b/src/com/annimon/ownlang/parser/visitors/AssignValidator.java @@ -0,0 +1,19 @@ +package com.annimon.ownlang.parser.visitors; + +import com.annimon.ownlang.lib.Variables; +import com.annimon.ownlang.parser.ast.*; + +/** + * + * @author aNNiMON + */ +public final class AssignValidator extends AbstractVisitor { + + @Override + public void visit(AssignmentStatement s) { + super.visit(s); + if (Variables.isExists(s.variable)) { + throw new RuntimeException("Cannot assign value to constant"); + } + } +} diff --git a/src/com/annimon/ownlang/parser/visitors/FunctionAdder.java b/src/com/annimon/ownlang/parser/visitors/FunctionAdder.java new file mode 100644 index 0000000..96a25ab --- /dev/null +++ b/src/com/annimon/ownlang/parser/visitors/FunctionAdder.java @@ -0,0 +1,16 @@ +package com.annimon.ownlang.parser.visitors; + +import com.annimon.ownlang.parser.ast.*; + +/** + * + * @author aNNiMON + */ +public final class FunctionAdder extends AbstractVisitor { + + @Override + public void visit(FunctionDefineStatement s) { + super.visit(s); + s.execute(); + } +} diff --git a/src/com/annimon/ownlang/parser/visitors/VariablePrinter.java b/src/com/annimon/ownlang/parser/visitors/VariablePrinter.java new file mode 100644 index 0000000..e3009e4 --- /dev/null +++ b/src/com/annimon/ownlang/parser/visitors/VariablePrinter.java @@ -0,0 +1,28 @@ +package com.annimon.ownlang.parser.visitors; + +import com.annimon.ownlang.parser.ast.*; + +/** + * + * @author aNNiMON + */ +public final class VariablePrinter extends AbstractVisitor { + + @Override + public void visit(ArrayAccessExpression s) { + super.visit(s); + System.out.println(s.variable); + } + + @Override + public void visit(AssignmentStatement s) { + super.visit(s); + System.out.println(s.variable); + } + + @Override + public void visit(VariableExpression s) { + super.visit(s); + System.out.println(s.name); + } +} diff --git a/visitor.own b/visitor.own new file mode 100644 index 0000000..9a9f6d8 --- /dev/null +++ b/visitor.own @@ -0,0 +1,5 @@ +func() +def func() print "function\n" + +a = 2 + 3 * 4 +print a \ No newline at end of file