From d745f000d6d60b9cdf0ba40dbf80660c1aa6bc61 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 20 Jun 2016 20:55:22 +0300 Subject: Implemented general enhancements --- main/core/parser/ast/ASTNode.java | 4 +- main/core/parser/ast/AdditionNode.java | 9 +---- main/core/parser/ast/BinaryOperatorNode.java | 17 ++++++++ main/core/parser/ast/EmptyNode.java | 27 +++++++++++++ main/core/parser/ast/FunctionBodyNode.java | 25 ++++++++++++ main/core/parser/ast/FunctionDefineNode.java | 59 ++++++++++++++++++++++++++++ main/core/parser/ast/ParameterListNode.java | 38 ++++++++++++++++++ main/core/parser/ast/SubtractionNode.java | 30 ++++++++++++++ main/core/parser/ast/SymbolNode.java | 48 ++++++++++++++++++++++ main/core/parser/ast/VarargOperatorNode.java | 26 ++++++++++++ 10 files changed, 275 insertions(+), 8 deletions(-) create mode 100644 main/core/parser/ast/BinaryOperatorNode.java create mode 100644 main/core/parser/ast/EmptyNode.java create mode 100644 main/core/parser/ast/FunctionBodyNode.java create mode 100644 main/core/parser/ast/FunctionDefineNode.java create mode 100644 main/core/parser/ast/ParameterListNode.java create mode 100644 main/core/parser/ast/SubtractionNode.java create mode 100644 main/core/parser/ast/SymbolNode.java create mode 100644 main/core/parser/ast/VarargOperatorNode.java (limited to 'main/core/parser/ast') 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 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 parameters = new ArrayList<>(); + + public void addParameter(ASTNode param) { + parameters.add(param); + } + + public List getParameters() { + return parameters; + } + + public ParameterListNode(Token token) { + super(token); + } + + @Override + public DataContainer evaluate() { + // TODO use State to evaluate function + return null; + } + + @Override + List 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 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 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 args; + + public VarargOperatorNode(Token token) { + super(token); + } + + @Override + public List getChildren() { + return args; + } + + public void setArgs(List args) { + this.args = args; + } +} -- cgit v1.3