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