From 89fdf7f1f7042f057f2cbdea4be2754d87f1cca8 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Tue, 21 Jun 2016 21:55:23 +0300 Subject: Add builtin function 'out' --- main/core/parser/ast/FunctionDefineNode.java | 1 + main/core/runtime/Function.java | 10 +++++++ main/core/runtime/State.java | 10 ++++++- main/core/runtime/builtins/BuiltinManager.java | 27 ++++++++++++++++++ main/core/runtime/builtins/OutBuiltinFunction.java | 32 ++++++++++++++++++++++ main/core/tokenizer/Tokenizer.java | 2 +- 6 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 main/core/runtime/builtins/BuiltinManager.java create mode 100644 main/core/runtime/builtins/OutBuiltinFunction.java (limited to 'main/core') diff --git a/main/core/parser/ast/FunctionDefineNode.java b/main/core/parser/ast/FunctionDefineNode.java index 482551f..39a775a 100644 --- a/main/core/parser/ast/FunctionDefineNode.java +++ b/main/core/parser/ast/FunctionDefineNode.java @@ -38,6 +38,7 @@ public class FunctionDefineNode extends VarargOperatorNode { argumentNames.add(argSym.getName()); } Function function = new Function(argumentNames, (BlockBodyNode) body); + function.setName(name); State.getInstance().addFunctionToScope(name, function); return new StringDataContainer("function " + name); diff --git a/main/core/runtime/Function.java b/main/core/runtime/Function.java index cc4f56f..6989a68 100644 --- a/main/core/runtime/Function.java +++ b/main/core/runtime/Function.java @@ -15,6 +15,16 @@ public class Function { private BlockBodyNode body; + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + private String name; + public Function(List argumentNames, BlockBodyNode body) { this.argumentNames = argumentNames; this.body = body; diff --git a/main/core/runtime/State.java b/main/core/runtime/State.java index d825a3a..8563a77 100644 --- a/main/core/runtime/State.java +++ b/main/core/runtime/State.java @@ -1,6 +1,7 @@ package com.jantuomi.interpreter.main.core.runtime; import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer; +import com.jantuomi.interpreter.main.core.runtime.builtins.BuiltinManager; import com.jantuomi.interpreter.main.exception.InterpreterException; import java.util.Arrays; @@ -21,7 +22,14 @@ public class State { private State() { /* Push global scope onto the stack */ - scopes.push(new Scope()); + Scope globalScope = new Scope(); + + for (Function builtin : BuiltinManager.getInstance().getBuiltins()) { + globalScope.addFunction(builtin.getName(), builtin); + } + + scopes.push(globalScope); + } private DataContainer resolveSymbol(String symbol) throws InterpreterException { diff --git a/main/core/runtime/builtins/BuiltinManager.java b/main/core/runtime/builtins/BuiltinManager.java new file mode 100644 index 0000000..21027a6 --- /dev/null +++ b/main/core/runtime/builtins/BuiltinManager.java @@ -0,0 +1,27 @@ +package com.jantuomi.interpreter.main.core.runtime.builtins; + +import com.jantuomi.interpreter.main.core.runtime.Function; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by jan on 21.6.2016. + */ +public class BuiltinManager { + private static BuiltinManager instance = new BuiltinManager(); + + public static BuiltinManager getInstance() { + return instance; + } + + private List builtins = new ArrayList<>(); + + private BuiltinManager() { + builtins.add(new OutBuiltinFunction()); + } + + public List getBuiltins() { + return builtins; + } +} diff --git a/main/core/runtime/builtins/OutBuiltinFunction.java b/main/core/runtime/builtins/OutBuiltinFunction.java new file mode 100644 index 0000000..0611a83 --- /dev/null +++ b/main/core/runtime/builtins/OutBuiltinFunction.java @@ -0,0 +1,32 @@ +package com.jantuomi.interpreter.main.core.runtime.builtins; + +import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer; +import com.jantuomi.interpreter.main.core.runtime.Function; +import com.jantuomi.interpreter.main.exception.InterpreterException; + +import java.util.Arrays; +import java.util.List; + +/** + * Created by jan on 21.6.2016. + */ +public class OutBuiltinFunction extends Function { + public OutBuiltinFunction() { + super( + Arrays.asList("expression"), + null + ); + } + + @Override + public String getName() { + return "out"; + } + + @Override + public DataContainer evaluate(List params) throws InterpreterException { + DataContainer param = params.get(0); + System.out.println(param.getData().toString()); + return param; + } +} diff --git a/main/core/tokenizer/Tokenizer.java b/main/core/tokenizer/Tokenizer.java index 35bf7da..2580abb 100644 --- a/main/core/tokenizer/Tokenizer.java +++ b/main/core/tokenizer/Tokenizer.java @@ -34,7 +34,7 @@ public class Tokenizer { private Tokenizer() { tokenRegexes.put(Token.Type.CommentToken, "^\\/\\*(.*)\\*\\/"); - tokenRegexes.put(Token.Type.StringLiteralToken, "^\"(.*)\""); + tokenRegexes.put(Token.Type.StringLiteralToken, "^\"(.*?)\""); tokenRegexes.put(Token.Type.WhitespaceToken, "^( |\t)"); tokenRegexes.put(Token.Type.NewlineToken, "^(\n|\r\n)"); tokenRegexes.put(Token.Type.AdditionToken, "^(\\+)"); -- cgit v1.3