From adc5f0beccf51086669fd0ae0876ffd1e40c05b8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 01:28:40 -0700 Subject: [PATCH] more parsing reworks --- .../structures/parser/FunctionBuilder.java | 12 -- .../terra/api/structures/parser/Parser.java | 104 ++++++++++-------- .../api/structures/parser/lang/Block.java | 10 +- .../parser/lang/ConstantExpression.java | 16 ++- .../structures/parser/lang/Expression.java | 16 ++- .../api/structures/parser/lang/Function.java | 5 - .../api/structures/parser/lang/Item.java | 3 + .../api/structures/parser/lang/Keyword.java | 2 +- .../lang/{Executable.java => Returnable.java} | 2 +- .../parser/lang/functions/Function.java | 7 ++ .../lang/functions/FunctionBuilder.java | 13 +++ .../parser/lang/keywords/IfKeyword.java | 14 ++- .../parser/lang/keywords/ReturnKeyword.java | 12 ++ .../lang/operations/BinaryOperation.java | 34 +++++- .../lang/operations/BooleanNotOperation.java | 20 ++++ .../operations/ConcatenationOperation.java | 14 ++- .../operations/MultiplicationOperation.java | 20 ++++ .../operations/NumberAdditionOperation.java | 14 ++- .../lang/operations/UnaryOperation.java | 33 ++++++ .../lang/statements/EqualsStatement.java | 10 +- .../lang/statements/GreaterThanStatement.java | 10 +- .../lang/statements/NotEqualsStatement.java | 10 +- .../script/builders/BlockFunctionBuilder.java | 26 ----- .../script/builders/SpawnCheckBuilder.java | 26 ----- .../script/functions/BlockFunction.java | 23 +++- .../script/functions/CheckFunction.java | 36 ++++-- .../terra/api/structures/tokenizer/Token.java | 20 +++- .../api/structures/tokenizer/Tokenizer.java | 21 +++- .../src/test/java/structure/ParserTest.java | 19 +++- common/src/test/resources/test.tesf | 5 +- .../structure/load/LoadRawCommand.java | 4 - 31 files changed, 395 insertions(+), 166 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/{Executable.java => Returnable.java} (89%) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanNotOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java deleted file mode 100644 index 0b596db84..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.api.structures.parser; - -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Function; - -import java.util.List; - -public interface FunctionBuilder> { - T build(List argumentList) throws ParseException; - - int getArguments(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 63c1706ec..158770ee0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -3,14 +3,14 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.ConstantExpression; -import com.dfsek.terra.api.structures.parser.lang.Executable; -import com.dfsek.terra.api.structures.parser.lang.Function; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Keyword; -import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; -import com.dfsek.terra.api.structures.parser.lang.statements.EqualsStatement; -import com.dfsek.terra.api.structures.parser.lang.statements.NotEqualsStatement; +import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; @@ -22,7 +22,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; public class Parser { private final String data; @@ -54,7 +53,7 @@ public class Parser { for(Token t : tokens) { if(t.getType().equals(Token.Type.BLOCK_BEGIN)) blockLevel++; else if(t.getType().equals(Token.Type.BLOCK_END)) blockLevel--; - if(blockLevel < 0) throw new ParseException("Dangling closing brace: " + t.getStart()); + if(blockLevel < 0) throw new ParseException("Dangling closing brace: " + t.getPosition()); } if(blockLevel != 0) throw new ParseException("Dangling opening brace"); @@ -62,52 +61,67 @@ public class Parser { } + @SuppressWarnings("unchecked") private Keyword parseKeyword(List tokens) throws ParseException { Token identifier = tokens.remove(0); checkType(identifier, Token.Type.KEYWORD); if(!keywords.contains(identifier.getContent())) - throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getStart()); + throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getPosition()); Keyword k = null; if(identifier.getContent().equals("if")) { checkType(tokens.remove(0), Token.Type.BODY_BEGIN); - Executable left = parseExpression(tokens); - - Statement statement = null; - Token comparator = tokens.remove(0); - checkType(comparator, Token.Type.BOOLEAN_OPERATOR); - - Executable right = parseExpression(tokens); + Returnable comparator = parseExpression(tokens); + checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); checkType(tokens.remove(0), Token.Type.BODY_END); - if(comparator.getContent().equals("==")) { - statement = new EqualsStatement(left, right); - } else if(comparator.getContent().equals("!=")) { - statement = new NotEqualsStatement(left, right); - } checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); - k = new IfKeyword(parseBlock(tokens), statement); + k = new IfKeyword(parseBlock(tokens), (Returnable) comparator, identifier.getPosition()); } return k; } - private Executable parseExpression(List tokens) throws ParseException { + @SuppressWarnings("unchecked") + private Returnable parseExpression(List tokens) throws ParseException { + System.out.println(tokens.get(0)); + Token first = tokens.get(0); + checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT); + + boolean not = false; + if(first.getType().equals(Token.Type.BOOLEAN_NOT)) { + not = true; + tokens.remove(0); + } + + Returnable expression; if(tokens.get(0).isConstant()) { - return new ConstantExpression<>(tokens.remove(0).getContent()); - } else return parseFunction(tokens, false); + Object constant; + Position position = tokens.get(0).getPosition(); + if(tokens.get(0).getType().equals(Token.Type.BOOLEAN)) constant = Boolean.parseBoolean(tokens.remove(0).getContent()); + else constant = tokens.remove(0).getContent(); + expression = new ConstantExpression<>(constant, position); + } else expression = parseFunction(tokens, false); + + if(not) { + checkReturnType(expression, Returnable.ReturnType.BOOLEAN); + return new BooleanNotOperation((Returnable) expression, expression.getPosition()); + } else return expression; } private Block parseBlock(List tokens) throws ParseException { List> parsedItems = new GlueList<>(); + Token first = tokens.get(0); + checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD); main: while(tokens.size() > 0) { Token token = tokens.get(0); + System.out.println(token); checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); switch(token.getType()) { case KEYWORD: @@ -125,7 +139,7 @@ public class Parser { break main; } } - return new Block(parsedItems); + return new Block(parsedItems, first.getPosition()); } private Function parseFunction(List tokens, boolean fullStatement) throws ParseException { @@ -133,46 +147,42 @@ public class Parser { checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier if(!functions.containsKey(identifier.getContent())) - throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getStart()); + throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getPosition()); checkType(tokens.remove(0), Token.Type.BODY_BEGIN); // Second is body begin - List args = getArgs(tokens); // Extract arguments, consume the rest. + List> args = getArgs(tokens); // Extract arguments, consume the rest. tokens.remove(0); // Remove body end if(fullStatement) checkType(tokens.get(0), Token.Type.STATEMENT_END); - List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); - FunctionBuilder builder = functions.get(identifier.getContent()); - if(arg.size() != builder.getArguments() && builder.getArguments() != -1) - throw new ParseException("Expected " + builder.getArguments() + " arguments, found " + arg.size() + ": " + identifier.getStart()); - return functions.get(identifier.getContent()).build(arg); + if(args.size() != builder.getArguments() && builder.getArguments() != -1) + throw new ParseException("Expected " + builder.getArguments() + " arguments, found " + args.size() + ": " + identifier.getPosition()); + return functions.get(identifier.getContent()).build(args, identifier.getPosition()); } - private List getArgs(List functionBuilder) throws ParseException { - List args = new GlueList<>(); - boolean expectingSeparator = false; - while(!functionBuilder.get(0).getType().equals(Token.Type.BODY_END)) { - Token current = functionBuilder.remove(0); - if(expectingSeparator) { - checkType(current, Token.Type.SEPARATOR); - expectingSeparator = false; - } else { - if(!allowedArguments.contains(current.getType())) - throw new ParseException("Token type " + current.getType() + " not allowed in arguments: " + current.getStart()); - args.add(current); - expectingSeparator = true; - } + private List> getArgs(List tokens) throws ParseException { + List> args = new GlueList<>(); + + while(!tokens.get(0).getType().equals(Token.Type.BODY_END)) { + args.add(parseExpression(tokens)); + checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.BODY_END); + if(tokens.get(0).getType().equals(Token.Type.SEPARATOR)) tokens.remove(0); } return args; } private void checkType(Token token, Token.Type... expected) throws ParseException { for(Token.Type type : expected) if(token.getType().equals(type)) return; - throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType() + ": " + token.getStart()); + throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType() + ": " + token.getPosition()); + } + + private void checkReturnType(Returnable returnable, Returnable.ReturnType... types) throws ParseException { + for(Returnable.ReturnType type : types) if(returnable.returnType().equals(type)) return; + throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType() + ": " + returnable.getPosition()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 95ea2bf01..62c019f80 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -2,14 +2,17 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; public class Block implements Item { private final List> items; + private final Position position; - public Block(List> items) { + public Block(List> items, Position position) { this.items = items; + this.position = position; } public List> getItems() { @@ -27,4 +30,9 @@ public class Block implements Item { items.forEach(item -> item.apply(location, chunk)); return null; } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java index ce0e8304e..6624b1908 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java @@ -2,12 +2,15 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.tokenizer.Position; -public class ConstantExpression implements Executable { +public class ConstantExpression implements Returnable { private final T constant; + private final Position position; - public ConstantExpression(T constant) { + public ConstantExpression(T constant, Position position) { this.constant = constant; + this.position = position; } @Override @@ -21,6 +24,15 @@ public class ConstantExpression implements Executable { return constant; } + @Override + public Position getPosition() { + return position; + } + + public T getConstant() { + return constant; + } + @Override public ReturnType returnType() { if(constant instanceof String) return ReturnType.STRING; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java index 29b26d203..c2460be3d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java @@ -3,18 +3,21 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; -public class Expression implements Executable { +public class Expression implements Returnable { private final ReturnType type; - private final Executable left; - private final Executable right; + private final Returnable left; + private final Returnable right; private final BinaryOperation operation; + private final Position position; - public Expression(ReturnType type, Executable left, Executable right, BinaryOperation operation) { + public Expression(ReturnType type, Returnable left, Returnable right, BinaryOperation operation, Position position) { this.type = type; this.left = left; this.right = right; this.operation = operation; + this.position = position; } @Override @@ -31,4 +34,9 @@ public class Expression implements Executable { public T apply(Location location, Chunk chunk) { return operation.apply(left.apply(location, chunk), right.apply(location, chunk)); } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java deleted file mode 100644 index 293f59e41..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang; - -public interface Function extends Executable { - String name(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 449523dc0..abe1a2a30 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -2,9 +2,12 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.tokenizer.Position; public interface Item { T apply(Location location); T apply(Location location, Chunk chunk); + + Position getPosition(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java index 7407c888e..be0a9f085 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java @@ -1,4 +1,4 @@ package com.dfsek.terra.api.structures.parser.lang; -public interface Keyword extends Executable { +public interface Keyword extends Returnable { } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Returnable.java similarity index 89% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Returnable.java index bb6be7ca6..3d02ae4cb 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Returnable.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang; -public interface Executable extends Item { +public interface Returnable extends Item { ReturnType returnType(); enum ReturnType { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java new file mode 100644 index 000000000..1ebd54b85 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.structures.parser.lang.functions; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; + +public interface Function extends Returnable { + String name(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java new file mode 100644 index 000000000..c05622d0d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.api.structures.parser.lang.functions; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public interface FunctionBuilder> { + T build(List> argumentList, Position position) throws ParseException; + + int getArguments(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index e990b6fbe..3168f4824 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -4,15 +4,18 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; -import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; public class IfKeyword implements Keyword { private final Block conditional; - private final Statement statement; + private final Returnable statement; + private final Position position; - public IfKeyword(Block conditional, Statement statement) { + public IfKeyword(Block conditional, Returnable statement, Position position) { this.conditional = conditional; this.statement = statement; + this.position = position; } @Override @@ -27,6 +30,11 @@ public class IfKeyword implements Keyword { return null; } + @Override + public Position getPosition() { + return position; + } + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index 8645888bc..7a85fcd2f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -3,8 +3,15 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.tokenizer.Position; public class ReturnKeyword implements Keyword { + private final Position position; + + public ReturnKeyword(Position position) { + this.position = position; + } + @Override public Void apply(Location location) { return null; @@ -15,6 +22,11 @@ public class ReturnKeyword implements Keyword { return null; } + @Override + public Position getPosition() { + return position; + } + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index c4530127a..c54e601a8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -1,5 +1,35 @@ package com.dfsek.terra.api.structures.parser.lang.operations; -public interface BinaryOperation { - T apply(T left, T right); +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public abstract class BinaryOperation implements Returnable { + private final Returnable left; + private final Returnable right; + private final Position start; + + protected BinaryOperation(Returnable left, Returnable right, Position start) { + this.left = left; + this.right = right; + this.start = start; + } + + public abstract T apply(T left, T right); + + @Override + public Position getPosition() { + return getPosition(); + } + + @Override + public T apply(Location location) { + return apply(left.apply(location), right.apply(location)); + } + + @Override + public T apply(Location location, Chunk chunk) { + return apply(left.apply(location, chunk), right.apply(location, chunk)); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanNotOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanNotOperation.java new file mode 100644 index 000000000..ebf59abd2 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanNotOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class BooleanNotOperation extends UnaryOperation { + public BooleanNotOperation(Returnable input, Position position) { + super(input, position); + } + + @Override + public Boolean apply(Boolean input) { + return !input; + } + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java index cbd1adcd4..2e232f0d7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java @@ -1,8 +1,20 @@ package com.dfsek.terra.api.structures.parser.lang.operations; -public class ConcatenationOperation implements BinaryOperation { +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class ConcatenationOperation extends BinaryOperation { + protected ConcatenationOperation(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + @Override public String apply(Object left, Object right) { return left.toString() + right.toString(); } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java new file mode 100644 index 000000000..4e54c61c7 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class MultiplicationOperation extends BinaryOperation { + protected MultiplicationOperation(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Number apply(Number left, Number right) { + return left.doubleValue() * right.doubleValue(); + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java index 4dd70f593..44b126fd8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java @@ -1,8 +1,20 @@ package com.dfsek.terra.api.structures.parser.lang.operations; -public class NumberAdditionOperation implements BinaryOperation { +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class NumberAdditionOperation extends BinaryOperation { + protected NumberAdditionOperation(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + @Override public Number apply(Number left, Number right) { return left.doubleValue() + right.doubleValue(); } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java new file mode 100644 index 000000000..8f0db76e5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public abstract class UnaryOperation implements Returnable { + private final Returnable input; + private final Position position; + + protected UnaryOperation(Returnable input, Position position) { + this.input = input; + this.position = position; + } + + public abstract T apply(T input); + + @Override + public T apply(Location location) { + return apply(input.apply(location)); + } + + @Override + public T apply(Location location, Chunk chunk) { + return apply(input.apply(location, chunk)); + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java index b55178685..890669601 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java @@ -4,14 +4,17 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.tokenizer.Position; public class EqualsStatement implements Statement { private final Item left; private final Item right; + private final Position position; - public EqualsStatement(Item left, Item right) { + public EqualsStatement(Item left, Item right, Position position) { this.left = left; this.right = right; + this.position = position; } @Override @@ -23,4 +26,9 @@ public class EqualsStatement implements Statement { public Boolean apply(Location location, Chunk chunk) { return left.apply(location, chunk).equals(right.apply(location, chunk)); } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java index b804756d0..47f4cea60 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java @@ -4,14 +4,17 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.tokenizer.Position; public class GreaterThanStatement> implements Statement { private final Item left; private final Item right; + private final Position position; - public GreaterThanStatement(Item left, Item right) { + public GreaterThanStatement(Item left, Item right, Position position) { this.left = left; this.right = right; + this.position = position; } @Override @@ -23,4 +26,9 @@ public class GreaterThanStatement> implements Statement public Boolean apply(Location location, Chunk chunk) { return left.apply(location).compareTo(right.apply(location)) > 0; } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java index 5d4a2b736..ded5a2925 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java @@ -4,14 +4,17 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.tokenizer.Position; public class NotEqualsStatement implements Statement { private final Item left; private final Item right; + private final Position position; - public NotEqualsStatement(Item left, Item right) { + public NotEqualsStatement(Item left, Item right, Position position) { this.left = left; this.right = right; + this.position = position; } @Override @@ -23,4 +26,9 @@ public class NotEqualsStatement implements Statement { public Boolean apply(Location location, Chunk chunk) { return !left.apply(location, chunk).equals(right.apply(location, chunk)); } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java deleted file mode 100644 index 156453db7..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.api.structures.script.builders; - -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.structures.parser.FunctionBuilder; -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.script.functions.BlockFunction; - -import java.util.List; - -public class BlockFunctionBuilder implements FunctionBuilder { - private final TerraPlugin main; - - public BlockFunctionBuilder(TerraPlugin main) { - this.main = main; - } - - @Override - public BlockFunction build(List argumentList) throws ParseException { - return new BlockFunction(Integer.parseInt(argumentList.get(0)), Integer.parseInt(argumentList.get(1)), Integer.parseInt(argumentList.get(2)), main.getWorldHandle().createBlockData(argumentList.get(3))); - } - - @Override - public int getArguments() { - return 4; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java deleted file mode 100644 index a8010b304..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.api.structures.script.builders; - -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.structures.parser.FunctionBuilder; -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.script.functions.CheckFunction; - -import java.util.List; - -public class SpawnCheckBuilder implements FunctionBuilder { - private final TerraPlugin main; - - public SpawnCheckBuilder(TerraPlugin main) { - this.main = main; - } - - @Override - public CheckFunction build(List argumentList) throws ParseException { - return new CheckFunction(main, Integer.parseInt(argumentList.get(0)), Integer.parseInt(argumentList.get(1)), Integer.parseInt(argumentList.get(2))); - } - - @Override - public int getArguments() { - return 3; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 50e414dbf..f2d53f68c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -1,16 +1,24 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.Function; +import com.dfsek.terra.api.structures.parser.lang.ConstantExpression; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.tokenizer.Position; public class BlockFunction implements Function { private final BlockData data; - private final int x, y, z; + private final Returnable x, y, z; + private final Position position; - public BlockFunction(int x, int y, int z, BlockData data) { - this.data = data; + public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + this.position = position; + if(!(data instanceof ConstantExpression)) throw new IllegalArgumentException("Block data must be constant."); + + this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); this.x = x; this.y = y; this.z = z; @@ -23,7 +31,7 @@ public class BlockFunction implements Function { @Override public Void apply(Location location) { - location.clone().add(x, y, z).getBlock().setBlockData(data, false); + location.clone().add(x.apply(location), y.apply(location), z.apply(location)).getBlock().setBlockData(data, false); return null; } @@ -33,6 +41,11 @@ public class BlockFunction implements Function { return null; } + @Override + public Position getPosition() { + return position; + } + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 6c5379fc5..b05ac4f98 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -1,21 +1,27 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.Function; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.world.LandCheck; import com.dfsek.terra.api.structures.world.OceanCheck; public class CheckFunction implements Function { private final TerraPlugin main; - private final int x, y, z; + private final Returnable x, y, z; + private final Position position; - public CheckFunction(TerraPlugin main, int x, int y, int z) { + public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { this.main = main; this.x = x; this.y = y; this.z = z; + this.position = position; } @Override @@ -23,22 +29,32 @@ public class CheckFunction implements Function { return "check"; } + private Vector3 getVector(Location location, Chunk chunk) { + return chunk == null ? new Vector3(x.apply(location) + location.getBlockX(), y.apply(location) + location.getBlockY(), z.apply(location) + location.getBlockZ()) + : new Vector3(x.apply(location, chunk) + location.getBlockX(), y.apply(location, chunk) + location.getBlockY(), z.apply(location, chunk) + location.getBlockZ()); + } + @Override public String apply(Location location) { - if(new LandCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) + return apply(getVector(location, null), location.getWorld()); + } + + private String apply(Vector3 vector, World world) { + if(new LandCheck(world, main).check(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())) return "LAND"; - if(new OceanCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) + if(new OceanCheck(world, main).check(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())) return "OCEAN"; return "AIR"; } @Override public String apply(Location location, Chunk chunk) { - if(new LandCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) - return "LAND"; - if(new OceanCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) - return "OCEAN"; - return "AIR"; + return apply(getVector(location, chunk), location.getWorld()); + } + + @Override + public Position getPosition() { + return position; } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 66fa93960..d84214243 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -19,7 +19,7 @@ public class Token { return content; } - public Position getStart() { + public Position getPosition() { return start; } @@ -89,6 +89,22 @@ public class Token { /** * Addition/concatenation operator */ - ADDITION_OPERATOR + ADDITION_OPERATOR, + /** + * Subtraction operator + */ + SUBTRACTION_OPERATOR, + /** + * Multiplication operator + */ + MULTIPLICATION_OPERATOR, + /** + * Division operator + */ + DIVISION_OPERATOR, + /** + * Boolean not operator + */ + BOOLEAN_NOT } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 729e6969c..f2be8a717 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -11,7 +11,7 @@ import java.util.Set; public class Tokenizer { private final Lookahead reader; - private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+'); // Reserved chars + private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars private final Set keywords = Sets.newHashSet("if", "return"); @@ -36,10 +36,21 @@ public class Tokenizer { return new Token("true", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("false", true)) return new Token("false", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); + + if(reader.matches("==", true)) return new Token("==", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("!=", true)) return new Token("!=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches(">", true)) + return new Token(">", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("<", true)) + return new Token("<", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches(">=", true)) + return new Token(">=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("<=", true)) + return new Token("<=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(isNumberStart()) { StringBuilder num = new StringBuilder(); @@ -84,6 +95,14 @@ public class Tokenizer { return new Token(reader.consume().toString(), Token.Type.ASSIGNMENT, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('+')) return new Token(reader.consume().toString(), Token.Type.ADDITION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('-')) + return new Token(reader.consume().toString(), Token.Type.SUBTRACTION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('*')) + return new Token(reader.consume().toString(), Token.Type.MULTIPLICATION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('/')) + return new Token(reader.consume().toString(), Token.Type.DIVISION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('!')) + return new Token(reader.consume().toString(), Token.Type.BOOLEAN_NOT, new Position(reader.getLine(), reader.getIndex())); StringBuilder token = new StringBuilder(); while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index a71009926..9eb52be0d 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -2,11 +2,13 @@ package structure; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.FunctionBuilder; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Function; import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.tokenizer.Position; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; @@ -20,8 +22,8 @@ public class ParserTest { parser.addFunction("test", new FunctionBuilder() { @Override - public Test1 build(List argumentList) throws ParseException { - return new Test1(argumentList.get(0), Double.parseDouble(argumentList.get(1))); + public Test1 build(List> argumentList, Position position) throws ParseException { + return new Test1(argumentList.get(0).apply(new Location(null, 0, 0, 0)).toString(), Double.parseDouble(argumentList.get(1).apply(new Location(null, 0, 0, 0)).toString()), position); } @Override @@ -41,10 +43,12 @@ public class ParserTest { private static class Test1 implements Function { private final String a; private final double b; + private final Position position; - public Test1(String a, double b) { + public Test1(String a, double b, Position position) { this.a = a; this.b = b; + this.position = position; } public String getA() { @@ -65,6 +69,11 @@ public class ParserTest { return null; } + @Override + public Position getPosition() { + return null; + } + @Override public String name() { return null; diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 8f82d7331..76dc5aa15 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,8 +1,5 @@ test("hello", 2); -if(test("fsdfsdf", 3) == 2) { +if("true") { test("fdsgdf", 3.4); - if(test("fsdfsdf", 3) == 2) { - test("fdsgdf", 3.4); - } } \ No newline at end of file diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index eda9606fb..5add94894 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -4,8 +4,6 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; -import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; -import com.dfsek.terra.api.structures.script.builders.SpawnCheckBuilder; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; import org.apache.commons.io.IOUtils; @@ -39,8 +37,6 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { try { Parser parser = new Parser(IOUtils.toString(new FileInputStream(new File(getMain().getDataFolder(), "test.tesf")))); - parser.addFunction("block", new BlockFunctionBuilder(getMain())); - parser.addFunction("check", new SpawnCheckBuilder(getMain())); Block main = parser.parse(); main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()));