mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Добавлен оператор use для подключения модулей
This commit is contained in:
parent
ebed6c56d2
commit
374636dec2
10
src/com/annimon/ownlang/lib/modules/Module.java
Normal file
10
src/com/annimon/ownlang/lib/modules/Module.java
Normal file
@ -0,0 +1,10 @@
|
||||
package com.annimon.ownlang.lib.modules;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public interface Module {
|
||||
|
||||
void init();
|
||||
}
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ public enum TokenType {
|
||||
CONTINUE,
|
||||
DEF,
|
||||
RETURN,
|
||||
USE,
|
||||
|
||||
PLUS,
|
||||
MINUS,
|
||||
|
@ -32,6 +32,6 @@ public final class ReturnStatement extends RuntimeException implements Statement
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "return";
|
||||
return "return " + expression;
|
||||
}
|
||||
}
|
||||
|
37
src/com/annimon/ownlang/parser/ast/UseStatement.java
Normal file
37
src/com/annimon/ownlang/parser/ast/UseStatement.java
Normal 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;
|
||||
}
|
||||
}
|
@ -27,4 +27,5 @@ public interface Visitor {
|
||||
void visit(ValueExpression s);
|
||||
void visit(VariableExpression s);
|
||||
void visit(WhileStatement st);
|
||||
void visit(UseStatement st);
|
||||
}
|
||||
|
@ -129,4 +129,8 @@ public abstract class AbstractVisitor implements Visitor {
|
||||
st.statement.accept(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visit(UseStatement st) {
|
||||
st.expression.accept(this);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user