diff options
Diffstat (limited to 'main/core/parser')
| -rw-r--r-- | main/core/parser/ASTGenerator.java | 12 | ||||
| -rw-r--r-- | main/core/parser/Parser.java | 61 | ||||
| -rw-r--r-- | main/core/parser/ast/ASTNode.java | 4 | ||||
| -rw-r--r-- | main/core/parser/ast/AdditionNode.java | 9 | ||||
| -rw-r--r-- | main/core/parser/ast/BinaryOperatorNode.java | 17 | ||||
| -rw-r--r-- | main/core/parser/ast/EmptyNode.java | 27 | ||||
| -rw-r--r-- | main/core/parser/ast/FunctionBodyNode.java | 25 | ||||
| -rw-r--r-- | main/core/parser/ast/FunctionDefineNode.java | 59 | ||||
| -rw-r--r-- | main/core/parser/ast/ParameterListNode.java | 38 | ||||
| -rw-r--r-- | main/core/parser/ast/SubtractionNode.java | 30 | ||||
| -rw-r--r-- | main/core/parser/ast/SymbolNode.java | 48 | ||||
| -rw-r--r-- | main/core/parser/ast/VarargOperatorNode.java | 26 | ||||
| -rw-r--r-- | main/core/parser/datatype/DataContainer.java | 1 | ||||
| -rw-r--r-- | main/core/parser/datatype/IntegerDataContainer.java | 7 | ||||
| -rw-r--r-- | main/core/parser/datatype/StringDataContainer.java | 29 | ||||
| -rw-r--r-- | main/core/parser/datatype/VoidDataContainer.java | 22 |
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; + } +} |
