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 "continue": addToken(TokenType.CONTINUE); break;
|
||||||
case "def": addToken(TokenType.DEF); break;
|
case "def": addToken(TokenType.DEF); break;
|
||||||
case "return": addToken(TokenType.RETURN); break;
|
case "return": addToken(TokenType.RETURN); break;
|
||||||
|
case "use": addToken(TokenType.USE); break;
|
||||||
default:
|
default:
|
||||||
addToken(TokenType.WORD, word);
|
addToken(TokenType.WORD, word);
|
||||||
break;
|
break;
|
||||||
|
@ -66,6 +66,9 @@ public final class Parser {
|
|||||||
if (match(TokenType.RETURN)) {
|
if (match(TokenType.RETURN)) {
|
||||||
return new ReturnStatement(expression());
|
return new ReturnStatement(expression());
|
||||||
}
|
}
|
||||||
|
if (match(TokenType.USE)) {
|
||||||
|
return new UseStatement(expression());
|
||||||
|
}
|
||||||
if (match(TokenType.FOR)) {
|
if (match(TokenType.FOR)) {
|
||||||
return forStatement();
|
return forStatement();
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ public enum TokenType {
|
|||||||
CONTINUE,
|
CONTINUE,
|
||||||
DEF,
|
DEF,
|
||||||
RETURN,
|
RETURN,
|
||||||
|
USE,
|
||||||
|
|
||||||
PLUS,
|
PLUS,
|
||||||
MINUS,
|
MINUS,
|
||||||
|
@ -32,6 +32,6 @@ public final class ReturnStatement extends RuntimeException implements Statement
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
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(ValueExpression s);
|
||||||
void visit(VariableExpression s);
|
void visit(VariableExpression s);
|
||||||
void visit(WhileStatement st);
|
void visit(WhileStatement st);
|
||||||
|
void visit(UseStatement st);
|
||||||
}
|
}
|
||||||
|
@ -129,4 +129,8 @@ public abstract class AbstractVisitor implements Visitor {
|
|||||||
st.statement.accept(this);
|
st.statement.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(UseStatement st) {
|
||||||
|
st.expression.accept(this);
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user