Добавлен оператор use для подключения модулей

This commit is contained in:
Victor 2015-06-30 10:06:44 +03:00
parent ebed6c56d2
commit 374636dec2
8 changed files with 58 additions and 1 deletions

View File

@ -0,0 +1,10 @@
package com.annimon.ownlang.lib.modules;
/**
*
* @author aNNiMON
*/
public interface Module {
void init();
}

View File

@ -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;

View File

@ -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();
}

View File

@ -22,6 +22,7 @@ public enum TokenType {
CONTINUE,
DEF,
RETURN,
USE,
PLUS,
MINUS,

View File

@ -32,6 +32,6 @@ public final class ReturnStatement extends RuntimeException implements Statement
@Override
public String toString() {
return "return";
return "return " + expression;
}
}

View File

@ -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;
}
}

View File

@ -27,4 +27,5 @@ public interface Visitor {
void visit(ValueExpression s);
void visit(VariableExpression s);
void visit(WhileStatement st);
void visit(UseStatement st);
}

View File

@ -129,4 +129,8 @@ public abstract class AbstractVisitor implements Visitor {
st.statement.accept(this);
}
@Override
public void visit(UseStatement st) {
st.expression.accept(this);
}
}