aboutsummaryrefslogtreecommitdiffstats
path: root/main/core/parser
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2016-06-20 20:55:22 +0300
committerJan Tuomi <jans.tuomi@gmail.com>2016-07-26 19:47:02 +0300
commitd745f000d6d60b9cdf0ba40dbf80660c1aa6bc61 (patch)
treee00ea32ae3a2d291768084544cb21429281dc0ae /main/core/parser
parentd35a37a449d31e6f4b43b937abf7b0e1fc497828 (diff)
Implemented general enhancements
Diffstat (limited to 'main/core/parser')
-rw-r--r--main/core/parser/ASTGenerator.java12
-rw-r--r--main/core/parser/Parser.java61
-rw-r--r--main/core/parser/ast/ASTNode.java4
-rw-r--r--main/core/parser/ast/AdditionNode.java9
-rw-r--r--main/core/parser/ast/BinaryOperatorNode.java17
-rw-r--r--main/core/parser/ast/EmptyNode.java27
-rw-r--r--main/core/parser/ast/FunctionBodyNode.java25
-rw-r--r--main/core/parser/ast/FunctionDefineNode.java59
-rw-r--r--main/core/parser/ast/ParameterListNode.java38
-rw-r--r--main/core/parser/ast/SubtractionNode.java30
-rw-r--r--main/core/parser/ast/SymbolNode.java48
-rw-r--r--main/core/parser/ast/VarargOperatorNode.java26
-rw-r--r--main/core/parser/datatype/DataContainer.java1
-rw-r--r--main/core/parser/datatype/IntegerDataContainer.java7
-rw-r--r--main/core/parser/datatype/StringDataContainer.java29
-rw-r--r--main/core/parser/datatype/VoidDataContainer.java22
16 files changed, 396 insertions, 19 deletions
diff --git a/main/core/parser/ASTGenerator.java b/main/core/parser/ASTGenerator.java
index e0a3146..548735b 100644
--- a/main/core/parser/ASTGenerator.java
+++ b/main/core/parser/ASTGenerator.java
@@ -27,4 +27,16 @@ public class ASTGenerator {
return list;
}
+
+ public void printTree(ASTNode root) {
+ System.out.println("### AST Tree begin ###");
+ root.print(0);
+ System.out.println("### AST Tree end ###");
+ }
+
+ public void printAllTrees(List<ASTNode> trees) {
+ for (ASTNode tree : trees) {
+ printTree(tree);
+ }
+ }
}
diff --git a/main/core/parser/Parser.java b/main/core/parser/Parser.java
index e8b8813..f6e1208 100644
--- a/main/core/parser/Parser.java
+++ b/main/core/parser/Parser.java
@@ -3,9 +3,10 @@ package com.jantuomi.interpreter.main.core.parser;
import com.jantuomi.interpreter.main.core.parser.ast.ASTNode;
import com.jantuomi.interpreter.main.core.tokenizer.token.ArgumentInfo;
import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+import com.jantuomi.interpreter.main.exception.ExceptionManager;
+import com.jantuomi.interpreter.main.exception.InterpreterException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Stack;
@@ -28,11 +29,11 @@ public class Parser {
private Stack<Token> stack;
- public List<Token> parse(List<Token> tokens) {
+ public List<Token> parse(List<Token> tokens) throws InterpreterException {
this.tokens = tokens;
this.stack = new Stack<>();
- List<Token> args = new ArrayList<>();
+ List<Token> args;
List<Token> output = new ArrayList<>();
for (Token t : tokens) {
if (t.getTokenType() == Token.Type.NewlineToken) {
@@ -42,16 +43,48 @@ public class Parser {
continue;
}
- args.clear();
+ args = new ArrayList<>();
ArgumentInfo argumentInfo = t.getArgumentInfo();
- if (!argumentInfo.getVarargs()) {
- for (int i = 0; i < argumentInfo.getCount(); i++) {
+
+ /*
+ This branch is executed if the token has a variable list of arguments
+ */
+ if (argumentInfo.getVarargs()) {
+ while (true) {
+ if (stack.size() > 0) {
+ Token arg = stack.pop();
+ if (arg.getTokenType() != argumentInfo.getTerminator()) {
+ args.add(arg);
+ }
+ else {
+ args.add(arg);
+ break;
+ }
+ }
+ }
+ }
+ /*
+ If the token has an optional argument type (it is only an argument if
+ it is of certain type)
+ */
+ else if (argumentInfo.getOptionalArgument() != null) {
+ if (stack.size() > 0 && stack.peek().getTokenType() == argumentInfo.getOptionalArgument()) {
args.add(stack.pop());
}
- } else {
- System.err.println("no vararg support yet");
}
- Collections.reverse(args);
+ /* Normal cases with a fixed list of arguments */
+ else {
+ for (int i = 0; i < argumentInfo.getCount(); i++) {
+ if (stack.size() > 0) {
+ args.add(stack.pop());
+ } else {
+ ExceptionManager.raise(InterpreterException.ExceptionType.ArgumentError, t.getLine(),
+ t.toString(), Integer.toString(argumentInfo.getCount()));
+ return null;
+ }
+ }
+ }
+
Token result = t.setArguments(args);
stack.push(result);
}
@@ -62,8 +95,14 @@ public class Parser {
}
public void printTree(Token e) {
- System.out.println("### Tree begin ###");
+ System.out.println("### Token Tree begin ###");
e.print(0);
- System.out.println("### Tree end ###");
+ System.out.println("### Token Tree end ###");
+ }
+
+ public void printAllTrees(List<Token> trees) {
+ for (Token tree : trees) {
+ printTree(tree);
+ }
}
}
diff --git a/main/core/parser/ast/ASTNode.java b/main/core/parser/ast/ASTNode.java
index 4f840e3..99bdc06 100644
--- a/main/core/parser/ast/ASTNode.java
+++ b/main/core/parser/ast/ASTNode.java
@@ -31,7 +31,9 @@ abstract public class ASTNode {
System.out.println(source.toString());
for (ASTNode node : getChildren()) {
- node.print(indent + 1);
+ if (node != null) {
+ node.print(indent + 1);
+ }
}
}
}
diff --git a/main/core/parser/ast/AdditionNode.java b/main/core/parser/ast/AdditionNode.java
index 46f67a4..a6406ae 100644
--- a/main/core/parser/ast/AdditionNode.java
+++ b/main/core/parser/ast/AdditionNode.java
@@ -9,15 +9,10 @@ import java.util.List;
/**
* Created by jan on 16.6.2016.
*/
-public class AdditionNode extends ASTNode {
-
- private ASTNode lhs;
- private ASTNode rhs;
+public class AdditionNode extends BinaryOperatorNode {
public AdditionNode(Token token, ASTNode lhs, ASTNode rhs) {
- super(token);
- this.lhs = lhs;
- this.rhs = rhs;
+ super(token, lhs, rhs);
}
@Override
diff --git a/main/core/parser/ast/BinaryOperatorNode.java b/main/core/parser/ast/BinaryOperatorNode.java
new file mode 100644
index 0000000..9ec21a4
--- /dev/null
+++ b/main/core/parser/ast/BinaryOperatorNode.java
@@ -0,0 +1,17 @@
+package com.jantuomi.interpreter.main.core.parser.ast;
+
+import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+
+/**
+ * Created by jan on 16.6.2016.
+ */
+abstract public class BinaryOperatorNode extends ASTNode {
+ protected ASTNode lhs;
+ protected ASTNode rhs;
+
+ public BinaryOperatorNode(Token token, ASTNode lhs, ASTNode rhs) {
+ super(token);
+ this.lhs = lhs;
+ this.rhs = rhs;
+ }
+}
diff --git a/main/core/parser/ast/EmptyNode.java b/main/core/parser/ast/EmptyNode.java
new file mode 100644
index 0000000..44bfcc9
--- /dev/null
+++ b/main/core/parser/ast/EmptyNode.java
@@ -0,0 +1,27 @@
+package com.jantuomi.interpreter.main.core.parser.ast;
+
+import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer;
+import com.jantuomi.interpreter.main.core.parser.datatype.VoidDataContainer;
+import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by jan on 17.6.2016.
+ */
+public class EmptyNode extends ASTNode {
+ public EmptyNode(Token source) {
+ super(source);
+ }
+
+ @Override
+ public DataContainer evaluate() {
+ return new VoidDataContainer();
+ }
+
+ @Override
+ List<ASTNode> getChildren() {
+ return Arrays.asList();
+ }
+}
diff --git a/main/core/parser/ast/FunctionBodyNode.java b/main/core/parser/ast/FunctionBodyNode.java
new file mode 100644
index 0000000..394710c
--- /dev/null
+++ b/main/core/parser/ast/FunctionBodyNode.java
@@ -0,0 +1,25 @@
+package com.jantuomi.interpreter.main.core.parser.ast;
+
+import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer;
+import com.jantuomi.interpreter.main.core.parser.datatype.VoidDataContainer;
+import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+
+/**
+ * Created by jan on 17.6.2016.
+ */
+public class FunctionBodyNode extends VarargOperatorNode {
+ public FunctionBodyNode(Token token) {
+ super(token);
+ }
+
+ @Override
+ public DataContainer evaluate() {
+ DataContainer returnValue = new VoidDataContainer();
+
+ for (ASTNode node : args) {
+ returnValue = node.evaluate();
+ }
+
+ return returnValue;
+ }
+}
diff --git a/main/core/parser/ast/FunctionDefineNode.java b/main/core/parser/ast/FunctionDefineNode.java
new file mode 100644
index 0000000..e867f78
--- /dev/null
+++ b/main/core/parser/ast/FunctionDefineNode.java
@@ -0,0 +1,59 @@
+package com.jantuomi.interpreter.main.core.parser.ast;
+
+import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer;
+import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+
+/**
+ * Created by jan on 17.6.2016.
+ */
+public class FunctionDefineNode extends VarargOperatorNode {
+
+ private String name;
+
+ public void setBody(ASTNode body) {
+ this.body = body;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ private ASTNode body;
+
+ public FunctionDefineNode(Token token) {
+ super(token);
+ }
+
+ @Override
+ public DataContainer evaluate() {
+ // TODO add function in State
+ return null;
+ }
+
+ @Override
+ public void print(int indent) {
+
+ for (int i = 0; i < indent; i++) {
+ System.out.print("\t");
+ }
+
+ System.out.println(String.format("Function %s", name));
+
+ for (int i = 0; i < indent + 1; i++) {
+ System.out.print("\t");
+ }
+
+ System.out.println(String.format("Arguments: "));
+
+ for (ASTNode node : args) {
+ node.print(indent + 2);
+ }
+
+ for (int i = 0; i < indent + 1; i++) {
+ System.out.print("\t");
+ }
+
+ System.out.println(String.format("Body statements: "));
+ body.print(indent + 2);
+ }
+}
diff --git a/main/core/parser/ast/ParameterListNode.java b/main/core/parser/ast/ParameterListNode.java
new file mode 100644
index 0000000..50f919a
--- /dev/null
+++ b/main/core/parser/ast/ParameterListNode.java
@@ -0,0 +1,38 @@
+package com.jantuomi.interpreter.main.core.parser.ast;
+
+import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer;
+import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by jan on 19.6.2016.
+ */
+public class ParameterListNode extends ASTNode {
+
+ private List<ASTNode> parameters = new ArrayList<>();
+
+ public void addParameter(ASTNode param) {
+ parameters.add(param);
+ }
+
+ public List<ASTNode> getParameters() {
+ return parameters;
+ }
+
+ public ParameterListNode(Token token) {
+ super(token);
+ }
+
+ @Override
+ public DataContainer evaluate() {
+ // TODO use State to evaluate function
+ return null;
+ }
+
+ @Override
+ List<ASTNode> getChildren() {
+ return parameters;
+ }
+}
diff --git a/main/core/parser/ast/SubtractionNode.java b/main/core/parser/ast/SubtractionNode.java
new file mode 100644
index 0000000..0865ab1
--- /dev/null
+++ b/main/core/parser/ast/SubtractionNode.java
@@ -0,0 +1,30 @@
+package com.jantuomi.interpreter.main.core.parser.ast;
+
+import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer;
+import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by jan on 16.6.2016.
+ */
+public class SubtractionNode extends BinaryOperatorNode {
+ public SubtractionNode(Token token, ASTNode lhs, ASTNode rhs) {
+ super(token, lhs, rhs);
+ }
+
+ @Override
+ public DataContainer evaluate() {
+ DataContainer operand1 = lhs.evaluate();
+ DataContainer operand2 = rhs.evaluate();
+
+ DataContainer result = operand1.subtract(operand2);
+ return result;
+
+ }
+ @Override
+ List<ASTNode> getChildren() {
+ return Arrays.asList(lhs, rhs);
+ }
+}
diff --git a/main/core/parser/ast/SymbolNode.java b/main/core/parser/ast/SymbolNode.java
new file mode 100644
index 0000000..7ea8d96
--- /dev/null
+++ b/main/core/parser/ast/SymbolNode.java
@@ -0,0 +1,48 @@
+package com.jantuomi.interpreter.main.core.parser.ast;
+
+import com.jantuomi.interpreter.main.core.parser.datatype.DataContainer;
+import com.jantuomi.interpreter.main.core.runtime.State;
+import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by jan on 17.6.2016.
+ */
+public class SymbolNode extends ASTNode {
+
+ public ParameterListNode getParameterListNode() {
+ return parameterListNode;
+ }
+
+ public void setParameterListNode(ParameterListNode parameterListNode) {
+ this.parameterListNode = parameterListNode;
+ }
+
+ private ParameterListNode parameterListNode;
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ private String name;
+
+ public SymbolNode(Token token) {
+ super(token);
+ }
+
+ @Override
+ public DataContainer evaluate() {
+ return State.getInstance().getSymbolValue(name, parameterListNode.getParameters());
+ }
+
+ @Override
+ List<ASTNode> getChildren() {
+ if (parameterListNode == null) {
+ return Arrays.asList();
+ } else {
+ return Arrays.asList(parameterListNode);
+ }
+ }
+}
diff --git a/main/core/parser/ast/VarargOperatorNode.java b/main/core/parser/ast/VarargOperatorNode.java
new file mode 100644
index 0000000..96a7320
--- /dev/null
+++ b/main/core/parser/ast/VarargOperatorNode.java
@@ -0,0 +1,26 @@
+package com.jantuomi.interpreter.main.core.parser.ast;
+
+import com.jantuomi.interpreter.main.core.tokenizer.token.Token;
+
+import java.util.List;
+
+/**
+ * Created by jan on 17.6.2016.
+ */
+public abstract class VarargOperatorNode extends ASTNode {
+
+ protected List<ASTNode> args;
+
+ public VarargOperatorNode(Token token) {
+ super(token);
+ }
+
+ @Override
+ public List<ASTNode> getChildren() {
+ return args;
+ }
+
+ public void setArgs(List<ASTNode> args) {
+ this.args = args;
+ }
+}
diff --git a/main/core/parser/datatype/DataContainer.java b/main/core/parser/datatype/DataContainer.java
index 593855b..b504bd6 100644
--- a/main/core/parser/datatype/DataContainer.java
+++ b/main/core/parser/datatype/DataContainer.java
@@ -25,4 +25,5 @@ abstract public class DataContainer<T> {
abstract public String toString();
abstract public DataContainer<T> add(DataContainer<T> other);
+ public abstract DataContainer<T> subtract(DataContainer<T> other);
}
diff --git a/main/core/parser/datatype/IntegerDataContainer.java b/main/core/parser/datatype/IntegerDataContainer.java
index b5fdac3..650db5c 100644
--- a/main/core/parser/datatype/IntegerDataContainer.java
+++ b/main/core/parser/datatype/IntegerDataContainer.java
@@ -22,4 +22,11 @@ public class IntegerDataContainer extends DataContainer<Integer> {
this.value + ((IntegerDataContainer) other).value
);
}
+
+ @Override
+ public DataContainer<Integer> subtract(DataContainer<Integer> other) {
+ return new IntegerDataContainer(
+ this.value - ((IntegerDataContainer) other).value
+ );
+ }
}
diff --git a/main/core/parser/datatype/StringDataContainer.java b/main/core/parser/datatype/StringDataContainer.java
new file mode 100644
index 0000000..9916f77
--- /dev/null
+++ b/main/core/parser/datatype/StringDataContainer.java
@@ -0,0 +1,29 @@
+package com.jantuomi.interpreter.main.core.parser.datatype;
+
+/**
+ * Created by jan on 16.6.2016.
+ */
+public class StringDataContainer extends DataContainer<String> {
+ private String value;
+
+ public StringDataContainer(String text) {
+ this.value = text;
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+
+ @Override
+ public DataContainer<String> add(DataContainer<String> other) {
+ return new StringDataContainer(
+ value + ((StringDataContainer) other).value
+ );
+ }
+
+ @Override
+ public DataContainer<String> subtract(DataContainer<String> other) {
+ return null;
+ }
+}
diff --git a/main/core/parser/datatype/VoidDataContainer.java b/main/core/parser/datatype/VoidDataContainer.java
new file mode 100644
index 0000000..8e078d9
--- /dev/null
+++ b/main/core/parser/datatype/VoidDataContainer.java
@@ -0,0 +1,22 @@
+package com.jantuomi.interpreter.main.core.parser.datatype;
+
+/**
+ * Created by jan on 17.6.2016.
+ */
+public class VoidDataContainer extends DataContainer<Integer> {
+
+ @Override
+ public String toString() {
+ return "";
+ }
+
+ @Override
+ public DataContainer<Integer> add(DataContainer<Integer> other) {
+ return null;
+ }
+
+ @Override
+ public DataContainer<Integer> subtract(DataContainer<Integer> other) {
+ return null;
+ }
+}