From 374636dec209b68dfa1f15869b1f14f28a26e565 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 30 Jun 2015 10:06:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=20use?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annimon/ownlang/lib/modules/Module.java | 10 +++++ src/com/annimon/ownlang/parser/Lexer.java | 1 + src/com/annimon/ownlang/parser/Parser.java | 3 ++ src/com/annimon/ownlang/parser/TokenType.java | 1 + .../ownlang/parser/ast/ReturnStatement.java | 2 +- .../ownlang/parser/ast/UseStatement.java | 37 +++++++++++++++++++ .../annimon/ownlang/parser/ast/Visitor.java | 1 + .../parser/visitors/AbstractVisitor.java | 4 ++ 8 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/com/annimon/ownlang/lib/modules/Module.java create mode 100644 src/com/annimon/ownlang/parser/ast/UseStatement.java diff --git a/src/com/annimon/ownlang/lib/modules/Module.java b/src/com/annimon/ownlang/lib/modules/Module.java new file mode 100644 index 0000000..b2cd826 --- /dev/null +++ b/src/com/annimon/ownlang/lib/modules/Module.java @@ -0,0 +1,10 @@ +package com.annimon.ownlang.lib.modules; + +/** + * + * @author aNNiMON + */ +public interface Module { + + void init(); +} diff --git a/src/com/annimon/ownlang/parser/Lexer.java b/src/com/annimon/ownlang/parser/Lexer.java index 002db9d..7c1c3e0 100644 --- a/src/com/annimon/ownlang/parser/Lexer.java +++ b/src/com/annimon/ownlang/parser/Lexer.java @@ -157,6 +157,7 @@ public final class Lexer { case "continue": addToken(TokenType.CONTINUE); break; case "def": addToken(TokenType.DEF); break; case "return": addToken(TokenType.RETURN); break; + case "use": addToken(TokenType.USE); break; default: addToken(TokenType.WORD, word); break; diff --git a/src/com/annimon/ownlang/parser/Parser.java b/src/com/annimon/ownlang/parser/Parser.java index 5e25f07..c64c2d9 100644 --- a/src/com/annimon/ownlang/parser/Parser.java +++ b/src/com/annimon/ownlang/parser/Parser.java @@ -66,6 +66,9 @@ public final class Parser { if (match(TokenType.RETURN)) { return new ReturnStatement(expression()); } + if (match(TokenType.USE)) { + return new UseStatement(expression()); + } if (match(TokenType.FOR)) { return forStatement(); } diff --git a/src/com/annimon/ownlang/parser/TokenType.java b/src/com/annimon/ownlang/parser/TokenType.java index fc231ac..b15f484 100644 --- a/src/com/annimon/ownlang/parser/TokenType.java +++ b/src/com/annimon/ownlang/parser/TokenType.java @@ -22,6 +22,7 @@ public enum TokenType { CONTINUE, DEF, RETURN, + USE, PLUS, MINUS, diff --git a/src/com/annimon/ownlang/parser/ast/ReturnStatement.java b/src/com/annimon/ownlang/parser/ast/ReturnStatement.java index a6cbf2e..5d5ee98 100644 --- a/src/com/annimon/ownlang/parser/ast/ReturnStatement.java +++ b/src/com/annimon/ownlang/parser/ast/ReturnStatement.java @@ -32,6 +32,6 @@ public final class ReturnStatement extends RuntimeException implements Statement @Override public String toString() { - return "return"; + return "return " + expression; } } diff --git a/src/com/annimon/ownlang/parser/ast/UseStatement.java b/src/com/annimon/ownlang/parser/ast/UseStatement.java new file mode 100644 index 0000000..39397fa --- /dev/null +++ b/src/com/annimon/ownlang/parser/ast/UseStatement.java @@ -0,0 +1,37 @@ +package com.annimon.ownlang.parser.ast; + +import com.annimon.ownlang.lib.modules.Module; + +/** + * + * @author aNNiMON + */ +public final class UseStatement implements Statement { + + private static final String PACKAGE = "com.annimon.ownlang.lib.modules."; + + public final Expression expression; + + public UseStatement(Expression expression) { + this.expression = expression; + } + + @Override + public void execute() { + try { + final String moduleName = expression.eval().asString(); + final Module module = (Module) Class.forName(PACKAGE + moduleName).newInstance(); + module.init(); + } catch (Exception ex) { } + } + + @Override + public void accept(Visitor visitor) { + visitor.visit(this); + } + + @Override + public String toString() { + return "use " + expression; + } +} diff --git a/src/com/annimon/ownlang/parser/ast/Visitor.java b/src/com/annimon/ownlang/parser/ast/Visitor.java index 977fac1..c9c8851 100644 --- a/src/com/annimon/ownlang/parser/ast/Visitor.java +++ b/src/com/annimon/ownlang/parser/ast/Visitor.java @@ -27,4 +27,5 @@ public interface Visitor { void visit(ValueExpression s); void visit(VariableExpression s); void visit(WhileStatement st); + void visit(UseStatement st); } diff --git a/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java b/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java index 5a04dc0..98f8735 100644 --- a/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java +++ b/src/com/annimon/ownlang/parser/visitors/AbstractVisitor.java @@ -129,4 +129,8 @@ public abstract class AbstractVisitor implements Visitor { st.statement.accept(this); } + @Override + public void visit(UseStatement st) { + st.expression.accept(this); + } } \ No newline at end of file