From 1623a4f958c0eb536e283202de492e1e49c31868 Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 23 Oct 2023 13:26:27 +1100 Subject: [PATCH] Move terrascript 2 to separate module --- .../build.gradle.kts | 15 - .../addons/terrascript/TerraScriptAddon.java | 64 -- .../addons/terrascript/parser/Parser.java | 468 ----------- .../build.gradle.kts | 232 +----- .../addons/terrascript/TerraScriptAddon.java | 7 +- .../IdentifierAlreadyDeclaredException.java | 11 - .../InvalidFunctionDeclarationException.java | 11 - .../InvalidTypeException.java | 11 - .../UndefinedReferenceException.java | 11 - .../terrascript/parser/BinaryOperator.java | 25 - .../addons/terrascript/parser/Parser.java | 735 ++++++++++-------- .../addons/terrascript/parser/ParserUtil.java | 0 .../terrascript/parser/UnaryOperator.java | 13 - .../parser/exceptions/ParseException.java | 0 .../addons/terrascript/parser/lang/Block.java | 0 .../terrascript/parser/lang/Executable.java | 0 .../parser/lang/ImplementationArguments.java | 0 .../addons/terrascript/parser/lang/Item.java | 0 .../terrascript/parser/lang/Keyword.java | 0 .../terrascript/parser/lang/Returnable.java | 0 .../addons/terrascript/parser/lang/Scope.java | 0 .../terrascript/parser/lang/Statement.java | 0 .../lang/constants/BooleanConstant.java | 0 .../lang/constants/ConstantExpression.java | 0 .../lang/constants/NumericConstant.java | 0 .../parser/lang/constants/StringConstant.java | 0 .../parser/lang/functions/Function.java | 0 .../lang/functions/FunctionBuilder.java | 0 .../lang/keywords/flow/BreakKeyword.java | 0 .../lang/keywords/flow/ContinueKeyword.java | 0 .../lang/keywords/flow/FailKeyword.java | 0 .../lang/keywords/flow/ReturnKeyword.java | 0 .../lang/keywords/looplike/ForKeyword.java | 0 .../lang/keywords/looplike/IfKeyword.java | 0 .../lang/keywords/looplike/WhileKeyword.java | 0 .../lang/operations/BinaryOperation.java | 0 .../lang/operations/BooleanAndOperation.java | 0 .../lang/operations/BooleanNotOperation.java | 0 .../lang/operations/BooleanOrOperation.java | 0 .../operations/ConcatenationOperation.java | 0 .../lang/operations/DivisionOperation.java | 0 .../lang/operations/ModuloOperation.java | 0 .../operations/MultiplicationOperation.java | 0 .../lang/operations/NegationOperation.java | 0 .../operations/NumberAdditionOperation.java | 0 .../lang/operations/SubtractionOperation.java | 0 .../lang/operations/UnaryOperation.java | 0 .../statements/EqualsStatement.java | 0 .../GreaterOrEqualsThanStatement.java | 0 .../statements/GreaterThanStatement.java | 0 .../statements/LessThanOrEqualsStatement.java | 0 .../statements/LessThanStatement.java | 0 .../statements/NotEqualsStatement.java | 0 .../lang/variables/BooleanVariable.java | 0 .../parser/lang/variables/NumberVariable.java | 0 .../parser/lang/variables/StringVariable.java | 0 .../parser/lang/variables/Variable.java | 0 .../variables/assign/BoolAssignmentNode.java | 0 .../variables/assign/NumAssignmentNode.java | 0 .../variables/assign/StrAssignmentNode.java | 0 .../assign/VariableAssignmentNode.java | 0 .../reference/BoolVariableReferenceNode.java | 0 .../reference/NumVariableReferenceNode.java | 0 .../reference/StrVariableReferenceNode.java | 0 .../reference/VariableReferenceNode.java | 0 .../terrascript/script/StructureScript.java | 0 .../script/TerraImplementationArguments.java | 0 .../builders/BinaryNumberFunctionBuilder.java | 0 .../script/builders/BiomeFunctionBuilder.java | 0 .../script/builders/BlockFunctionBuilder.java | 0 .../builders/CheckBlockFunctionBuilder.java | 0 .../builders/EntityFunctionBuilder.java | 0 .../builders/GetMarkFunctionBuilder.java | 0 .../script/builders/LootFunctionBuilder.java | 0 .../script/builders/PullFunctionBuilder.java | 0 .../builders/RandomFunctionBuilder.java | 0 .../builders/RecursionsFunctionBuilder.java | 0 .../builders/SetMarkFunctionBuilder.java | 0 .../script/builders/StateFunctionBuilder.java | 0 .../builders/StructureFunctionBuilder.java | 0 .../builders/UnaryBooleanFunctionBuilder.java | 0 .../builders/UnaryNumberFunctionBuilder.java | 0 .../builders/UnaryStringFunctionBuilder.java | 0 .../builders/ZeroArgFunctionBuilder.java | 0 .../script/functions/BiomeFunction.java | 0 .../script/functions/BlockFunction.java | 0 .../script/functions/CheckBlockFunction.java | 0 .../script/functions/EntityFunction.java | 0 .../script/functions/GetMarkFunction.java | 0 .../script/functions/LootFunction.java | 0 .../script/functions/PullFunction.java | 0 .../script/functions/RandomFunction.java | 0 .../script/functions/RecursionsFunction.java | 0 .../script/functions/SetMarkFunction.java | 0 .../script/functions/StateFunction.java | 0 .../script/functions/StructureFunction.java | 0 .../addons/terrascript/tokenizer/Char.java | 0 .../terrascript/tokenizer/Lookahead.java | 0 .../terrascript/tokenizer/Position.java | 0 .../addons/terrascript/tokenizer/Token.java | 0 .../terrascript/tokenizer/Tokenizer.java | 0 .../tokenizer/exceptions/EOFException.java | 0 .../tokenizer/exceptions/FormatException.java | 0 .../exceptions/TokenizerException.java | 0 .../test/java/structure/LookaheadTest.java | 0 .../src/test/java/structure/ParserTest.java | 0 .../src/test/resources/test.tesf | 0 .../LICENSE | 0 .../README.md | 0 .../structure-terrascript-v2/build.gradle.kts | 245 ++++++ .../addons/terrascript/v2}/Environment.java | 14 +- .../addons/terrascript/v2}/ErrorHandler.java | 2 +- .../terrascript/v2/TerraScript2Addon.java | 26 + .../terra/addons/terrascript/v2}/Type.java | 2 +- .../terrascript/v2}/codegen/CodegenType.java | 6 +- .../v2}/codegen/NativeFunction.java | 4 +- .../terrascript/v2}/codegen/TerraScript.java | 2 +- .../v2}/codegen/asm/DynamicClassLoader.java | 2 +- .../v2}/codegen/asm/OpcodeAlias.java | 2 +- .../asm/TerraScriptClassGenerator.java | 126 ++- .../v2}/exception/CompilationException.java | 4 +- .../v2}/exception/CompilerBugException.java | 2 +- .../v2}/exception/lexer/EOFException.java | 4 +- .../v2}/exception/lexer/FormatException.java | 4 +- .../exception/lexer/TokenizerException.java | 6 +- .../IdentifierAlreadyDeclaredException.java | 11 + .../InvalidFunctionDeclarationException.java | 11 + .../InvalidTypeException.java | 11 + .../UndefinedReferenceException.java | 11 + .../addons/terrascript/v2}/lexer/Char.java | 2 +- .../addons/terrascript/v2}/lexer/Lexer.java | 13 +- .../v2}/lexer/LookaheadStream.java | 2 +- .../terrascript/v2}/lexer/SourcePosition.java | 2 +- .../addons/terrascript/v2}/lexer/Token.java | 2 +- .../terrascript/v2/parser/BinaryOperator.java | 25 + .../v2}/parser/ParseException.java | 4 +- .../addons/terrascript/v2/parser/Parser.java | 379 +++++++++ .../terrascript/v2/parser/UnaryOperator.java | 13 + .../FunctionReferenceAnalyzer.java | 54 +- .../v2}/semanticanalysis/ScopeAnalyzer.java | 42 +- .../semanticanalysis/SemanticAnalyzer.java | 10 +- .../v2}/semanticanalysis/TypeChecker.java | 42 +- .../addons/terrascript/v2}/util/ASMUtil.java | 4 +- .../terrascript/v2}/util/OrdinalUtil.java | 2 +- .../src/main/resources/terra.addon.yml | 4 +- .../src/test/java/codegen/CodeGenTest.java | 18 +- .../src/test/java/lexer/LexerTest.java | 8 +- .../test/java/lexer/LookaheadStreamTest.java | 6 +- .../SemanticAnalyzerTest.java | 16 +- .../terrascript/check/CheckFunction.java | 34 +- .../check/CheckFunctionBuilder.java | 17 +- .../check/TerraScriptCheckFunctionAddon.java | 2 +- .../sampler/ConstantSamplerFunction.java | 39 +- .../terrascript/sampler/SamplerFunction.java | 45 +- .../sampler/SamplerFunctionBuilder.java | 51 +- .../TerraScriptSamplerFunctionAddon.java | 2 +- 156 files changed, 1441 insertions(+), 1495 deletions(-) delete mode 100644 common/addons/structure-terrascript-loader-v1/build.gradle.kts delete mode 100644 common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java delete mode 100644 common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java delete mode 100644 common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/IdentifierAlreadyDeclaredException.java delete mode 100644 common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/InvalidFunctionDeclarationException.java delete mode 100644 common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/InvalidTypeException.java delete mode 100644 common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/UndefinedReferenceException.java delete mode 100644 common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/BinaryOperator.java rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java (100%) delete mode 100644 common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/UnaryOperator.java rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Executable.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/BoolAssignmentNode.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/NumAssignmentNode.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/StrAssignmentNode.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/BoolVariableReferenceNode.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/NumVariableReferenceNode.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/StrVariableReferenceNode.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/test/java/structure/LookaheadTest.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/test/java/structure/ParserTest.java (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-loader}/src/test/resources/test.tesf (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-v2}/LICENSE (100%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-v2}/README.md (100%) create mode 100644 common/addons/structure-terrascript-v2/build.gradle.kts rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/Environment.java (89%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/ErrorHandler.java (88%) create mode 100644 common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/TerraScript2Addon.java rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/Type.java (97%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/codegen/CodegenType.java (95%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/codegen/NativeFunction.java (96%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/codegen/TerraScript.java (54%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/codegen/asm/DynamicClassLoader.java (88%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/codegen/asm/OpcodeAlias.java (91%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/codegen/asm/TerraScriptClassGenerator.java (80%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/exception/CompilationException.java (86%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/exception/CompilerBugException.java (64%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/exception/lexer/EOFException.java (83%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/exception/lexer/FormatException.java (83%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/exception/lexer/TokenizerException.java (76%) create mode 100644 common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/IdentifierAlreadyDeclaredException.java create mode 100644 common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/InvalidFunctionDeclarationException.java create mode 100644 common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/InvalidTypeException.java create mode 100644 common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/UndefinedReferenceException.java rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/lexer/Char.java (96%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/lexer/Lexer.java (96%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/lexer/LookaheadStream.java (97%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/lexer/SourcePosition.java (93%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/lexer/Token.java (98%) create mode 100644 common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/BinaryOperator.java rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/parser/ParseException.java (88%) create mode 100644 common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/Parser.java create mode 100644 common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/UnaryOperator.java rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/semanticanalysis/FunctionReferenceAnalyzer.java (66%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/semanticanalysis/ScopeAnalyzer.java (79%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/semanticanalysis/SemanticAnalyzer.java (66%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/semanticanalysis/TypeChecker.java (89%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/util/ASMUtil.java (81%) rename common/addons/{structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript => structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2}/util/OrdinalUtil.java (85%) rename common/addons/{structure-terrascript-loader-v1 => structure-terrascript-v2}/src/main/resources/terra.addon.yml (73%) rename common/addons/{structure-terrascript-loader => structure-terrascript-v2}/src/test/java/codegen/CodeGenTest.java (87%) rename common/addons/{structure-terrascript-loader => structure-terrascript-v2}/src/test/java/lexer/LexerTest.java (73%) rename common/addons/{structure-terrascript-loader => structure-terrascript-v2}/src/test/java/lexer/LookaheadStreamTest.java (94%) rename common/addons/{structure-terrascript-loader => structure-terrascript-v2}/src/test/java/semanticanalysis/SemanticAnalyzerTest.java (95%) diff --git a/common/addons/structure-terrascript-loader-v1/build.gradle.kts b/common/addons/structure-terrascript-loader-v1/build.gradle.kts deleted file mode 100644 index 18d4019b9..000000000 --- a/common/addons/structure-terrascript-loader-v1/build.gradle.kts +++ /dev/null @@ -1,15 +0,0 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - -version = version("1.1.0") - -dependencies { - api("commons-io:commons-io:2.7") - compileOnlyApi(project(":common:addons:manifest-addon-loader")) - implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) - testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) -} - -tasks.named("shadowJar") { - relocate("org.apache.commons", "com.dfsek.terra.addons.terrascript.lib.commons") - relocate("net.jafama", "com.dfsek.terra.addons.terrascript.lib.jafama") -} \ No newline at end of file diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java b/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java deleted file mode 100644 index f2e1d0055..000000000 --- a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.terrascript; - -import com.dfsek.terra.addons.manifest.api.AddonInitializer; -import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; -import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.addons.terrascript.script.StructureScript; -import com.dfsek.terra.api.Platform; -import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.event.functional.FunctionalEventHandler; -import com.dfsek.terra.api.inject.annotations.Inject; -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.api.structure.LootTable; -import com.dfsek.terra.api.structure.Structure; -import com.dfsek.terra.api.util.StringUtil; - - -public class TerraScriptAddon implements AddonInitializer { - @Inject - private Platform platform; - - @Inject - private BaseAddon addon; - - @Override - public void initialize() { - platform.getEventManager() - .getHandler(FunctionalEventHandler.class) - .register(addon, ConfigPackPreLoadEvent.class) - .then(event -> { - CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); - CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); - event.getPack().getLoader().open("", ".tesf").thenEntries( - entries -> - entries.stream() - .parallel() - .map(entry -> { - try { - String id = StringUtil.fileName(entry.getKey()); - return new StructureScript(entry.getValue(), - addon.key(id), - platform, - structureRegistry, - lootRegistry, - event.getPack().getOrCreateRegistry(FunctionBuilder.class)); - } catch(ParseException e) { - throw new RuntimeException("Failed to load script \"" + entry.getKey() + "\"", e); - } - }) - .toList() - .forEach(structureRegistry::register)) - .close(); - }) - .priority(100) - .failThrough(); - } -} diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java b/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java deleted file mode 100644 index 2b344343a..000000000 --- a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Copyright (c) 2020-2021 Polyhedral Development - * - * The Terra Core Addons are licensed under the terms of the MIT License. For more details, - * reference the LICENSE file in this module's root directory. - */ - -package com.dfsek.terra.addons.terrascript.parser; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; -import com.dfsek.terra.addons.terrascript.parser.lang.Block; -import com.dfsek.terra.addons.terrascript.parser.lang.Executable; -import com.dfsek.terra.addons.terrascript.parser.lang.Item; -import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; -import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; -import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; -import com.dfsek.terra.addons.terrascript.parser.lang.Scope.ScopeBuilder; -import com.dfsek.terra.addons.terrascript.parser.lang.constants.BooleanConstant; -import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression; -import com.dfsek.terra.addons.terrascript.parser.lang.constants.NumericConstant; -import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant; -import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; -import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow.BreakKeyword; -import com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow.ContinueKeyword; -import com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow.FailKeyword; -import com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow.ReturnKeyword; -import com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike.ForKeyword; -import com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike.IfKeyword; -import com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike.WhileKeyword; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.BooleanAndOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.BooleanNotOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.BooleanOrOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.ConcatenationOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.DivisionOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.ModuloOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.MultiplicationOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.NegationOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.NumberAdditionOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.SubtractionOperation; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.EqualsStatement; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.GreaterOrEqualsThanStatement; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.GreaterThanStatement; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.LessThanOrEqualsStatement; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.LessThanStatement; -import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.NotEqualsStatement; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.BoolAssignmentNode; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.NumAssignmentNode; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.StrAssignmentNode; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.VariableAssignmentNode; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.BoolVariableReferenceNode; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.NumVariableReferenceNode; -import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.StrVariableReferenceNode; -import com.dfsek.terra.addons.terrascript.tokenizer.Position; -import com.dfsek.terra.addons.terrascript.tokenizer.Token; -import com.dfsek.terra.addons.terrascript.tokenizer.Tokenizer; -import com.dfsek.terra.api.util.generic.pair.Pair; - - -@SuppressWarnings("unchecked") -public class Parser { - private final String data; - private final Map>> functions = new HashMap<>(); - private final List ignoredFunctions = new ArrayList<>(); - - public Parser(String data) { - this.data = data; - } - - public Parser registerFunction(String name, FunctionBuilder> functionBuilder) { - functions.put(name, functionBuilder); - return this; - } - - public Parser ignoreFunction(String name) { - ignoredFunctions.add(name); - return this; - } - - /** - * Parse input - * - * @return executable {@link Block} - * - * @throws ParseException If parsing fails. - */ - public Executable parse() { - ScopeBuilder scopeBuilder = new ScopeBuilder(); - return new Executable(parseBlock(new Tokenizer(data), false, scopeBuilder), scopeBuilder); - } - - private Keyword parseLoopLike(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) throws ParseException { - - Token identifier = tokens.consume(); - ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP); - - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); - - return switch(identifier.getType()) { - case FOR_LOOP -> parseForLoop(tokens, identifier.getPosition(), scopeBuilder); - case IF_STATEMENT -> parseIfStatement(tokens, identifier.getPosition(), loop, scopeBuilder); - case WHILE_LOOP -> parseWhileLoop(tokens, identifier.getPosition(), scopeBuilder); - default -> throw new UnsupportedOperationException( - "Unknown keyword " + identifier.getContent() + ": " + identifier.getPosition()); - }; - } - - private WhileKeyword parseWhileLoop(Tokenizer tokens, Position start, ScopeBuilder scopeBuilder) { - Returnable first = parseExpression(tokens, true, scopeBuilder); - ParserUtil.checkReturnType(first, Returnable.ReturnType.BOOLEAN); - - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - - return new WhileKeyword(parseStatementBlock(tokens, true, scopeBuilder), (Returnable) first, start); // While loop - } - - private IfKeyword parseIfStatement(Tokenizer tokens, Position start, boolean loop, ScopeBuilder scopeBuilder) { - Returnable condition = parseExpression(tokens, true, scopeBuilder); - ParserUtil.checkReturnType(condition, Returnable.ReturnType.BOOLEAN); - - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - - Block elseBlock = null; - Block statement = parseStatementBlock(tokens, loop, scopeBuilder); - - List, Block>> elseIf = new ArrayList<>(); - - while(tokens.hasNext() && tokens.get().getType().equals(Token.Type.ELSE)) { - tokens.consume(); // Consume else. - if(tokens.get().getType().equals(Token.Type.IF_STATEMENT)) { - tokens.consume(); // Consume if. - Returnable elseCondition = parseExpression(tokens, true, scopeBuilder); - ParserUtil.checkReturnType(elseCondition, Returnable.ReturnType.BOOLEAN); - elseIf.add(Pair.of((Returnable) elseCondition, parseStatementBlock(tokens, loop, scopeBuilder))); - } else { - elseBlock = parseStatementBlock(tokens, loop, scopeBuilder); - break; // Else must be last. - } - } - - return new IfKeyword(statement, (Returnable) condition, elseIf, elseBlock, start); // If statement - } - - private Block parseStatementBlock(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { - - if(tokens.get().getType().equals(Token.Type.BLOCK_BEGIN)) { - ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); - Block block = parseBlock(tokens, loop, scopeBuilder); - ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); - return block; - } else { - Position position = tokens.get().getPosition(); - Block block = new Block(Collections.singletonList(parseItem(tokens, loop, scopeBuilder)), position); - ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); - return block; - } - } - - private ForKeyword parseForLoop(Tokenizer tokens, Position start, ScopeBuilder scopeBuilder) { - scopeBuilder = scopeBuilder.sub(); // new scope - Token f = tokens.get(); - ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); - Item initializer; - if(f.isVariableDeclaration()) { - VariableAssignmentNode forVar = parseVariableDeclaration(tokens, scopeBuilder); - Token name = tokens.get(); - if(functions.containsKey(name.getContent()) || scopeBuilder.contains(name.getContent())) - throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); - initializer = forVar; - } else initializer = parseExpression(tokens, true, scopeBuilder); - ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); - Returnable conditional = parseExpression(tokens, true, scopeBuilder); - ParserUtil.checkReturnType(conditional, Returnable.ReturnType.BOOLEAN); - ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); - - Item incrementer; - Token token = tokens.get(); - if(scopeBuilder.contains(token.getContent())) { // Assume variable assignment - incrementer = parseAssignment(tokens, scopeBuilder); - } else incrementer = parseFunction(tokens, true, scopeBuilder); - - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - - return new ForKeyword(parseStatementBlock(tokens, true, scopeBuilder), initializer, (Returnable) conditional, incrementer, - start); - } - - private Returnable parseExpression(Tokenizer tokens, boolean full, ScopeBuilder scopeBuilder) { - boolean booleanInverted = false; // Check for boolean not operator - boolean negate = false; - if(tokens.get().getType().equals(Token.Type.BOOLEAN_NOT)) { - booleanInverted = true; - tokens.consume(); - } else if(tokens.get().getType().equals(Token.Type.SUBTRACTION_OPERATOR)) { - negate = true; - tokens.consume(); - } - - Token id = tokens.get(); - - ParserUtil.checkType(id, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.GROUP_BEGIN); - - Returnable expression; - if(id.isConstant()) { - expression = parseConstantExpression(tokens); - } else if(id.getType().equals(Token.Type.GROUP_BEGIN)) { // Parse grouped expression - expression = parseGroup(tokens, scopeBuilder); - } else { - if(functions.containsKey(id.getContent())) - expression = parseFunction(tokens, false, scopeBuilder); - else if(scopeBuilder.contains(id.getContent())) { - ParserUtil.checkType(tokens.consume(), Token.Type.IDENTIFIER); - String varId = id.getContent(); - ReturnType varType = scopeBuilder.getType(varId); - expression = switch(varType) { - case NUMBER -> new NumVariableReferenceNode(id.getPosition(), varType, scopeBuilder.getIndex(varId)); - case STRING -> new StrVariableReferenceNode(id.getPosition(), varType, scopeBuilder.getIndex(varId)); - case BOOLEAN -> new BoolVariableReferenceNode(id.getPosition(), varType, scopeBuilder.getIndex(varId)); - default -> throw new ParseException("Illegal type for variable reference: " + varType, id.getPosition()); - }; - - } else throw new ParseException("Unexpected token \" " + id.getContent() + "\"", id.getPosition()); - } - - if(booleanInverted) { // Invert operation if boolean not detected - ParserUtil.checkReturnType(expression, Returnable.ReturnType.BOOLEAN); - expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); - } else if(negate) { - ParserUtil.checkReturnType(expression, Returnable.ReturnType.NUMBER); - expression = new NegationOperation((Returnable) expression, expression.getPosition()); - } - - if(full && tokens.get().isBinaryOperator()) { // Parse binary operations - return parseBinaryOperation(expression, tokens, scopeBuilder); - } - return expression; - } - - private ConstantExpression parseConstantExpression(Tokenizer tokens) { - Token constantToken = tokens.consume(); - Position position = constantToken.getPosition(); - switch(constantToken.getType()) { - case NUMBER: - String content = constantToken.getContent(); - return new NumericConstant(content.contains(".") ? Double.parseDouble(content) : Integer.parseInt(content), position); - case STRING: - return new StringConstant(constantToken.getContent(), position); - case BOOLEAN: - return new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position); - default: - throw new UnsupportedOperationException( - "Unsupported constant token: " + constantToken.getType() + " at position: " + position); - } - } - - private Returnable parseGroup(Tokenizer tokens, ScopeBuilder scopeBuilder) { - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); - Returnable expression = parseExpression(tokens, true, scopeBuilder); // Parse inside of group as a separate expression - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - return expression; - } - - private BinaryOperation parseBinaryOperation(Returnable left, Tokenizer tokens, - ScopeBuilder scopeBuilder) { - Token binaryOperator = tokens.consume(); - ParserUtil.checkBinaryOperator(binaryOperator); - - Returnable right = parseExpression(tokens, false, scopeBuilder); - - Token other = tokens.get(); - if(ParserUtil.hasPrecedence(binaryOperator.getType(), other.getType())) { - return assemble(left, parseBinaryOperation(right, tokens, scopeBuilder), binaryOperator); - } else if(other.isBinaryOperator()) { - return parseBinaryOperation(assemble(left, right, binaryOperator), tokens, scopeBuilder); - } - return assemble(left, right, binaryOperator); - } - - private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) { - if(binaryOperator.isStrictNumericOperator()) - ParserUtil.checkArithmeticOperation(left, right, binaryOperator); // Numeric type checking - if(binaryOperator.isStrictBooleanOperator()) ParserUtil.checkBooleanOperation(left, right, binaryOperator); // Boolean type checking - switch(binaryOperator.getType()) { - case ADDITION_OPERATOR: - if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { - return new NumberAdditionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - } - return new ConcatenationOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case SUBTRACTION_OPERATOR: - return new SubtractionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case MULTIPLICATION_OPERATOR: - return new MultiplicationOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case DIVISION_OPERATOR: - return new DivisionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case EQUALS_OPERATOR: - return new EqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case NOT_EQUALS_OPERATOR: - return new NotEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case GREATER_THAN_OPERATOR: - return new GreaterThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case LESS_THAN_OPERATOR: - return new LessThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case GREATER_THAN_OR_EQUALS_OPERATOR: - return new GreaterOrEqualsThanStatement((Returnable) left, (Returnable) right, - binaryOperator.getPosition()); - case LESS_THAN_OR_EQUALS_OPERATOR: - return new LessThanOrEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case BOOLEAN_AND: - return new BooleanAndOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case BOOLEAN_OR: - return new BooleanOrOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case MODULO_OPERATOR: - return new ModuloOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - default: - throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); - } - } - - private VariableAssignmentNode parseVariableDeclaration(Tokenizer tokens, ScopeBuilder scopeBuilder) { - Token type = tokens.consume(); - ParserUtil.checkType(type, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); - - Returnable.ReturnType returnType = ParserUtil.getVariableReturnType(type); - - ParserUtil.checkVarType(type, returnType); // Check for type mismatch - Token identifier = tokens.consume(); - ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); - if(functions.containsKey(identifier.getContent()) || scopeBuilder.contains(identifier.getContent())) - throw new ParseException(identifier.getContent() + " is already defined in this scope", identifier.getPosition()); - ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); - - Returnable value = parseExpression(tokens, true, scopeBuilder); - ParserUtil.checkReturnType(value, returnType); - - String id = identifier.getContent(); - - return switch(value.returnType()) { - case NUMBER -> new NumAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.num(id)); - case STRING -> new StrAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.str(id)); - case BOOLEAN -> new BoolAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.bool(id)); - default -> throw new ParseException("Illegal type for variable declaration: " + type, value.getPosition()); - }; - } - - private Block parseBlock(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { - List> parsedItems = new ArrayList<>(); - - scopeBuilder = scopeBuilder.sub(); - - Token first = tokens.get(); - - while(tokens.hasNext()) { - Token token = tokens.get(); - if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. - Item parsedItem = parseItem(tokens, loop, scopeBuilder); - if(parsedItem != Function.NULL) { - parsedItems.add(parsedItem); - } - if(tokens.hasNext() && !token.isLoopLike()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); - } - return new Block(parsedItems, first.getPosition()); - } - - private Item parseItem(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { - Token token = tokens.get(); - if(loop) ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, - Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, - Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); - else ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, - Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, - Token.Type.FAIL); - - if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) - return parseLoopLike(tokens, loop, scopeBuilder); - } else if(token.isIdentifier()) { // Parse identifiers - if(scopeBuilder.contains(token.getContent())) { // Assume variable assignment - return parseAssignment(tokens, scopeBuilder); - } else return parseFunction(tokens, true, scopeBuilder); - } else if(token.isVariableDeclaration()) { - - return parseVariableDeclaration(tokens, scopeBuilder); - - } else if(token.getType().equals(Token.Type.RETURN)) return new ReturnKeyword(tokens.consume().getPosition()); - else if(token.getType().equals(Token.Type.BREAK)) return new BreakKeyword(tokens.consume().getPosition()); - else if(token.getType().equals(Token.Type.CONTINUE)) return new ContinueKeyword(tokens.consume().getPosition()); - else if(token.getType().equals(Token.Type.FAIL)) return new FailKeyword(tokens.consume().getPosition()); - else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); - } - - private VariableAssignmentNode parseAssignment(Tokenizer tokens, ScopeBuilder scopeBuilder) { - Token identifier = tokens.consume(); - - ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); - - ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); - - Returnable value = parseExpression(tokens, true, scopeBuilder); - - String id = identifier.getContent(); - - ParserUtil.checkReturnType(value, scopeBuilder.getType(id)); - - ReturnType type = value.returnType(); - - return switch(type) { - case NUMBER -> new NumAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.getIndex(id)); - case STRING -> new StrAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.getIndex(id)); - case BOOLEAN -> new BoolAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.getIndex(id)); - default -> throw new ParseException("Illegal type for variable assignment: " + type, value.getPosition()); - }; - } - - private Function parseFunction(Tokenizer tokens, boolean fullStatement, ScopeBuilder scopeBuilder) { - Token identifier = tokens.consume(); - ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier - - if(!functions.containsKey(identifier.getContent())) - throw new ParseException("No such function \"" + identifier.getContent() + "\"", identifier.getPosition()); - - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); // Second is body begin - - - List> args = getArgs(tokens, scopeBuilder); // Extract arguments, consume the rest. - - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); // Remove body end - - if(fullStatement) ParserUtil.checkType(tokens.get(), Token.Type.STATEMENT_END); - - if(ignoredFunctions.contains(identifier.getContent())) { - return Function.NULL; - } - - if(functions.containsKey(identifier.getContent())) { - FunctionBuilder builder = functions.get(identifier.getContent()); - - if(builder.argNumber() != -1 && args.size() != builder.argNumber()) - throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size(), identifier.getPosition()); - - for(int i = 0; i < args.size(); i++) { - Returnable argument = args.get(i); - if(builder.getArgument(i) == null) - throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent(), - identifier.getPosition()); - ParserUtil.checkReturnType(argument, builder.getArgument(i)); - } - return builder.build(args, identifier.getPosition()); - } - throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); - } - - private List> getArgs(Tokenizer tokens, ScopeBuilder scopeBuilder) { - List> args = new ArrayList<>(); - - while(!tokens.get().getType().equals(Token.Type.GROUP_END)) { - args.add(parseExpression(tokens, true, scopeBuilder)); - ParserUtil.checkType(tokens.get(), Token.Type.SEPARATOR, Token.Type.GROUP_END); - if(tokens.get().getType().equals(Token.Type.SEPARATOR)) tokens.consume(); - } - return args; - } -} diff --git a/common/addons/structure-terrascript-loader/build.gradle.kts b/common/addons/structure-terrascript-loader/build.gradle.kts index 415249f99..18d4019b9 100644 --- a/common/addons/structure-terrascript-loader/build.gradle.kts +++ b/common/addons/structure-terrascript-loader/build.gradle.kts @@ -4,8 +4,6 @@ version = version("1.1.0") dependencies { api("commons-io:commons-io:2.7") - api("org.ow2.asm:asm:9.5") - api("org.ow2.asm:asm-commons:9.5") compileOnlyApi(project(":common:addons:manifest-addon-loader")) implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) @@ -14,232 +12,4 @@ dependencies { tasks.named("shadowJar") { relocate("org.apache.commons", "com.dfsek.terra.addons.terrascript.lib.commons") relocate("net.jafama", "com.dfsek.terra.addons.terrascript.lib.jafama") -} - -val astSourceSet = buildDir.resolve("generated/ast") -val astPackage = astSourceSet.resolve("com/dfsek/terra/addons/terrascript/ast") - -data class ASTClass( - val name: String, - val imports: List, - val nodes: List, - val constructorFields: List> = emptyList(), -) - -data class ASTNode( - val name: String, - val constructorFields: List>, - val mutableFields: List> = emptyList() // TODO - Remove mutability from AST nodes - -) - -// Auto generate AST classes rather than writing them by hand -tasks.register("genTerrascriptAstClasses") { - - - val packageName = astPackage.toRelativeString(astSourceSet).replace('/', '.') - fun generateClass(clazz: ASTClass) { - val src = StringBuilder() - src.appendLine("package $packageName;\n"); - for (imprt in clazz.imports) src.appendLine("import $imprt;") - src.appendLine(""" - - /** - * Auto-generated class via genTerrascriptAstClasses gradle task - */ - public abstract class ${clazz.name} { - - """.trimIndent()) - - for (field in clazz.constructorFields) { - src.appendLine(" public final ${field.second} ${field.first};") - } - - src.appendLine(""" - | - | public ${clazz.name}(${clazz.constructorFields.joinToString { "${it.second} ${it.first}" }}) { - """.trimMargin()) - - for (field in clazz.constructorFields) { - src.appendLine(" this.${field.first} = ${field.first};") - } - - src.appendLine(""" - | } - | - | public interface Visitor { - | - """.trimMargin()) - for (node in clazz.nodes) { - src.appendLine(" R visit${node.name}${clazz.name}(${node.name} ${clazz.name.toLowerCase()});") - } - - src.appendLine(""" - | - | } - | - | public abstract R accept(Visitor visitor); - """.trimMargin()) - - for (node in clazz.nodes) { - src.appendLine() - // Inner class declaration - src.appendLine(" public static class ${node.name} extends ${clazz.name} {\n") - - // Add fields - for (field in node.constructorFields) { - src.appendLine(" public final ${field.second} ${field.first};") - } - for (field in node.mutableFields) { - src.appendLine(" private ${field.second} ${field.first};") - } - src.appendLine() - - // Add constructor - src.appendLine(""" - | public ${node.name}(${node.constructorFields.plus(clazz.constructorFields).joinToString { "${it.second} ${it.first}" }}) { - | super(${clazz.constructorFields.joinToString { it.first }}); - """.trimMargin()) - - for (field in node.constructorFields) { - src.appendLine(" this.${field.first} = ${field.first};") - } - src.appendLine(" }") - - // Add getters and setters for mutable fields - for (field in node.mutableFields) { - src.appendLine(""" - | - | public void set${field.first.capitalize()}(${field.second} value) { - | this.${field.first} = value; - | } - | - | public ${field.second} get${field.first.capitalize()}() { - | if (this.${field.first} == null) throw new RuntimeException("Compilation bug! Field ${field.first} has not been set yet"); - | return this.${field.first}; - | } - """.trimMargin()) - } - - src.appendLine(""" - | - | @Override - | public R accept(Visitor visitor) { - | return visitor.visit${node.name}${clazz.name}(this); - | } - | } - """.trimMargin()) - } - src.appendLine("}") - val outputFile = astPackage.resolve("${clazz.name}.java") - outputFile.writeText(src.toString()) - } - - doLast { - astSourceSet.deleteRecursively() - astPackage.mkdirs() - - listOf( - ASTClass( - "Expr", - listOf( - "com.dfsek.terra.addons.terrascript.Type", - "com.dfsek.terra.addons.terrascript.parser.UnaryOperator", - "com.dfsek.terra.addons.terrascript.parser.BinaryOperator", - "com.dfsek.terra.addons.terrascript.Environment", - "com.dfsek.terra.addons.terrascript.Environment.Symbol", - "com.dfsek.terra.addons.terrascript.lexer.SourcePosition", - "java.util.List", - ), - listOf( - ASTNode("Binary", listOf("left" to "Expr", "operator" to "BinaryOperator", "right" to "Expr")), - ASTNode("Grouping", listOf("expression" to "Expr")), - ASTNode("Literal", listOf("value" to "Object", "type" to "Type")), - ASTNode("Unary", listOf("operator" to "UnaryOperator", "operand" to "Expr")), - ASTNode("Call", listOf("identifier" to "String", "arguments" to "List"), listOf("environment" to "Environment", "symbol" to "Symbol.Function")), - ASTNode("Variable", listOf("identifier" to "String"), listOf("symbol" to "Symbol.Variable")), - ASTNode("Assignment", listOf("lValue" to "Variable", "rValue" to "Expr")), - ASTNode("Void", listOf()), - ), - listOf("position" to "SourcePosition") - ), - ASTClass( - "Stmt", - listOf( - "com.dfsek.terra.addons.terrascript.Type", - "com.dfsek.terra.api.util.generic.pair.Pair", - "com.dfsek.terra.addons.terrascript.Environment.Symbol", - "com.dfsek.terra.addons.terrascript.lexer.SourcePosition", - "java.util.List", - "java.util.Optional", - ), - listOf( - ASTNode("Expression", listOf("expression" to "Expr")), - ASTNode("Block", listOf("statements" to "List")), - ASTNode("FunctionDeclaration", listOf("identifier" to "String", "parameters" to "List>", "returnType" to "Type", "body" to "Block"), listOf("symbol" to "Symbol.Function")), - ASTNode("VariableDeclaration", listOf("type" to "Type", "identifier" to "String", "value" to "Expr")), - ASTNode("Return", listOf("value" to "Expr"), listOf("type" to "Type")), - ASTNode("If", listOf("condition" to "Expr", "trueBody" to "Block", "elseIfClauses" to "List>", "elseBody" to "Optional")), - ASTNode("For", listOf("initializer" to "Stmt", "condition" to "Expr", "incrementer" to "Expr", "body" to "Block")), - ASTNode("While", listOf("condition" to "Expr", "body" to "Block")), - ASTNode("NoOp", listOf()), - ASTNode("Break", listOf()), - ASTNode("Continue", listOf()), - ), - listOf("position" to "SourcePosition") - ), - ASTClass( - "TypedExpr", - listOf( - "com.dfsek.terra.addons.terrascript.Type", - "com.dfsek.terra.addons.terrascript.parser.UnaryOperator", - "com.dfsek.terra.addons.terrascript.parser.BinaryOperator", - "java.util.List", - ), - listOf( - ASTNode("Binary", listOf("left" to "TypedExpr", "operator" to "BinaryOperator", "right" to "TypedExpr")), - ASTNode("Grouping", listOf("expression" to "TypedExpr")), - ASTNode("Literal", listOf("value" to "Object")), - ASTNode("Unary", listOf("operator" to "UnaryOperator", "operand" to "TypedExpr")), - ASTNode("Call", listOf("identifier" to "String", "arguments" to "List", "scopedIdentifier" to "String")), - ASTNode("Variable", listOf("identifier" to "String")), - ASTNode("Assignment", listOf("lValue" to "Variable", "rValue" to "TypedExpr")), - ASTNode("Void", listOf()), - ), - listOf("type" to "Type") - ), - ASTClass( - "TypedStmt", - listOf( - "com.dfsek.terra.addons.terrascript.Type", - "com.dfsek.terra.api.util.generic.pair.Pair", - "java.util.List", - "java.util.Optional", - ), - listOf( - ASTNode("Expression", listOf("expression" to "TypedExpr")), - ASTNode("Block", listOf("statements" to "List")), - ASTNode("FunctionDeclaration", listOf("identifier" to "String", "parameters" to "List>", "returnType" to "Type", "body" to "Block", "scopedIdentifier" to "String")), - ASTNode("VariableDeclaration", listOf("type" to "Type", "identifier" to "String", "value" to "TypedExpr")), - ASTNode("Return", listOf("value" to "TypedExpr")), - ASTNode("If", listOf("condition" to "TypedExpr", "trueBody" to "Block", "elseIfClauses" to "List>", "elseBody" to "Optional")), - ASTNode("For", listOf("initializer" to "TypedStmt", "condition" to "TypedExpr", "incrementer" to "TypedExpr", "body" to "Block")), - ASTNode("While", listOf("condition" to "TypedExpr", "body" to "Block")), - ASTNode("NoOp", listOf()), - ASTNode("Break", listOf()), - ASTNode("Continue", listOf()), - ), - ), - ).forEach(::generateClass) - } -} - -tasks.getByName("compileJava") { - dependsOn("genTerrascriptAstClasses") -} - -sourceSets.getByName("main") { - java { - srcDirs(astSourceSet) - } -} +} \ No newline at end of file diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java index 8606df862..f2e1d0055 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java @@ -8,6 +8,9 @@ package com.dfsek.terra.addons.terrascript; import com.dfsek.terra.addons.manifest.api.AddonInitializer; +import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.addons.terrascript.script.StructureScript; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; @@ -28,14 +31,12 @@ public class TerraScriptAddon implements AddonInitializer { @Override public void initialize() { - platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .then(event -> { CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); - /* event.getPack().getLoader().open("", ".tesf").thenEntries( entries -> entries.stream() @@ -56,8 +57,6 @@ public class TerraScriptAddon implements AddonInitializer { .toList() .forEach(structureRegistry::register)) .close(); - - */ }) .priority(100) .failThrough(); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/IdentifierAlreadyDeclaredException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/IdentifierAlreadyDeclaredException.java deleted file mode 100644 index 983974559..000000000 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/IdentifierAlreadyDeclaredException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.addons.terrascript.exception.semanticanalysis; - -import com.dfsek.terra.addons.terrascript.exception.CompilationException; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; - - -public class IdentifierAlreadyDeclaredException extends CompilationException { - public IdentifierAlreadyDeclaredException(String message, SourcePosition position) { - super(message, position); - } -} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/InvalidFunctionDeclarationException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/InvalidFunctionDeclarationException.java deleted file mode 100644 index c2a908dd2..000000000 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/InvalidFunctionDeclarationException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.addons.terrascript.exception.semanticanalysis; - -import com.dfsek.terra.addons.terrascript.exception.CompilationException; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; - - -public class InvalidFunctionDeclarationException extends CompilationException { - public InvalidFunctionDeclarationException(String message, SourcePosition position) { - super(message, position); - } -} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/InvalidTypeException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/InvalidTypeException.java deleted file mode 100644 index 379c2de15..000000000 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/InvalidTypeException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.addons.terrascript.exception.semanticanalysis; - -import com.dfsek.terra.addons.terrascript.exception.CompilationException; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; - - -public class InvalidTypeException extends CompilationException { - public InvalidTypeException(String message, SourcePosition position) { - super(message, position); - } -} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/UndefinedReferenceException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/UndefinedReferenceException.java deleted file mode 100644 index 8df64df04..000000000 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/semanticanalysis/UndefinedReferenceException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.addons.terrascript.exception.semanticanalysis; - -import com.dfsek.terra.addons.terrascript.exception.CompilationException; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; - - -public class UndefinedReferenceException extends CompilationException { - public UndefinedReferenceException(String message, SourcePosition position) { - super(message, position); - } -} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/BinaryOperator.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/BinaryOperator.java deleted file mode 100644 index a70137915..000000000 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/BinaryOperator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.addons.terrascript.parser; - - -import com.dfsek.terra.addons.terrascript.lexer.Token.TokenType; - - -public enum BinaryOperator { - BOOLEAN_OR(TokenType.BOOLEAN_OR), - BOOLEAN_AND(TokenType.BOOLEAN_AND), - EQUALS(TokenType.EQUALS_EQUALS), - NOT_EQUALS(TokenType.BANG_EQUALS), - GREATER(TokenType.GREATER), - GREATER_EQUALS(TokenType.GREATER_EQUAL), - LESS(TokenType.LESS), - LESS_EQUALS(TokenType.LESS_EQUALS), - ADD(TokenType.PLUS), - SUBTRACT(TokenType.MINUS), - MULTIPLY(TokenType.STAR), - DIVIDE(TokenType.FORWARD_SLASH), - MODULO(TokenType.MODULO_OPERATOR); - - public final TokenType tokenType; - - BinaryOperator(TokenType tokenType) { this.tokenType = tokenType; } -} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java index 5fb4b278c..2b344343a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java @@ -1,379 +1,468 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra Core Addons are licensed under the terms of the MIT License. For more details, + * reference the LICENSE file in this module's root directory. + */ + package com.dfsek.terra.addons.terrascript.parser; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Supplier; +import java.util.Map; -import com.dfsek.terra.addons.terrascript.Type; -import com.dfsek.terra.addons.terrascript.Type.TypeException; -import com.dfsek.terra.addons.terrascript.ast.Expr; -import com.dfsek.terra.addons.terrascript.ast.Expr.Variable; -import com.dfsek.terra.addons.terrascript.ast.Stmt; -import com.dfsek.terra.addons.terrascript.ast.Stmt.Block; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; -import com.dfsek.terra.addons.terrascript.lexer.Token; -import com.dfsek.terra.addons.terrascript.lexer.Token.TokenType; +import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; +import com.dfsek.terra.addons.terrascript.parser.lang.Block; +import com.dfsek.terra.addons.terrascript.parser.lang.Executable; +import com.dfsek.terra.addons.terrascript.parser.lang.Item; +import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; +import com.dfsek.terra.addons.terrascript.parser.lang.Scope.ScopeBuilder; +import com.dfsek.terra.addons.terrascript.parser.lang.constants.BooleanConstant; +import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression; +import com.dfsek.terra.addons.terrascript.parser.lang.constants.NumericConstant; +import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow.BreakKeyword; +import com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow.ContinueKeyword; +import com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow.FailKeyword; +import com.dfsek.terra.addons.terrascript.parser.lang.keywords.flow.ReturnKeyword; +import com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike.ForKeyword; +import com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike.IfKeyword; +import com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike.WhileKeyword; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.BooleanAndOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.BooleanNotOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.BooleanOrOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.ConcatenationOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.DivisionOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.ModuloOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.MultiplicationOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.NegationOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.NumberAdditionOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.SubtractionOperation; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.EqualsStatement; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.GreaterOrEqualsThanStatement; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.GreaterThanStatement; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.LessThanOrEqualsStatement; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.LessThanStatement; +import com.dfsek.terra.addons.terrascript.parser.lang.operations.statements.NotEqualsStatement; +import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.BoolAssignmentNode; +import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.NumAssignmentNode; +import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.StrAssignmentNode; +import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.VariableAssignmentNode; +import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.BoolVariableReferenceNode; +import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.NumVariableReferenceNode; +import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.StrVariableReferenceNode; +import com.dfsek.terra.addons.terrascript.tokenizer.Position; +import com.dfsek.terra.addons.terrascript.tokenizer.Token; +import com.dfsek.terra.addons.terrascript.tokenizer.Tokenizer; import com.dfsek.terra.api.util.generic.pair.Pair; -/** - * TerraScript recursive descent parser - */ +@SuppressWarnings("unchecked") public class Parser { + private final String data; + private final Map>> functions = new HashMap<>(); + private final List ignoredFunctions = new ArrayList<>(); - private final List tokens; - - private int index = 0; - - private Parser(List tokens) { - if(tokens.stream().noneMatch(t -> t.isType(TokenType.END_OF_FILE))) - throw new IllegalArgumentException("Token list must contain at least one token of type " + TokenType.END_OF_FILE); - this.tokens = tokens; + public Parser(String data) { + this.data = data; } - public static Block parse(List tokens) { - return new Parser(tokens).parseTokens(); + public Parser registerFunction(String name, FunctionBuilder> functionBuilder) { + functions.put(name, functionBuilder); + return this; } - private Block parseTokens() { - List statements = new ArrayList<>(); - while(hasNext()) { - statements.add(statement()); - } - if(hasNext()) throw new ParseException("Tokens were remaining after parsing", current().position()); - return new Stmt.Block(statements, new SourcePosition(0, 0)); + public Parser ignoreFunction(String name) { + ignoredFunctions.add(name); + return this; } - private Token current() { - return tokens.get(index); + /** + * Parse input + * + * @return executable {@link Block} + * + * @throws ParseException If parsing fails. + */ + public Executable parse() { + ScopeBuilder scopeBuilder = new ScopeBuilder(); + return new Executable(parseBlock(new Tokenizer(data), false, scopeBuilder), scopeBuilder); } - private boolean hasNext() { - return !current().isType(TokenType.END_OF_FILE); - } - - private Token consume(String wrongTypeMessage, TokenType expected, TokenType... more) { - if(!current().isType(expected) && Arrays.stream(more).noneMatch(t -> t == current().type())) throw new ParseException( - wrongTypeMessage, current().position()); - return consumeUnchecked(); - } - - public Token consumeUnchecked() { - if(!hasNext()) return current(); - Token temp = current(); - index++; - return temp; - } - - private void consumeStatementEnd(String after) { - consume("Expected ';' after " + after + ", found '" + current().lexeme() + "'", TokenType.STATEMENT_END); - } - - private Stmt statement() { - return switch(current().type()) { - case BLOCK_BEGIN -> block(); - case FUNCTION -> functionDeclaration(); - case VARIABLE -> variableDeclaration(); - case RETURN -> returnStmt(); - case IF_STATEMENT -> ifStmt(); - case FOR_LOOP -> forLoop(); - case WHILE_LOOP -> whileLoop(); - case BREAK -> breakStmt(); - case CONTINUE -> continueStmt(); - case STATEMENT_END -> new Stmt.NoOp(consumeUnchecked().position()); - default -> expressionStatement(); + private Keyword parseLoopLike(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) throws ParseException { + + Token identifier = tokens.consume(); + ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP); + + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); + + return switch(identifier.getType()) { + case FOR_LOOP -> parseForLoop(tokens, identifier.getPosition(), scopeBuilder); + case IF_STATEMENT -> parseIfStatement(tokens, identifier.getPosition(), loop, scopeBuilder); + case WHILE_LOOP -> parseWhileLoop(tokens, identifier.getPosition(), scopeBuilder); + default -> throw new UnsupportedOperationException( + "Unknown keyword " + identifier.getContent() + ": " + identifier.getPosition()); }; } - private Stmt functionDeclaration() { - SourcePosition position = consume("Expected 'fun' keyword at start of function declaration", TokenType.FUNCTION).position(); - String id = consume("Expected identifier after 'fun' keyword for function declaration", TokenType.IDENTIFIER).lexeme(); - consume("Expected '(' after function identifier '" + id + "'", TokenType.OPEN_PAREN); + private WhileKeyword parseWhileLoop(Tokenizer tokens, Position start, ScopeBuilder scopeBuilder) { + Returnable first = parseExpression(tokens, true, scopeBuilder); + ParserUtil.checkReturnType(first, Returnable.ReturnType.BOOLEAN); - // Parse parameters - List> params = new ArrayList<>(); - while(!current().isType(TokenType.CLOSE_PAREN)) { - Token paramToken = consume("Expected parameter name or ')', found '" + current().lexeme() + "'", TokenType.IDENTIFIER); - String paramId = paramToken.lexeme(); - if(params.stream().anyMatch(p -> Objects.equals(p.getLeft(), paramId))) - throw new ParseException("Parameter '" + paramId + "' has already been declared in function '" + id + "'", - paramToken.position()); - - consume("Expected type declaration after parameter name. Example: '" + paramId + ": '", TokenType.COLON); - Type paramType = typeExpr(); - - params.add(Pair.of(paramId, paramType)); - - if(current().isType(TokenType.CLOSE_PAREN)) break; - consume("Expected ',' or ')' after parameter declaration '" + paramId + "' in function '" + id + "'", TokenType.SEPARATOR); - } + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - Type funcReturn = Type.VOID; - - consume("Expected ')' after " + (params.size() == 0 ? "')'" : "parameters") + " in declaration of function '" + id + "'", - TokenType.CLOSE_PAREN); - if(current().isType(TokenType.COLON)) { - consumeUnchecked(); - funcReturn = typeExpr(); - } - - Stmt.Block body = blockOrSingleStatement(); - - return new Stmt.FunctionDeclaration(id, params, funcReturn, body, position); + return new WhileKeyword(parseStatementBlock(tokens, true, scopeBuilder), (Returnable) first, start); // While loop } - private Stmt.VariableDeclaration variableDeclaration() { - SourcePosition position = consume("Expected 'var' keyword at start of variable declaration", TokenType.VARIABLE).position(); - String id = consume("Expected variable name after type for variable declaration", TokenType.IDENTIFIER).lexeme(); - consume("Expected ':' after variable name", TokenType.COLON); - Type type = typeExpr(); - consume("Expected '=' following variable type declaration", TokenType.ASSIGNMENT); - Expr expr = expression(); - consumeStatementEnd("variable declaration"); + private IfKeyword parseIfStatement(Tokenizer tokens, Position start, boolean loop, ScopeBuilder scopeBuilder) { + Returnable condition = parseExpression(tokens, true, scopeBuilder); + ParserUtil.checkReturnType(condition, Returnable.ReturnType.BOOLEAN); - return new Stmt.VariableDeclaration(type, id, expr, position); - } - - private Type typeExpr() { - Token typeToken = consume("Expected " + TokenType.IDENTIFIER + " specified as variable type", TokenType.IDENTIFIER); - try { - return Type.fromString(typeToken.lexeme()); - } catch(TypeException e) { - throw new ParseException("Failed to parse type expression", typeToken.position()); - } - } - - private Stmt.Return returnStmt() { - SourcePosition position = consume("Expected 'return' keyword, found '" + current().lexeme() + "'", TokenType.RETURN).position(); - Expr value = new Expr.Void(position); - if(!current().isType(TokenType.STATEMENT_END)) - value = expression(); - consumeStatementEnd("return statement"); - return new Stmt.Return(value, position); - } - - private Stmt.If ifStmt() { - // Parse main if clause - SourcePosition position = consume("Expected 'if' keyword at beginning of if statement", TokenType.IF_STATEMENT).position(); - consume("Expected '(' after 'if' keyword", TokenType.OPEN_PAREN); - Expr condition = expression(); - consume("Expected ')' after if statement condition", TokenType.CLOSE_PAREN); - Stmt.Block trueBody = blockOrSingleStatement(); + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - // Parse any else clauses - Stmt.Block elseBody = null; - List> elseIfClauses = new ArrayList<>(); - while(current().isType(TokenType.ELSE)) { - consumeUnchecked(); // Consume else - - if(!current().isType(TokenType.IF_STATEMENT)) { - elseBody = blockOrSingleStatement(); - break; // Else clause should be last in if statement + Block elseBlock = null; + Block statement = parseStatementBlock(tokens, loop, scopeBuilder); + + List, Block>> elseIf = new ArrayList<>(); + + while(tokens.hasNext() && tokens.get().getType().equals(Token.Type.ELSE)) { + tokens.consume(); // Consume else. + if(tokens.get().getType().equals(Token.Type.IF_STATEMENT)) { + tokens.consume(); // Consume if. + Returnable elseCondition = parseExpression(tokens, true, scopeBuilder); + ParserUtil.checkReturnType(elseCondition, Returnable.ReturnType.BOOLEAN); + elseIf.add(Pair.of((Returnable) elseCondition, parseStatementBlock(tokens, loop, scopeBuilder))); + } else { + elseBlock = parseStatementBlock(tokens, loop, scopeBuilder); + break; // Else must be last. } - - consumeUnchecked(); // Consume if - consume("Expected '(' after 'else if', e.g. 'if else () ...'", TokenType.OPEN_PAREN); - Expr elseIfCondition = expression(); - consume("Expected ')' after 'else if' clause, e.g. 'else if () ...'", TokenType.CLOSE_PAREN); - Stmt.Block elseIfBody = blockOrSingleStatement(); - elseIfClauses.add(Pair.of(elseIfCondition, elseIfBody)); } - return new Stmt.If(condition, trueBody, elseIfClauses, Optional.ofNullable(elseBody), position); + return new IfKeyword(statement, (Returnable) condition, elseIf, elseBlock, start); // If statement } - private Stmt.For forLoop() { - SourcePosition position = consume("Expected 'for' keyword at beginning of for loop", TokenType.FOR_LOOP).position(); - consume("Expected '(' after 'for' keyword", TokenType.OPEN_PAREN); - Stmt initializer = statement(); - Expr condition; - if(current().isType(TokenType.STATEMENT_END)) { - condition = new Expr.Literal(true, Type.BOOLEAN, - current().position()); // If no condition is provided, set condition = true - consumeUnchecked(); + private Block parseStatementBlock(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { + + if(tokens.get().getType().equals(Token.Type.BLOCK_BEGIN)) { + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); + Block block = parseBlock(tokens, loop, scopeBuilder); + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); + return block; } else { - condition = expression(); - consumeStatementEnd("loop condition"); + Position position = tokens.get().getPosition(); + Block block = new Block(Collections.singletonList(parseItem(tokens, loop, scopeBuilder)), position); + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); + return block; } - Expr incrementer; - if(current().isType(TokenType.CLOSE_PAREN)) { - incrementer = null; - consumeUnchecked(); + } + + private ForKeyword parseForLoop(Tokenizer tokens, Position start, ScopeBuilder scopeBuilder) { + scopeBuilder = scopeBuilder.sub(); // new scope + Token f = tokens.get(); + ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); + Item initializer; + if(f.isVariableDeclaration()) { + VariableAssignmentNode forVar = parseVariableDeclaration(tokens, scopeBuilder); + Token name = tokens.get(); + if(functions.containsKey(name.getContent()) || scopeBuilder.contains(name.getContent())) + throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); + initializer = forVar; + } else initializer = parseExpression(tokens, true, scopeBuilder); + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); + Returnable conditional = parseExpression(tokens, true, scopeBuilder); + ParserUtil.checkReturnType(conditional, Returnable.ReturnType.BOOLEAN); + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); + + Item incrementer; + Token token = tokens.get(); + if(scopeBuilder.contains(token.getContent())) { // Assume variable assignment + incrementer = parseAssignment(tokens, scopeBuilder); + } else incrementer = parseFunction(tokens, true, scopeBuilder); + + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); + + return new ForKeyword(parseStatementBlock(tokens, true, scopeBuilder), initializer, (Returnable) conditional, incrementer, + start); + } + + private Returnable parseExpression(Tokenizer tokens, boolean full, ScopeBuilder scopeBuilder) { + boolean booleanInverted = false; // Check for boolean not operator + boolean negate = false; + if(tokens.get().getType().equals(Token.Type.BOOLEAN_NOT)) { + booleanInverted = true; + tokens.consume(); + } else if(tokens.get().getType().equals(Token.Type.SUBTRACTION_OPERATOR)) { + negate = true; + tokens.consume(); + } + + Token id = tokens.get(); + + ParserUtil.checkType(id, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.GROUP_BEGIN); + + Returnable expression; + if(id.isConstant()) { + expression = parseConstantExpression(tokens); + } else if(id.getType().equals(Token.Type.GROUP_BEGIN)) { // Parse grouped expression + expression = parseGroup(tokens, scopeBuilder); } else { - incrementer = expression(); - consume("Expected ')' after for loop incrementer", TokenType.CLOSE_PAREN); + if(functions.containsKey(id.getContent())) + expression = parseFunction(tokens, false, scopeBuilder); + else if(scopeBuilder.contains(id.getContent())) { + ParserUtil.checkType(tokens.consume(), Token.Type.IDENTIFIER); + String varId = id.getContent(); + ReturnType varType = scopeBuilder.getType(varId); + expression = switch(varType) { + case NUMBER -> new NumVariableReferenceNode(id.getPosition(), varType, scopeBuilder.getIndex(varId)); + case STRING -> new StrVariableReferenceNode(id.getPosition(), varType, scopeBuilder.getIndex(varId)); + case BOOLEAN -> new BoolVariableReferenceNode(id.getPosition(), varType, scopeBuilder.getIndex(varId)); + default -> throw new ParseException("Illegal type for variable reference: " + varType, id.getPosition()); + }; + + } else throw new ParseException("Unexpected token \" " + id.getContent() + "\"", id.getPosition()); } - Stmt.Block body = blockOrSingleStatement(); - return new Stmt.For(initializer, condition, incrementer, body, position); - } - - private Stmt.While whileLoop() { - SourcePosition position = consume("Expected 'for' keyword at beginning of while loop", TokenType.WHILE_LOOP).position(); - consume("Expected '(' after 'while' keyword", TokenType.OPEN_PAREN); - Expr condition = expression(); - consume("Expected ')' after while loop condition", TokenType.CLOSE_PAREN); - Stmt.Block body = blockOrSingleStatement(); - return new Stmt.While(condition, body, position); - } - - private Stmt.Break breakStmt() { - SourcePosition position = consume("Expected 'break' keyword for break statement", TokenType.BREAK).position(); - consumeStatementEnd("'break' keyword"); - return new Stmt.Break(position); - } - - private Stmt.Continue continueStmt() { - SourcePosition position = consume("Expected 'continue' keyword for continue statement", TokenType.CONTINUE).position(); - consumeStatementEnd("'continue' keyword"); - return new Stmt.Continue(position); - } - - private Stmt.Block blockOrSingleStatement() { - if(!current().isType(TokenType.BLOCK_BEGIN)) return new Stmt.Block(List.of(statement()), current().position()); - return block(); - } - - private Stmt.Block block() { - SourcePosition position = consume("Expected '{' at start of block", TokenType.BLOCK_BEGIN).position(); - List statements = new ArrayList<>(); - while(!current().isType(TokenType.BLOCK_END)) { - statements.add(statement()); + + if(booleanInverted) { // Invert operation if boolean not detected + ParserUtil.checkReturnType(expression, Returnable.ReturnType.BOOLEAN); + expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); + } else if(negate) { + ParserUtil.checkReturnType(expression, Returnable.ReturnType.NUMBER); + expression = new NegationOperation((Returnable) expression, expression.getPosition()); } - consume("Expected '}' at end of block", TokenType.BLOCK_END); - return new Stmt.Block(statements, position); + + if(full && tokens.get().isBinaryOperator()) { // Parse binary operations + return parseBinaryOperation(expression, tokens, scopeBuilder); + } + return expression; } - private Stmt expressionStatement() { - Expr expression = expression(); - consumeStatementEnd("expression statement"); - return new Stmt.Expression(expression, expression.position); + private ConstantExpression parseConstantExpression(Tokenizer tokens) { + Token constantToken = tokens.consume(); + Position position = constantToken.getPosition(); + switch(constantToken.getType()) { + case NUMBER: + String content = constantToken.getContent(); + return new NumericConstant(content.contains(".") ? Double.parseDouble(content) : Integer.parseInt(content), position); + case STRING: + return new StringConstant(constantToken.getContent(), position); + case BOOLEAN: + return new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position); + default: + throw new UnsupportedOperationException( + "Unsupported constant token: " + constantToken.getType() + " at position: " + position); + } } - private Expr expression() { - return assignment(); + private Returnable parseGroup(Tokenizer tokens, ScopeBuilder scopeBuilder) { + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); + Returnable expression = parseExpression(tokens, true, scopeBuilder); // Parse inside of group as a separate expression + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); + return expression; } - private Expr leftAssociativeBinaryExpression(Supplier higherPrecedence, BinaryOperator... operators) { - Expr expr = higherPrecedence.get(); - loop: - while(true) { - for(BinaryOperator operator : operators) { - if(current().isType(operator.tokenType)) { - SourcePosition position = consumeUnchecked().position(); // Consume operator token - expr = new Expr.Binary(expr, operator, higherPrecedence.get(), position); - continue loop; + private BinaryOperation parseBinaryOperation(Returnable left, Tokenizer tokens, + ScopeBuilder scopeBuilder) { + Token binaryOperator = tokens.consume(); + ParserUtil.checkBinaryOperator(binaryOperator); + + Returnable right = parseExpression(tokens, false, scopeBuilder); + + Token other = tokens.get(); + if(ParserUtil.hasPrecedence(binaryOperator.getType(), other.getType())) { + return assemble(left, parseBinaryOperation(right, tokens, scopeBuilder), binaryOperator); + } else if(other.isBinaryOperator()) { + return parseBinaryOperation(assemble(left, right, binaryOperator), tokens, scopeBuilder); + } + return assemble(left, right, binaryOperator); + } + + private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) { + if(binaryOperator.isStrictNumericOperator()) + ParserUtil.checkArithmeticOperation(left, right, binaryOperator); // Numeric type checking + if(binaryOperator.isStrictBooleanOperator()) ParserUtil.checkBooleanOperation(left, right, binaryOperator); // Boolean type checking + switch(binaryOperator.getType()) { + case ADDITION_OPERATOR: + if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { + return new NumberAdditionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); } - } - break; // Break if not any operator + return new ConcatenationOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case SUBTRACTION_OPERATOR: + return new SubtractionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case MULTIPLICATION_OPERATOR: + return new MultiplicationOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case DIVISION_OPERATOR: + return new DivisionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case EQUALS_OPERATOR: + return new EqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case NOT_EQUALS_OPERATOR: + return new NotEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case GREATER_THAN_OPERATOR: + return new GreaterThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case LESS_THAN_OPERATOR: + return new LessThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case GREATER_THAN_OR_EQUALS_OPERATOR: + return new GreaterOrEqualsThanStatement((Returnable) left, (Returnable) right, + binaryOperator.getPosition()); + case LESS_THAN_OR_EQUALS_OPERATOR: + return new LessThanOrEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case BOOLEAN_AND: + return new BooleanAndOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case BOOLEAN_OR: + return new BooleanOrOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case MODULO_OPERATOR: + return new ModuloOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + default: + throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); } - return expr; } - private Expr rightAssociativeBinaryExpression(Supplier higherPrecedence, BinaryOperator... operators) { - Expr expr = higherPrecedence.get(); - for(BinaryOperator operator : operators) { - if(current().isType(operator.tokenType)) { - SourcePosition position = consumeUnchecked().position(); // Consume operator token - return new Expr.Binary(expr, operator, rightAssociativeBinaryExpression(higherPrecedence, operators), position); - } - } - return expr; - } - - private Expr assignment() { - Expr expr = logicOr(); - if(current().isType(TokenType.ASSIGNMENT)) { - SourcePosition position = consumeUnchecked().position(); // Consume operator token - if(!(expr instanceof Variable variable)) throw new ParseException("Invalid assignment target", position); - return new Expr.Assignment(variable, assignment(), position); - } - return expr; - } - - private Expr logicOr() { - return leftAssociativeBinaryExpression(this::logicAnd, BinaryOperator.BOOLEAN_OR); - } - - private Expr logicAnd() { - return leftAssociativeBinaryExpression(this::equality, BinaryOperator.BOOLEAN_AND); - } - - private Expr equality() { - return leftAssociativeBinaryExpression(this::comparison, BinaryOperator.EQUALS, BinaryOperator.NOT_EQUALS); - } - - private Expr comparison() { - return leftAssociativeBinaryExpression(this::term, BinaryOperator.GREATER, BinaryOperator.GREATER_EQUALS, BinaryOperator.LESS, - BinaryOperator.LESS_EQUALS); - } - - private Expr term() { - return leftAssociativeBinaryExpression(this::factor, BinaryOperator.ADD, BinaryOperator.SUBTRACT); - } - - private Expr factor() { - return leftAssociativeBinaryExpression(this::unary, BinaryOperator.MULTIPLY, BinaryOperator.DIVIDE, BinaryOperator.MODULO); - } - - private Expr unary() { - UnaryOperator[] operators = { UnaryOperator.NOT, UnaryOperator.NEGATE }; - for(UnaryOperator operator : operators) { - if(current().isType(operator.tokenType)) { - SourcePosition position = consumeUnchecked().position(); - return new Expr.Unary(operator, unary(), position); - } - } - return primary(); - } - - private Expr primary() { - Token token = consumeUnchecked(); - SourcePosition position = token.position(); - return switch(token.type()) { - case NUMBER -> new Expr.Literal(Double.parseDouble(token.lexeme()), Type.NUMBER, position); - case STRING -> new Expr.Literal(token.lexeme(), Type.STRING, position); - case BOOLEAN -> new Expr.Literal(Boolean.parseBoolean(token.lexeme()), Type.BOOLEAN, position); - case IDENTIFIER -> { - if(current().isType(TokenType.OPEN_PAREN)) yield call(token); - else yield variable(token); - } - case OPEN_PAREN -> { - if(current().isType(TokenType.CLOSE_PAREN)) { - consumeUnchecked(); // Consume ')' - yield new Expr.Void(position); // () evaluates to void - } - Expr expr = expression(); - consume("Expected ')' to close '(' located at " + position, TokenType.CLOSE_PAREN); - yield new Expr.Grouping(expr, position); - } - default -> throw new ParseException("Unexpected token '" + token.lexeme() + "'", position); + private VariableAssignmentNode parseVariableDeclaration(Tokenizer tokens, ScopeBuilder scopeBuilder) { + Token type = tokens.consume(); + ParserUtil.checkType(type, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + + Returnable.ReturnType returnType = ParserUtil.getVariableReturnType(type); + + ParserUtil.checkVarType(type, returnType); // Check for type mismatch + Token identifier = tokens.consume(); + ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); + if(functions.containsKey(identifier.getContent()) || scopeBuilder.contains(identifier.getContent())) + throw new ParseException(identifier.getContent() + " is already defined in this scope", identifier.getPosition()); + ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); + + Returnable value = parseExpression(tokens, true, scopeBuilder); + ParserUtil.checkReturnType(value, returnType); + + String id = identifier.getContent(); + + return switch(value.returnType()) { + case NUMBER -> new NumAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.num(id)); + case STRING -> new StrAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.str(id)); + case BOOLEAN -> new BoolAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.bool(id)); + default -> throw new ParseException("Illegal type for variable declaration: " + type, value.getPosition()); }; } - private Expr call(Token identifier) { - String id = identifier.lexeme(); - SourcePosition position = consume("Expected '(' to initiate function call on function '" + id + "'", - TokenType.OPEN_PAREN).position(); + private Block parseBlock(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { + List> parsedItems = new ArrayList<>(); - List args = new ArrayList<>(); - while(!current().isType(TokenType.CLOSE_PAREN)) { - args.add(expression()); - if(current().isType(TokenType.CLOSE_PAREN)) break; - consume("Expected ',' or ')' after passed argument in function call of '" + id + "'", TokenType.SEPARATOR); + scopeBuilder = scopeBuilder.sub(); + + Token first = tokens.get(); + + while(tokens.hasNext()) { + Token token = tokens.get(); + if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. + Item parsedItem = parseItem(tokens, loop, scopeBuilder); + if(parsedItem != Function.NULL) { + parsedItems.add(parsedItem); + } + if(tokens.hasNext() && !token.isLoopLike()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); + } + return new Block(parsedItems, first.getPosition()); + } + + private Item parseItem(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { + Token token = tokens.get(); + if(loop) ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, + Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, + Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); + else ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, + Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, + Token.Type.FAIL); + + if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) + return parseLoopLike(tokens, loop, scopeBuilder); + } else if(token.isIdentifier()) { // Parse identifiers + if(scopeBuilder.contains(token.getContent())) { // Assume variable assignment + return parseAssignment(tokens, scopeBuilder); + } else return parseFunction(tokens, true, scopeBuilder); + } else if(token.isVariableDeclaration()) { + + return parseVariableDeclaration(tokens, scopeBuilder); + + } else if(token.getType().equals(Token.Type.RETURN)) return new ReturnKeyword(tokens.consume().getPosition()); + else if(token.getType().equals(Token.Type.BREAK)) return new BreakKeyword(tokens.consume().getPosition()); + else if(token.getType().equals(Token.Type.CONTINUE)) return new ContinueKeyword(tokens.consume().getPosition()); + else if(token.getType().equals(Token.Type.FAIL)) return new FailKeyword(tokens.consume().getPosition()); + else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); + } + + private VariableAssignmentNode parseAssignment(Tokenizer tokens, ScopeBuilder scopeBuilder) { + Token identifier = tokens.consume(); + + ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); + + ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); + + Returnable value = parseExpression(tokens, true, scopeBuilder); + + String id = identifier.getContent(); + + ParserUtil.checkReturnType(value, scopeBuilder.getType(id)); + + ReturnType type = value.returnType(); + + return switch(type) { + case NUMBER -> new NumAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.getIndex(id)); + case STRING -> new StrAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.getIndex(id)); + case BOOLEAN -> new BoolAssignmentNode((Returnable) value, identifier.getPosition(), scopeBuilder.getIndex(id)); + default -> throw new ParseException("Illegal type for variable assignment: " + type, value.getPosition()); + }; + } + + private Function parseFunction(Tokenizer tokens, boolean fullStatement, ScopeBuilder scopeBuilder) { + Token identifier = tokens.consume(); + ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier + + if(!functions.containsKey(identifier.getContent())) + throw new ParseException("No such function \"" + identifier.getContent() + "\"", identifier.getPosition()); + + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); // Second is body begin + + + List> args = getArgs(tokens, scopeBuilder); // Extract arguments, consume the rest. + + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); // Remove body end + + if(fullStatement) ParserUtil.checkType(tokens.get(), Token.Type.STATEMENT_END); + + if(ignoredFunctions.contains(identifier.getContent())) { + return Function.NULL; } - consume("Expected ')' after " + (args.size() == 0 ? "')'" : "arguments") + " in function call of '" + id + "'", - TokenType.CLOSE_PAREN); + if(functions.containsKey(identifier.getContent())) { + FunctionBuilder builder = functions.get(identifier.getContent()); + + if(builder.argNumber() != -1 && args.size() != builder.argNumber()) + throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size(), identifier.getPosition()); + + for(int i = 0; i < args.size(); i++) { + Returnable argument = args.get(i); + if(builder.getArgument(i) == null) + throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent(), + identifier.getPosition()); + ParserUtil.checkReturnType(argument, builder.getArgument(i)); + } + return builder.build(args, identifier.getPosition()); + } + throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); + } + + private List> getArgs(Tokenizer tokens, ScopeBuilder scopeBuilder) { + List> args = new ArrayList<>(); - return new Expr.Call(id, args, position); + while(!tokens.get().getType().equals(Token.Type.GROUP_END)) { + args.add(parseExpression(tokens, true, scopeBuilder)); + ParserUtil.checkType(tokens.get(), Token.Type.SEPARATOR, Token.Type.GROUP_END); + if(tokens.get().getType().equals(Token.Type.SEPARATOR)) tokens.consume(); + } + return args; } - - private Expr variable(Token identifier) { - return new Expr.Variable(identifier.lexeme(), identifier.position()); - } - - } diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParserUtil.java diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/UnaryOperator.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/UnaryOperator.java deleted file mode 100644 index cc3fcf2c4..000000000 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/UnaryOperator.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dfsek.terra.addons.terrascript.parser; - -import com.dfsek.terra.addons.terrascript.lexer.Token.TokenType; - - -public enum UnaryOperator { - NOT(TokenType.BANG), - NEGATE(TokenType.MINUS); - - public final TokenType tokenType; - - UnaryOperator(TokenType tokenType) { this.tokenType = tokenType; } -} diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/exceptions/ParseException.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Block.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Executable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Executable.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Executable.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Executable.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/ImplementationArguments.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Item.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Keyword.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Returnable.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Scope.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/Statement.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/BooleanConstant.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/ConstantExpression.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/NumericConstant.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/constants/StringConstant.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/Function.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/BreakKeyword.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ContinueKeyword.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/FailKeyword.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/flow/ReturnKeyword.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/ForKeyword.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/IfKeyword.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/keywords/looplike/WhileKeyword.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BinaryOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanAndOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanNotOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/BooleanOrOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ConcatenationOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/DivisionOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/ModuloOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/MultiplicationOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NegationOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/NumberAdditionOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/SubtractionOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/UnaryOperation.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/EqualsStatement.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/GreaterThanStatement.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanOrEqualsStatement.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/LessThanStatement.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/operations/statements/NotEqualsStatement.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/BooleanVariable.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/NumberVariable.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/StringVariable.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/Variable.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/BoolAssignmentNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/BoolAssignmentNode.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/BoolAssignmentNode.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/BoolAssignmentNode.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/NumAssignmentNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/NumAssignmentNode.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/NumAssignmentNode.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/NumAssignmentNode.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/StrAssignmentNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/StrAssignmentNode.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/StrAssignmentNode.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/StrAssignmentNode.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/assign/VariableAssignmentNode.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/BoolVariableReferenceNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/BoolVariableReferenceNode.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/BoolVariableReferenceNode.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/BoolVariableReferenceNode.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/NumVariableReferenceNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/NumVariableReferenceNode.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/NumVariableReferenceNode.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/NumVariableReferenceNode.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/StrVariableReferenceNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/StrVariableReferenceNode.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/StrVariableReferenceNode.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/StrVariableReferenceNode.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/variables/reference/VariableReferenceNode.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BinaryNumberFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BiomeFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/BlockFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/CheckBlockFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/EntityFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/GetMarkFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/LootFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/PullFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RandomFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/RecursionsFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/SetMarkFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StateFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/StructureFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryBooleanFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryNumberFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/UnaryStringFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/builders/ZeroArgFunctionBuilder.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/EntityFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RandomFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/RecursionsFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Char.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Lookahead.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Position.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/EOFException.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/FormatException.java diff --git a/common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java rename to common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/exceptions/TokenizerException.java diff --git a/common/addons/structure-terrascript-loader-v1/src/test/java/structure/LookaheadTest.java b/common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/test/java/structure/LookaheadTest.java rename to common/addons/structure-terrascript-loader/src/test/java/structure/LookaheadTest.java diff --git a/common/addons/structure-terrascript-loader-v1/src/test/java/structure/ParserTest.java b/common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/test/java/structure/ParserTest.java rename to common/addons/structure-terrascript-loader/src/test/java/structure/ParserTest.java diff --git a/common/addons/structure-terrascript-loader-v1/src/test/resources/test.tesf b/common/addons/structure-terrascript-loader/src/test/resources/test.tesf similarity index 100% rename from common/addons/structure-terrascript-loader-v1/src/test/resources/test.tesf rename to common/addons/structure-terrascript-loader/src/test/resources/test.tesf diff --git a/common/addons/structure-terrascript-loader-v1/LICENSE b/common/addons/structure-terrascript-v2/LICENSE similarity index 100% rename from common/addons/structure-terrascript-loader-v1/LICENSE rename to common/addons/structure-terrascript-v2/LICENSE diff --git a/common/addons/structure-terrascript-loader-v1/README.md b/common/addons/structure-terrascript-v2/README.md similarity index 100% rename from common/addons/structure-terrascript-loader-v1/README.md rename to common/addons/structure-terrascript-v2/README.md diff --git a/common/addons/structure-terrascript-v2/build.gradle.kts b/common/addons/structure-terrascript-v2/build.gradle.kts new file mode 100644 index 000000000..f52a9b7c8 --- /dev/null +++ b/common/addons/structure-terrascript-v2/build.gradle.kts @@ -0,0 +1,245 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +version = version("1.0.0") + +dependencies { + api("commons-io:commons-io:2.7") + api("org.ow2.asm:asm:9.5") + api("org.ow2.asm:asm-commons:9.5") + compileOnlyApi(project(":common:addons:manifest-addon-loader")) + implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) + testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) +} + +tasks.named("shadowJar") { + relocate("org.apache.commons", "com.dfsek.terra.addons.terrascript.v2.lib.commons") + relocate("net.jafama", "com.dfsek.terra.addons.terrascript.v2.lib.jafama") +} + +val astSourceSet = buildDir.resolve("generated/ast") +val astPackage = astSourceSet.resolve("com/dfsek/terra/addons/terrascript/v2/ast") + +data class ASTClass( + val name: String, + val imports: List, + val nodes: List, + val constructorFields: List> = emptyList(), +) + +data class ASTNode( + val name: String, + val constructorFields: List>, + val mutableFields: List> = emptyList() // TODO - Remove mutability from AST nodes + +) + +// Auto generate AST classes rather than writing them by hand +tasks.register("genTerrascriptAstClasses") { + + + val packageName = astPackage.toRelativeString(astSourceSet).replace('/', '.') + fun generateClass(clazz: ASTClass) { + val src = StringBuilder() + src.appendLine("package $packageName;\n"); + for (imprt in clazz.imports) src.appendLine("import $imprt;") + src.appendLine(""" + + /** + * Auto-generated class via genTerrascriptAstClasses gradle task + */ + public abstract class ${clazz.name} { + + """.trimIndent()) + + for (field in clazz.constructorFields) { + src.appendLine(" public final ${field.second} ${field.first};") + } + + src.appendLine(""" + | + | public ${clazz.name}(${clazz.constructorFields.joinToString { "${it.second} ${it.first}" }}) { + """.trimMargin()) + + for (field in clazz.constructorFields) { + src.appendLine(" this.${field.first} = ${field.first};") + } + + src.appendLine(""" + | } + | + | public interface Visitor { + | + """.trimMargin()) + for (node in clazz.nodes) { + src.appendLine(" R visit${node.name}${clazz.name}(${node.name} ${clazz.name.toLowerCase()});") + } + + src.appendLine(""" + | + | } + | + | public abstract R accept(Visitor visitor); + """.trimMargin()) + + for (node in clazz.nodes) { + src.appendLine() + // Inner class declaration + src.appendLine(" public static class ${node.name} extends ${clazz.name} {\n") + + // Add fields + for (field in node.constructorFields) { + src.appendLine(" public final ${field.second} ${field.first};") + } + for (field in node.mutableFields) { + src.appendLine(" private ${field.second} ${field.first};") + } + src.appendLine() + + // Add constructor + src.appendLine(""" + | public ${node.name}(${node.constructorFields.plus(clazz.constructorFields).joinToString { "${it.second} ${it.first}" }}) { + | super(${clazz.constructorFields.joinToString { it.first }}); + """.trimMargin()) + + for (field in node.constructorFields) { + src.appendLine(" this.${field.first} = ${field.first};") + } + src.appendLine(" }") + + // Add getters and setters for mutable fields + for (field in node.mutableFields) { + src.appendLine(""" + | + | public void set${field.first.capitalize()}(${field.second} value) { + | this.${field.first} = value; + | } + | + | public ${field.second} get${field.first.capitalize()}() { + | if (this.${field.first} == null) throw new RuntimeException("Compilation bug! Field ${field.first} has not been set yet"); + | return this.${field.first}; + | } + """.trimMargin()) + } + + src.appendLine(""" + | + | @Override + | public R accept(Visitor visitor) { + | return visitor.visit${node.name}${clazz.name}(this); + | } + | } + """.trimMargin()) + } + src.appendLine("}") + val outputFile = astPackage.resolve("${clazz.name}.java") + outputFile.writeText(src.toString()) + } + + doLast { + astSourceSet.deleteRecursively() + astPackage.mkdirs() + + listOf( + ASTClass( + "Expr", + listOf( + "com.dfsek.terra.addons.terrascript.v2.Type", + "com.dfsek.terra.addons.terrascript.v2.parser.UnaryOperator", + "com.dfsek.terra.addons.terrascript.v2.parser.BinaryOperator", + "com.dfsek.terra.addons.terrascript.v2.Environment", + "com.dfsek.terra.addons.terrascript.v2.Environment.Symbol", + "com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition", + "java.util.List", + ), + listOf( + ASTNode("Binary", listOf("left" to "Expr", "operator" to "BinaryOperator", "right" to "Expr")), + ASTNode("Grouping", listOf("expression" to "Expr")), + ASTNode("Literal", listOf("value" to "Object", "type" to "Type")), + ASTNode("Unary", listOf("operator" to "UnaryOperator", "operand" to "Expr")), + ASTNode("Call", listOf("identifier" to "String", "arguments" to "List"), listOf("environment" to "Environment", "symbol" to "Symbol.Function")), + ASTNode("Variable", listOf("identifier" to "String"), listOf("symbol" to "Symbol.Variable")), + ASTNode("Assignment", listOf("lValue" to "Variable", "rValue" to "Expr")), + ASTNode("Void", listOf()), + ), + listOf("position" to "SourcePosition") + ), + ASTClass( + "Stmt", + listOf( + "com.dfsek.terra.addons.terrascript.v2.Type", + "com.dfsek.terra.api.util.generic.pair.Pair", + "com.dfsek.terra.addons.terrascript.v2.Environment.Symbol", + "com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition", + "java.util.List", + "java.util.Optional", + ), + listOf( + ASTNode("Expression", listOf("expression" to "Expr")), + ASTNode("Block", listOf("statements" to "List")), + ASTNode("FunctionDeclaration", listOf("identifier" to "String", "parameters" to "List>", "returnType" to "Type", "body" to "Block"), listOf("symbol" to "Symbol.Function")), + ASTNode("VariableDeclaration", listOf("type" to "Type", "identifier" to "String", "value" to "Expr")), + ASTNode("Return", listOf("value" to "Expr"), listOf("type" to "Type")), + ASTNode("If", listOf("condition" to "Expr", "trueBody" to "Block", "elseIfClauses" to "List>", "elseBody" to "Optional")), + ASTNode("For", listOf("initializer" to "Stmt", "condition" to "Expr", "incrementer" to "Expr", "body" to "Block")), + ASTNode("While", listOf("condition" to "Expr", "body" to "Block")), + ASTNode("NoOp", listOf()), + ASTNode("Break", listOf()), + ASTNode("Continue", listOf()), + ), + listOf("position" to "SourcePosition") + ), + ASTClass( + "TypedExpr", + listOf( + "com.dfsek.terra.addons.terrascript.v2.Type", + "com.dfsek.terra.addons.terrascript.v2.parser.UnaryOperator", + "com.dfsek.terra.addons.terrascript.v2.parser.BinaryOperator", + "java.util.List", + ), + listOf( + ASTNode("Binary", listOf("left" to "TypedExpr", "operator" to "BinaryOperator", "right" to "TypedExpr")), + ASTNode("Grouping", listOf("expression" to "TypedExpr")), + ASTNode("Literal", listOf("value" to "Object")), + ASTNode("Unary", listOf("operator" to "UnaryOperator", "operand" to "TypedExpr")), + ASTNode("Call", listOf("identifier" to "String", "arguments" to "List", "scopedIdentifier" to "String")), + ASTNode("Variable", listOf("identifier" to "String")), + ASTNode("Assignment", listOf("lValue" to "Variable", "rValue" to "TypedExpr")), + ASTNode("Void", listOf()), + ), + listOf("type" to "Type") + ), + ASTClass( + "TypedStmt", + listOf( + "com.dfsek.terra.addons.terrascript.v2.Type", + "com.dfsek.terra.api.util.generic.pair.Pair", + "java.util.List", + "java.util.Optional", + ), + listOf( + ASTNode("Expression", listOf("expression" to "TypedExpr")), + ASTNode("Block", listOf("statements" to "List")), + ASTNode("FunctionDeclaration", listOf("identifier" to "String", "parameters" to "List>", "returnType" to "Type", "body" to "Block", "scopedIdentifier" to "String")), + ASTNode("VariableDeclaration", listOf("type" to "Type", "identifier" to "String", "value" to "TypedExpr")), + ASTNode("Return", listOf("value" to "TypedExpr")), + ASTNode("If", listOf("condition" to "TypedExpr", "trueBody" to "Block", "elseIfClauses" to "List>", "elseBody" to "Optional")), + ASTNode("For", listOf("initializer" to "TypedStmt", "condition" to "TypedExpr", "incrementer" to "TypedExpr", "body" to "Block")), + ASTNode("While", listOf("condition" to "TypedExpr", "body" to "Block")), + ASTNode("NoOp", listOf()), + ASTNode("Break", listOf()), + ASTNode("Continue", listOf()), + ), + ), + ).forEach(::generateClass) + } +} + +tasks.getByName("compileJava") { + dependsOn("genTerrascriptAstClasses") +} + +sourceSets.getByName("main") { + java { + srcDirs(astSourceSet) + } +} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/Environment.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/Environment.java similarity index 89% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/Environment.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/Environment.java index 9760a10db..8664f47ce 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/Environment.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/Environment.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript; +package com.dfsek.terra.addons.terrascript.v2; import javax.annotation.Nullable; import java.util.ArrayList; @@ -6,12 +6,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.dfsek.terra.addons.terrascript.Environment.ScopeException.NonexistentSymbolException; -import com.dfsek.terra.addons.terrascript.Environment.ScopeException.SymbolAlreadyExistsException; -import com.dfsek.terra.addons.terrascript.Environment.ScopeException.SymbolTypeMismatchException; -import com.dfsek.terra.addons.terrascript.Environment.Symbol.Function; -import com.dfsek.terra.addons.terrascript.Environment.Symbol.Variable; -import com.dfsek.terra.addons.terrascript.codegen.NativeFunction; +import com.dfsek.terra.addons.terrascript.v2.Environment.ScopeException.NonexistentSymbolException; +import com.dfsek.terra.addons.terrascript.v2.Environment.ScopeException.SymbolAlreadyExistsException; +import com.dfsek.terra.addons.terrascript.v2.Environment.ScopeException.SymbolTypeMismatchException; +import com.dfsek.terra.addons.terrascript.v2.Environment.Symbol.Function; +import com.dfsek.terra.addons.terrascript.v2.Environment.Symbol.Variable; +import com.dfsek.terra.addons.terrascript.v2.codegen.NativeFunction; public class Environment { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/ErrorHandler.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/ErrorHandler.java similarity index 88% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/ErrorHandler.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/ErrorHandler.java index 5b3450f09..4d16c2eae 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/ErrorHandler.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/ErrorHandler.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript; +package com.dfsek.terra.addons.terrascript.v2; import java.util.ArrayList; import java.util.List; diff --git a/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/TerraScript2Addon.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/TerraScript2Addon.java new file mode 100644 index 000000000..792d9eee1 --- /dev/null +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/TerraScript2Addon.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra Core Addons are licensed under the terms of the MIT License. For more details, + * reference the LICENSE file in this module's root directory. + */ + +package com.dfsek.terra.addons.terrascript.v2; + +import com.dfsek.terra.addons.manifest.api.AddonInitializer; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.inject.annotations.Inject; + + +public class TerraScript2Addon implements AddonInitializer { + @Inject + private Platform platform; + + @Inject + private BaseAddon addon; + + @Override + public void initialize() { + } +} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/Type.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/Type.java similarity index 97% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/Type.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/Type.java index cc5915a3d..db7ec8417 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/Type.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/Type.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript; +package com.dfsek.terra.addons.terrascript.v2; import java.util.Optional; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/CodegenType.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/CodegenType.java similarity index 95% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/CodegenType.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/CodegenType.java index d4568c307..3891bf213 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/CodegenType.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/CodegenType.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.addons.terrascript.codegen; +package com.dfsek.terra.addons.terrascript.v2.codegen; -import com.dfsek.terra.addons.terrascript.Type; +import com.dfsek.terra.addons.terrascript.v2.Type; -import com.dfsek.terra.addons.terrascript.exception.CompilerBugException; +import com.dfsek.terra.addons.terrascript.v2.exception.CompilerBugException; import org.objectweb.asm.Opcodes; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/NativeFunction.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/NativeFunction.java similarity index 96% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/NativeFunction.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/NativeFunction.java index 15218fbf6..449aa07b2 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/NativeFunction.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/NativeFunction.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript.codegen; +package com.dfsek.terra.addons.terrascript.v2.codegen; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -7,7 +7,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.dfsek.terra.addons.terrascript.Type; +import com.dfsek.terra.addons.terrascript.v2.Type; public interface NativeFunction { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/TerraScript.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/TerraScript.java similarity index 54% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/TerraScript.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/TerraScript.java index e96f185d8..0d56f3e59 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/TerraScript.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/TerraScript.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript.codegen; +package com.dfsek.terra.addons.terrascript.v2.codegen; public interface TerraScript { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/DynamicClassLoader.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/DynamicClassLoader.java similarity index 88% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/DynamicClassLoader.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/DynamicClassLoader.java index 1e21d9793..765a4a13d 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/DynamicClassLoader.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/DynamicClassLoader.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript.codegen.asm; +package com.dfsek.terra.addons.terrascript.v2.codegen.asm; import com.dfsek.terra.api.structure.Structure; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/OpcodeAlias.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/OpcodeAlias.java similarity index 91% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/OpcodeAlias.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/OpcodeAlias.java index baee63e5f..9f0cd523d 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/OpcodeAlias.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/OpcodeAlias.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript.codegen.asm; +package com.dfsek.terra.addons.terrascript.v2.codegen.asm; import org.objectweb.asm.Opcodes; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/TerraScriptClassGenerator.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/TerraScriptClassGenerator.java similarity index 80% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/TerraScriptClassGenerator.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/TerraScriptClassGenerator.java index 3dc2fe5fb..92ec9808e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/codegen/asm/TerraScriptClassGenerator.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/codegen/asm/TerraScriptClassGenerator.java @@ -1,34 +1,36 @@ -package com.dfsek.terra.addons.terrascript.codegen.asm; +package com.dfsek.terra.addons.terrascript.v2.codegen.asm; -import com.dfsek.terra.addons.terrascript.Type; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr.Assignment; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr.Binary; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr.Call; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr.Grouping; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr.Literal; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr.Unary; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr.Variable; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr.Void; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.Block; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.Break; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.Continue; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.Expression; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.For; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.FunctionDeclaration; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.If; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.NoOp; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.Return; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.VariableDeclaration; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt.While; +import com.dfsek.terra.addons.terrascript.v2.Type; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr.Assignment; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr.Binary; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr.Call; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr.Grouping; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr.Literal; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr.Unary; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr.Variable; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr.Void; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.Block; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.Break; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.Continue; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.Expression; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.For; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.FunctionDeclaration; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.If; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.NoOp; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.Return; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.VariableDeclaration; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt.While; -import com.dfsek.terra.addons.terrascript.codegen.CodegenType; -import com.dfsek.terra.addons.terrascript.codegen.CodegenType.InstructionType; -import com.dfsek.terra.addons.terrascript.codegen.NativeFunction; -import com.dfsek.terra.addons.terrascript.codegen.TerraScript; -import com.dfsek.terra.addons.terrascript.exception.CompilerBugException; -import com.dfsek.terra.addons.terrascript.util.ASMUtil; +import com.dfsek.terra.addons.terrascript.v2.codegen.CodegenType; +import com.dfsek.terra.addons.terrascript.v2.codegen.CodegenType.InstructionType; +import com.dfsek.terra.addons.terrascript.v2.codegen.NativeFunction; +import com.dfsek.terra.addons.terrascript.v2.codegen.TerraScript; +import com.dfsek.terra.addons.terrascript.v2.exception.CompilerBugException; +import com.dfsek.terra.addons.terrascript.v2.util.ASMUtil; +import com.dfsek.terra.addons.terrascript.v2.parser.BinaryOperator; +import com.dfsek.terra.addons.terrascript.v2.parser.UnaryOperator; import com.dfsek.terra.api.util.generic.pair.Pair; import org.objectweb.asm.ClassReader; @@ -49,19 +51,9 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import static com.dfsek.terra.addons.terrascript.codegen.CodegenType.BOOLEAN_PRIMITIVE; -import static com.dfsek.terra.addons.terrascript.codegen.CodegenType.codegenType; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.CMP_EQUALS; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.BOOL_FALSE; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.CMP_GREATER_EQUALS; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.CMP_GREATER_THAN; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.CMP_LESS_EQUALS; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.CMP_LESS_THAN; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.CMP_NOT_EQUALS; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.BOOL_TRUE; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.INTEGERS_EQUAL; -import static com.dfsek.terra.addons.terrascript.codegen.asm.OpcodeAlias.INTEGERS_NOT_EQUAL; -import static com.dfsek.terra.addons.terrascript.util.ASMUtil.dynamicName; +import static com.dfsek.terra.addons.terrascript.v2.parser.BinaryOperator.*; +import static com.dfsek.terra.addons.terrascript.v2.parser.UnaryOperator.*; +import static com.dfsek.terra.addons.terrascript.v2.util.ASMUtil.dynamicName; public class TerraScriptClassGenerator { @@ -180,7 +172,7 @@ public class TerraScriptClassGenerator { case EQUALS, NOT_EQUALS, BOOLEAN_AND, BOOLEAN_OR, GREATER, GREATER_EQUALS, LESS, LESS_EQUALS -> pushComparisonBool(expr); case ADD -> { pushBinaryOperands(expr); - CodegenType codegenType = codegenType(expr.type); + CodegenType codegenType = CodegenType.codegenType(expr.type); if(codegenType.bytecodeType() == InstructionType.DOUBLE) method.visitInsn(Opcodes.DADD); else if (Objects.equals(codegenType.getDescriptor(), "Ljava/lang/String;")) @@ -204,7 +196,7 @@ public class TerraScriptClassGenerator { @Override public Void visitLiteralTypedExpr(Literal expr) { - if(codegenType(expr.type) == BOOLEAN_PRIMITIVE) + if(CodegenType.codegenType(expr.type) == CodegenType.BOOLEAN_PRIMITIVE) if ((boolean) expr.value) pushTrue(); else pushFalse(); else method.visitLdcInsn(expr.value); return null; @@ -238,7 +230,7 @@ public class TerraScriptClassGenerator { @Override public Void visitVariableTypedExpr(Variable expr) { Type varType = expr.type; - method.visitVarInsn(codegenType(varType).bytecodeType().loadInsn(), lvTable.get(expr.identifier)); + method.visitVarInsn(CodegenType.codegenType(varType).bytecodeType().loadInsn(), lvTable.get(expr.identifier)); return null; } @@ -246,7 +238,7 @@ public class TerraScriptClassGenerator { public Void visitAssignmentTypedExpr(Assignment expr) { expr.rValue.accept(this); Type type = expr.lValue.type; - method.visitVarInsn(codegenType(type).bytecodeType().storeInsn(), lvTable.get(expr.lValue.identifier)); + method.visitVarInsn(CodegenType.codegenType(type).bytecodeType().storeInsn(), lvTable.get(expr.lValue.identifier)); return null; } @@ -288,7 +280,7 @@ public class TerraScriptClassGenerator { int lvidx = 0; for (Pair parameter : stmt.parameters) { funcGenerator.lvTable.put(parameter.getLeft(), lvidx); - lvidx += codegenType(parameter.getRight()).bytecodeType().slotSize(); // Increment by how many slots data type takes + lvidx += CodegenType.codegenType(parameter.getRight()).bytecodeType().slotSize(); // Increment by how many slots data type takes } // Generate method bytecode @@ -306,14 +298,14 @@ public class TerraScriptClassGenerator { public Void visitVariableDeclarationTypedStmt(VariableDeclaration stmt) { stmt.value.accept(this); lvTable.put(stmt.identifier, lvs.newLocal(ASMUtil.tsTypeToAsmType(stmt.type))); - method.visitVarInsn(codegenType(stmt.type).bytecodeType().storeInsn(), lvTable.get(stmt.identifier)); + method.visitVarInsn(CodegenType.codegenType(stmt.type).bytecodeType().storeInsn(), lvTable.get(stmt.identifier)); return null; } @Override public Void visitReturnTypedStmt(Return stmt) { stmt.value.accept(this); - method.visitInsn(codegenType(stmt.value.type).bytecodeType().returnInsn()); + method.visitInsn(CodegenType.codegenType(stmt.value.type).bytecodeType().returnInsn()); return null; } @@ -395,7 +387,7 @@ public class TerraScriptClassGenerator { private void invertBool() { Label invertToFalse = new Label(); Label finished = new Label(); - jumpIf(BOOL_TRUE, invertToFalse); + jumpIf(OpcodeAlias.BOOL_TRUE, invertToFalse); pushFalse(); jump(finished); @@ -464,48 +456,48 @@ public class TerraScriptClassGenerator { case BOOLEAN_AND -> { // Operands assumed booleans binaryCondition.left.accept(this); - jumpIf(BOOL_FALSE, exit); // If left is false, short circuit, don't evaluate right + jumpIf(OpcodeAlias.BOOL_FALSE, exit); // If left is false, short circuit, don't evaluate right binaryCondition.right.accept(this); - jumpIf(BOOL_FALSE, exit); + jumpIf(OpcodeAlias.BOOL_FALSE, exit); } case BOOLEAN_OR -> { Label skipRight = new Label(); // Operands assumed booleans binaryCondition.left.accept(this); - jumpIf(BOOL_TRUE, skipRight); + jumpIf(OpcodeAlias.BOOL_TRUE, skipRight); binaryCondition.right.accept(this); - jumpIf(BOOL_FALSE, exit); + jumpIf(OpcodeAlias.BOOL_FALSE, exit); label(skipRight); } case EQUALS -> { if (binaryOperandsSameType(Type.BOOLEAN, binaryCondition)) { // Operands assumed integers pushBinaryOperands(binaryCondition); - jumpIf(INTEGERS_NOT_EQUAL, exit); + jumpIf(OpcodeAlias.INTEGERS_NOT_EQUAL, exit); } else if (binaryOperandsSameType(Type.NUMBER, binaryCondition)) { // Operands assumed doubles binaryInsn(binaryCondition, Opcodes.DCMPG); - jumpIf(CMP_NOT_EQUALS, exit); + jumpIf(OpcodeAlias.CMP_NOT_EQUALS, exit); } else if (binaryOperandsSameType(Type.STRING, binaryCondition)) { pushBinaryOperands(binaryCondition); method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); - jumpIf(BOOL_FALSE, exit); + jumpIf(OpcodeAlias.BOOL_FALSE, exit); } else throw new CompilerBugException(); } case NOT_EQUALS -> { if (binaryOperandsSameType(Type.BOOLEAN, binaryCondition)) { // Operands assumed integers pushBinaryOperands(binaryCondition); - jumpIf(INTEGERS_EQUAL, exit); + jumpIf(OpcodeAlias.INTEGERS_EQUAL, exit); } else if (binaryOperandsSameType(Type.NUMBER, binaryCondition)) { // Operands assumed doubles binaryInsn(binaryCondition, Opcodes.DCMPG); - jumpIf(CMP_EQUALS, exit); + jumpIf(OpcodeAlias.CMP_EQUALS, exit); } else if (binaryOperandsSameType(Type.STRING, binaryCondition)) { // Operands assumed references pushBinaryOperands(binaryCondition); method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); invertBool(); - jumpIf(CMP_EQUALS, exit); + jumpIf(OpcodeAlias.CMP_EQUALS, exit); } else throw new CompilerBugException(); } case GREATER, GREATER_EQUALS, LESS, LESS_EQUALS -> { @@ -517,10 +509,10 @@ public class TerraScriptClassGenerator { }); jumpIf(switch(binaryCondition.operator) { - case GREATER -> CMP_LESS_EQUALS; - case GREATER_EQUALS -> CMP_LESS_THAN; - case LESS -> CMP_GREATER_EQUALS; - case LESS_EQUALS -> CMP_GREATER_THAN; + case GREATER -> OpcodeAlias.CMP_LESS_EQUALS; + case GREATER_EQUALS -> OpcodeAlias.CMP_LESS_THAN; + case LESS -> OpcodeAlias.CMP_GREATER_EQUALS; + case LESS_EQUALS -> OpcodeAlias.CMP_GREATER_THAN; default -> throw new IllegalStateException(); }, exit); } @@ -529,7 +521,7 @@ public class TerraScriptClassGenerator { } else { // Assume condition returns bool condition.accept(this); - jumpIf(BOOL_FALSE, exit); + jumpIf(OpcodeAlias.BOOL_FALSE, exit); } trueBlock.run(); jump(trueFinished); // Jump to end of statement after execution @@ -538,9 +530,9 @@ public class TerraScriptClassGenerator { private String getFunctionDescriptor(List parameters, Type returnType) { StringBuilder sb = new StringBuilder().append("("); - parameters.stream().map(parameter -> codegenType(parameter).getDescriptor()).forEach(sb::append); + parameters.stream().map(parameter -> CodegenType.codegenType(parameter).getDescriptor()).forEach(sb::append); sb.append(")"); - sb.append(codegenType(returnType).getDescriptor()); + sb.append(CodegenType.codegenType(returnType).getDescriptor()); return sb.toString(); } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/CompilationException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/CompilationException.java similarity index 86% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/CompilationException.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/CompilationException.java index 99b98b7e3..21f5ee700 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/CompilationException.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/CompilationException.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.exception; +package com.dfsek.terra.addons.terrascript.v2.exception; import java.io.Serial; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; public class CompilationException extends Exception { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/CompilerBugException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/CompilerBugException.java similarity index 64% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/CompilerBugException.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/CompilerBugException.java index 3941699da..1b46c8a0f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/CompilerBugException.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/CompilerBugException.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript.exception; +package com.dfsek.terra.addons.terrascript.v2.exception; public class CompilerBugException extends RuntimeException { // TODO - Add message constructor diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/EOFException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/EOFException.java similarity index 83% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/EOFException.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/EOFException.java index d219a8286..b11b21563 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/EOFException.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/EOFException.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.exception.lexer; +package com.dfsek.terra.addons.terrascript.v2.exception.lexer; import java.io.Serial; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; public class EOFException extends TokenizerException { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/FormatException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/FormatException.java similarity index 83% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/FormatException.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/FormatException.java index 0f02a35c7..ecd3ad50f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/FormatException.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/FormatException.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.exception.lexer; +package com.dfsek.terra.addons.terrascript.v2.exception.lexer; import java.io.Serial; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; public class FormatException extends TokenizerException { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/TokenizerException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/TokenizerException.java similarity index 76% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/TokenizerException.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/TokenizerException.java index 246d168e1..bc13b1e4f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/exception/lexer/TokenizerException.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/lexer/TokenizerException.java @@ -5,12 +5,12 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.exception.lexer; +package com.dfsek.terra.addons.terrascript.v2.exception.lexer; import java.io.Serial; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; -import com.dfsek.terra.addons.terrascript.parser.ParseException; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.v2.parser.ParseException; public abstract class TokenizerException extends ParseException { diff --git a/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/IdentifierAlreadyDeclaredException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/IdentifierAlreadyDeclaredException.java new file mode 100644 index 000000000..090627845 --- /dev/null +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/IdentifierAlreadyDeclaredException.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis; + +import com.dfsek.terra.addons.terrascript.v2.exception.CompilationException; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; + + +public class IdentifierAlreadyDeclaredException extends CompilationException { + public IdentifierAlreadyDeclaredException(String message, SourcePosition position) { + super(message, position); + } +} diff --git a/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/InvalidFunctionDeclarationException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/InvalidFunctionDeclarationException.java new file mode 100644 index 000000000..c4632ce4d --- /dev/null +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/InvalidFunctionDeclarationException.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis; + +import com.dfsek.terra.addons.terrascript.v2.exception.CompilationException; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; + + +public class InvalidFunctionDeclarationException extends CompilationException { + public InvalidFunctionDeclarationException(String message, SourcePosition position) { + super(message, position); + } +} diff --git a/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/InvalidTypeException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/InvalidTypeException.java new file mode 100644 index 000000000..b7171350b --- /dev/null +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/InvalidTypeException.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis; + +import com.dfsek.terra.addons.terrascript.v2.exception.CompilationException; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; + + +public class InvalidTypeException extends CompilationException { + public InvalidTypeException(String message, SourcePosition position) { + super(message, position); + } +} diff --git a/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/UndefinedReferenceException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/UndefinedReferenceException.java new file mode 100644 index 000000000..d917f18e3 --- /dev/null +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/exception/semanticanalysis/UndefinedReferenceException.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis; + +import com.dfsek.terra.addons.terrascript.v2.exception.CompilationException; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; + + +public class UndefinedReferenceException extends CompilationException { + public UndefinedReferenceException(String message, SourcePosition position) { + super(message, position); + } +} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Char.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Char.java similarity index 96% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Char.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Char.java index b06d07122..b8ac816b0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Char.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Char.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.lexer; +package com.dfsek.terra.addons.terrascript.v2.lexer; import java.util.Objects; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Lexer.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Lexer.java similarity index 96% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Lexer.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Lexer.java index 253e9ab94..850060302 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Lexer.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Lexer.java @@ -5,9 +5,13 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.lexer; +package com.dfsek.terra.addons.terrascript.v2.lexer; -import com.dfsek.terra.addons.terrascript.parser.ParseException; +import com.dfsek.terra.addons.terrascript.v2.parser.ParseException; + +import com.dfsek.terra.addons.terrascript.v2.exception.lexer.EOFException; +import com.dfsek.terra.addons.terrascript.v2.exception.lexer.FormatException; +import com.dfsek.terra.addons.terrascript.v2.exception.lexer.TokenizerException; import com.google.common.collect.Sets; @@ -16,10 +20,7 @@ import java.util.Arrays; import java.util.List; import java.util.Set; -import com.dfsek.terra.addons.terrascript.exception.lexer.EOFException; -import com.dfsek.terra.addons.terrascript.exception.lexer.FormatException; -import com.dfsek.terra.addons.terrascript.exception.lexer.TokenizerException; -import com.dfsek.terra.addons.terrascript.lexer.Token.TokenType; +import com.dfsek.terra.addons.terrascript.v2.lexer.Token.TokenType; public class Lexer { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/LookaheadStream.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/LookaheadStream.java similarity index 97% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/LookaheadStream.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/LookaheadStream.java index 49d2882cb..b75bc0fda 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/LookaheadStream.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/LookaheadStream.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript.lexer; +package com.dfsek.terra.addons.terrascript.v2.lexer; public class LookaheadStream { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/SourcePosition.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/SourcePosition.java similarity index 93% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/SourcePosition.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/SourcePosition.java index b6a5fc4f3..379d63796 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/SourcePosition.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/SourcePosition.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.lexer; +package com.dfsek.terra.addons.terrascript.v2.lexer; import java.util.Objects; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Token.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Token.java similarity index 98% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Token.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Token.java index 0f5db0fa9..a4fd03994 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/lexer/Token.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/lexer/Token.java @@ -5,7 +5,7 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.lexer; +package com.dfsek.terra.addons.terrascript.v2.lexer; import java.util.Objects; diff --git a/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/BinaryOperator.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/BinaryOperator.java new file mode 100644 index 000000000..7ecec5dfa --- /dev/null +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/BinaryOperator.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.terrascript.v2.parser; + + +import com.dfsek.terra.addons.terrascript.v2.lexer.Token; + + +public enum BinaryOperator { + BOOLEAN_OR(Token.TokenType.BOOLEAN_OR), + BOOLEAN_AND(Token.TokenType.BOOLEAN_AND), + EQUALS(Token.TokenType.EQUALS_EQUALS), + NOT_EQUALS(Token.TokenType.BANG_EQUALS), + GREATER(Token.TokenType.GREATER), + GREATER_EQUALS(Token.TokenType.GREATER_EQUAL), + LESS(Token.TokenType.LESS), + LESS_EQUALS(Token.TokenType.LESS_EQUALS), + ADD(Token.TokenType.PLUS), + SUBTRACT(Token.TokenType.MINUS), + MULTIPLY(Token.TokenType.STAR), + DIVIDE(Token.TokenType.FORWARD_SLASH), + MODULO(Token.TokenType.MODULO_OPERATOR); + + public final Token.TokenType tokenType; + + BinaryOperator(Token.TokenType tokenType) { this.tokenType = tokenType; } +} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParseException.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/ParseException.java similarity index 88% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParseException.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/ParseException.java index 45c8df224..dfb4f0dfe 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/ParseException.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/ParseException.java @@ -5,11 +5,11 @@ * reference the LICENSE file in this module's root directory. */ -package com.dfsek.terra.addons.terrascript.parser; +package com.dfsek.terra.addons.terrascript.v2.parser; import java.io.Serial; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; public class ParseException extends RuntimeException { diff --git a/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/Parser.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/Parser.java new file mode 100644 index 000000000..122775261 --- /dev/null +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/Parser.java @@ -0,0 +1,379 @@ +package com.dfsek.terra.addons.terrascript.v2.parser; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; + +import com.dfsek.terra.addons.terrascript.v2.Type; +import com.dfsek.terra.addons.terrascript.v2.Type.TypeException; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Variable; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.Block; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.v2.lexer.Token; +import com.dfsek.terra.addons.terrascript.v2.lexer.Token.TokenType; +import com.dfsek.terra.api.util.generic.pair.Pair; + + +/** + * TerraScript recursive descent parser + */ +public class Parser { + + private final List tokens; + + private int index = 0; + + private Parser(List tokens) { + if(tokens.stream().noneMatch(t -> t.isType(TokenType.END_OF_FILE))) + throw new IllegalArgumentException("Token list must contain at least one token of type " + TokenType.END_OF_FILE); + this.tokens = tokens; + } + + public static Block parse(List tokens) { + return new Parser(tokens).parseTokens(); + } + + private Block parseTokens() { + List statements = new ArrayList<>(); + while(hasNext()) { + statements.add(statement()); + } + if(hasNext()) throw new ParseException("Tokens were remaining after parsing", current().position()); + return new Stmt.Block(statements, new SourcePosition(0, 0)); + } + + private Token current() { + return tokens.get(index); + } + + private boolean hasNext() { + return !current().isType(TokenType.END_OF_FILE); + } + + private Token consume(String wrongTypeMessage, TokenType expected, TokenType... more) { + if(!current().isType(expected) && Arrays.stream(more).noneMatch(t -> t == current().type())) throw new ParseException( + wrongTypeMessage, current().position()); + return consumeUnchecked(); + } + + public Token consumeUnchecked() { + if(!hasNext()) return current(); + Token temp = current(); + index++; + return temp; + } + + private void consumeStatementEnd(String after) { + consume("Expected ';' after " + after + ", found '" + current().lexeme() + "'", TokenType.STATEMENT_END); + } + + private Stmt statement() { + return switch(current().type()) { + case BLOCK_BEGIN -> block(); + case FUNCTION -> functionDeclaration(); + case VARIABLE -> variableDeclaration(); + case RETURN -> returnStmt(); + case IF_STATEMENT -> ifStmt(); + case FOR_LOOP -> forLoop(); + case WHILE_LOOP -> whileLoop(); + case BREAK -> breakStmt(); + case CONTINUE -> continueStmt(); + case STATEMENT_END -> new Stmt.NoOp(consumeUnchecked().position()); + default -> expressionStatement(); + }; + } + + private Stmt functionDeclaration() { + SourcePosition position = consume("Expected 'fun' keyword at start of function declaration", TokenType.FUNCTION).position(); + String id = consume("Expected identifier after 'fun' keyword for function declaration", TokenType.IDENTIFIER).lexeme(); + consume("Expected '(' after function identifier '" + id + "'", TokenType.OPEN_PAREN); + + // Parse parameters + List> params = new ArrayList<>(); + while(!current().isType(TokenType.CLOSE_PAREN)) { + Token paramToken = consume("Expected parameter name or ')', found '" + current().lexeme() + "'", TokenType.IDENTIFIER); + String paramId = paramToken.lexeme(); + if(params.stream().anyMatch(p -> Objects.equals(p.getLeft(), paramId))) + throw new ParseException("Parameter '" + paramId + "' has already been declared in function '" + id + "'", + paramToken.position()); + + consume("Expected type declaration after parameter name. Example: '" + paramId + ": '", TokenType.COLON); + Type paramType = typeExpr(); + + params.add(Pair.of(paramId, paramType)); + + if(current().isType(TokenType.CLOSE_PAREN)) break; + consume("Expected ',' or ')' after parameter declaration '" + paramId + "' in function '" + id + "'", TokenType.SEPARATOR); + } + + Type funcReturn = Type.VOID; + + consume("Expected ')' after " + (params.size() == 0 ? "')'" : "parameters") + " in declaration of function '" + id + "'", + TokenType.CLOSE_PAREN); + if(current().isType(TokenType.COLON)) { + consumeUnchecked(); + funcReturn = typeExpr(); + } + + Stmt.Block body = blockOrSingleStatement(); + + return new Stmt.FunctionDeclaration(id, params, funcReturn, body, position); + } + + private Stmt.VariableDeclaration variableDeclaration() { + SourcePosition position = consume("Expected 'var' keyword at start of variable declaration", TokenType.VARIABLE).position(); + String id = consume("Expected variable name after type for variable declaration", TokenType.IDENTIFIER).lexeme(); + consume("Expected ':' after variable name", TokenType.COLON); + Type type = typeExpr(); + consume("Expected '=' following variable type declaration", TokenType.ASSIGNMENT); + Expr expr = expression(); + consumeStatementEnd("variable declaration"); + + return new Stmt.VariableDeclaration(type, id, expr, position); + } + + private Type typeExpr() { + Token typeToken = consume("Expected " + TokenType.IDENTIFIER + " specified as variable type", TokenType.IDENTIFIER); + try { + return Type.fromString(typeToken.lexeme()); + } catch(TypeException e) { + throw new ParseException("Failed to parse type expression", typeToken.position()); + } + } + + private Stmt.Return returnStmt() { + SourcePosition position = consume("Expected 'return' keyword, found '" + current().lexeme() + "'", TokenType.RETURN).position(); + Expr value = new Expr.Void(position); + if(!current().isType(TokenType.STATEMENT_END)) + value = expression(); + consumeStatementEnd("return statement"); + return new Stmt.Return(value, position); + } + + private Stmt.If ifStmt() { + // Parse main if clause + SourcePosition position = consume("Expected 'if' keyword at beginning of if statement", TokenType.IF_STATEMENT).position(); + consume("Expected '(' after 'if' keyword", TokenType.OPEN_PAREN); + Expr condition = expression(); + consume("Expected ')' after if statement condition", TokenType.CLOSE_PAREN); + Stmt.Block trueBody = blockOrSingleStatement(); + + // Parse any else clauses + Stmt.Block elseBody = null; + List> elseIfClauses = new ArrayList<>(); + while(current().isType(TokenType.ELSE)) { + consumeUnchecked(); // Consume else + + if(!current().isType(TokenType.IF_STATEMENT)) { + elseBody = blockOrSingleStatement(); + break; // Else clause should be last in if statement + } + + consumeUnchecked(); // Consume if + consume("Expected '(' after 'else if', e.g. 'if else () ...'", TokenType.OPEN_PAREN); + Expr elseIfCondition = expression(); + consume("Expected ')' after 'else if' clause, e.g. 'else if () ...'", TokenType.CLOSE_PAREN); + Stmt.Block elseIfBody = blockOrSingleStatement(); + elseIfClauses.add(Pair.of(elseIfCondition, elseIfBody)); + } + + return new Stmt.If(condition, trueBody, elseIfClauses, Optional.ofNullable(elseBody), position); + } + + private Stmt.For forLoop() { + SourcePosition position = consume("Expected 'for' keyword at beginning of for loop", TokenType.FOR_LOOP).position(); + consume("Expected '(' after 'for' keyword", TokenType.OPEN_PAREN); + Stmt initializer = statement(); + Expr condition; + if(current().isType(TokenType.STATEMENT_END)) { + condition = new Expr.Literal(true, Type.BOOLEAN, + current().position()); // If no condition is provided, set condition = true + consumeUnchecked(); + } else { + condition = expression(); + consumeStatementEnd("loop condition"); + } + Expr incrementer; + if(current().isType(TokenType.CLOSE_PAREN)) { + incrementer = null; + consumeUnchecked(); + } else { + incrementer = expression(); + consume("Expected ')' after for loop incrementer", TokenType.CLOSE_PAREN); + } + Stmt.Block body = blockOrSingleStatement(); + return new Stmt.For(initializer, condition, incrementer, body, position); + } + + private Stmt.While whileLoop() { + SourcePosition position = consume("Expected 'for' keyword at beginning of while loop", TokenType.WHILE_LOOP).position(); + consume("Expected '(' after 'while' keyword", TokenType.OPEN_PAREN); + Expr condition = expression(); + consume("Expected ')' after while loop condition", TokenType.CLOSE_PAREN); + Stmt.Block body = blockOrSingleStatement(); + return new Stmt.While(condition, body, position); + } + + private Stmt.Break breakStmt() { + SourcePosition position = consume("Expected 'break' keyword for break statement", TokenType.BREAK).position(); + consumeStatementEnd("'break' keyword"); + return new Stmt.Break(position); + } + + private Stmt.Continue continueStmt() { + SourcePosition position = consume("Expected 'continue' keyword for continue statement", TokenType.CONTINUE).position(); + consumeStatementEnd("'continue' keyword"); + return new Stmt.Continue(position); + } + + private Stmt.Block blockOrSingleStatement() { + if(!current().isType(TokenType.BLOCK_BEGIN)) return new Stmt.Block(List.of(statement()), current().position()); + return block(); + } + + private Stmt.Block block() { + SourcePosition position = consume("Expected '{' at start of block", TokenType.BLOCK_BEGIN).position(); + List statements = new ArrayList<>(); + while(!current().isType(TokenType.BLOCK_END)) { + statements.add(statement()); + } + consume("Expected '}' at end of block", TokenType.BLOCK_END); + return new Stmt.Block(statements, position); + } + + private Stmt expressionStatement() { + Expr expression = expression(); + consumeStatementEnd("expression statement"); + return new Stmt.Expression(expression, expression.position); + } + + private Expr expression() { + return assignment(); + } + + private Expr leftAssociativeBinaryExpression(Supplier higherPrecedence, BinaryOperator... operators) { + Expr expr = higherPrecedence.get(); + loop: + while(true) { + for(BinaryOperator operator : operators) { + if(current().isType(operator.tokenType)) { + SourcePosition position = consumeUnchecked().position(); // Consume operator token + expr = new Expr.Binary(expr, operator, higherPrecedence.get(), position); + continue loop; + } + } + break; // Break if not any operator + } + return expr; + } + + private Expr rightAssociativeBinaryExpression(Supplier higherPrecedence, BinaryOperator... operators) { + Expr expr = higherPrecedence.get(); + for(BinaryOperator operator : operators) { + if(current().isType(operator.tokenType)) { + SourcePosition position = consumeUnchecked().position(); // Consume operator token + return new Expr.Binary(expr, operator, rightAssociativeBinaryExpression(higherPrecedence, operators), position); + } + } + return expr; + } + + private Expr assignment() { + Expr expr = logicOr(); + if(current().isType(TokenType.ASSIGNMENT)) { + SourcePosition position = consumeUnchecked().position(); // Consume operator token + if(!(expr instanceof Variable variable)) throw new ParseException("Invalid assignment target", position); + return new Expr.Assignment(variable, assignment(), position); + } + return expr; + } + + private Expr logicOr() { + return leftAssociativeBinaryExpression(this::logicAnd, BinaryOperator.BOOLEAN_OR); + } + + private Expr logicAnd() { + return leftAssociativeBinaryExpression(this::equality, BinaryOperator.BOOLEAN_AND); + } + + private Expr equality() { + return leftAssociativeBinaryExpression(this::comparison, BinaryOperator.EQUALS, BinaryOperator.NOT_EQUALS); + } + + private Expr comparison() { + return leftAssociativeBinaryExpression(this::term, BinaryOperator.GREATER, BinaryOperator.GREATER_EQUALS, BinaryOperator.LESS, + BinaryOperator.LESS_EQUALS); + } + + private Expr term() { + return leftAssociativeBinaryExpression(this::factor, BinaryOperator.ADD, BinaryOperator.SUBTRACT); + } + + private Expr factor() { + return leftAssociativeBinaryExpression(this::unary, BinaryOperator.MULTIPLY, BinaryOperator.DIVIDE, BinaryOperator.MODULO); + } + + private Expr unary() { + UnaryOperator[] operators = { UnaryOperator.NOT, UnaryOperator.NEGATE }; + for(UnaryOperator operator : operators) { + if(current().isType(operator.tokenType)) { + SourcePosition position = consumeUnchecked().position(); + return new Expr.Unary(operator, unary(), position); + } + } + return primary(); + } + + private Expr primary() { + Token token = consumeUnchecked(); + SourcePosition position = token.position(); + return switch(token.type()) { + case NUMBER -> new Expr.Literal(Double.parseDouble(token.lexeme()), Type.NUMBER, position); + case STRING -> new Expr.Literal(token.lexeme(), Type.STRING, position); + case BOOLEAN -> new Expr.Literal(Boolean.parseBoolean(token.lexeme()), Type.BOOLEAN, position); + case IDENTIFIER -> { + if(current().isType(TokenType.OPEN_PAREN)) yield call(token); + else yield variable(token); + } + case OPEN_PAREN -> { + if(current().isType(TokenType.CLOSE_PAREN)) { + consumeUnchecked(); // Consume ')' + yield new Expr.Void(position); // () evaluates to void + } + Expr expr = expression(); + consume("Expected ')' to close '(' located at " + position, TokenType.CLOSE_PAREN); + yield new Expr.Grouping(expr, position); + } + default -> throw new ParseException("Unexpected token '" + token.lexeme() + "'", position); + }; + } + + private Expr call(Token identifier) { + String id = identifier.lexeme(); + SourcePosition position = consume("Expected '(' to initiate function call on function '" + id + "'", + TokenType.OPEN_PAREN).position(); + + List args = new ArrayList<>(); + while(!current().isType(TokenType.CLOSE_PAREN)) { + args.add(expression()); + if(current().isType(TokenType.CLOSE_PAREN)) break; + consume("Expected ',' or ')' after passed argument in function call of '" + id + "'", TokenType.SEPARATOR); + } + + consume("Expected ')' after " + (args.size() == 0 ? "')'" : "arguments") + " in function call of '" + id + "'", + TokenType.CLOSE_PAREN); + + return new Expr.Call(id, args, position); + } + + private Expr variable(Token identifier) { + return new Expr.Variable(identifier.lexeme(), identifier.position()); + } + + +} diff --git a/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/UnaryOperator.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/UnaryOperator.java new file mode 100644 index 000000000..143b8b134 --- /dev/null +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/parser/UnaryOperator.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.terrascript.v2.parser; + +import com.dfsek.terra.addons.terrascript.v2.lexer.Token; + + +public enum UnaryOperator { + NOT(Token.TokenType.BANG), + NEGATE(Token.TokenType.MINUS); + + public final Token.TokenType tokenType; + + UnaryOperator(Token.TokenType tokenType) { this.tokenType = tokenType; } +} diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/FunctionReferenceAnalyzer.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/FunctionReferenceAnalyzer.java similarity index 66% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/FunctionReferenceAnalyzer.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/FunctionReferenceAnalyzer.java index 7b57e0ddb..43828cf3a 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/FunctionReferenceAnalyzer.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/FunctionReferenceAnalyzer.java @@ -1,31 +1,31 @@ -package com.dfsek.terra.addons.terrascript.semanticanalysis; +package com.dfsek.terra.addons.terrascript.v2.semanticanalysis; -import com.dfsek.terra.addons.terrascript.Environment.ScopeException.NonexistentSymbolException; -import com.dfsek.terra.addons.terrascript.Environment.ScopeException.SymbolTypeMismatchException; -import com.dfsek.terra.addons.terrascript.ErrorHandler; -import com.dfsek.terra.addons.terrascript.ast.Expr; -import com.dfsek.terra.addons.terrascript.ast.Expr.Assignment; -import com.dfsek.terra.addons.terrascript.ast.Expr.Binary; -import com.dfsek.terra.addons.terrascript.ast.Expr.Call; -import com.dfsek.terra.addons.terrascript.ast.Expr.Grouping; -import com.dfsek.terra.addons.terrascript.ast.Expr.Literal; -import com.dfsek.terra.addons.terrascript.ast.Expr.Unary; -import com.dfsek.terra.addons.terrascript.ast.Expr.Variable; -import com.dfsek.terra.addons.terrascript.ast.Expr.Void; -import com.dfsek.terra.addons.terrascript.ast.Stmt; -import com.dfsek.terra.addons.terrascript.ast.Stmt.Block; -import com.dfsek.terra.addons.terrascript.ast.Stmt.Break; -import com.dfsek.terra.addons.terrascript.ast.Stmt.Continue; -import com.dfsek.terra.addons.terrascript.ast.Stmt.Expression; -import com.dfsek.terra.addons.terrascript.ast.Stmt.For; -import com.dfsek.terra.addons.terrascript.ast.Stmt.FunctionDeclaration; -import com.dfsek.terra.addons.terrascript.ast.Stmt.If; -import com.dfsek.terra.addons.terrascript.ast.Stmt.NoOp; -import com.dfsek.terra.addons.terrascript.ast.Stmt.Return; -import com.dfsek.terra.addons.terrascript.ast.Stmt.VariableDeclaration; -import com.dfsek.terra.addons.terrascript.ast.Stmt.While; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.UndefinedReferenceException; -import com.dfsek.terra.addons.terrascript.parser.ParseException; +import com.dfsek.terra.addons.terrascript.v2.Environment.ScopeException.NonexistentSymbolException; +import com.dfsek.terra.addons.terrascript.v2.Environment.ScopeException.SymbolTypeMismatchException; +import com.dfsek.terra.addons.terrascript.v2.ErrorHandler; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Assignment; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Binary; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Call; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Grouping; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Literal; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Unary; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Variable; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Void; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.Block; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.Break; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.Continue; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.Expression; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.For; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.FunctionDeclaration; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.If; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.NoOp; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.Return; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.VariableDeclaration; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.While; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.UndefinedReferenceException; +import com.dfsek.terra.addons.terrascript.v2.parser.ParseException; import com.dfsek.terra.api.util.generic.pair.Pair; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/ScopeAnalyzer.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/ScopeAnalyzer.java similarity index 79% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/ScopeAnalyzer.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/ScopeAnalyzer.java index dff45125d..2c09aed8e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/ScopeAnalyzer.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/ScopeAnalyzer.java @@ -1,25 +1,25 @@ -package com.dfsek.terra.addons.terrascript.semanticanalysis; +package com.dfsek.terra.addons.terrascript.v2.semanticanalysis; -import com.dfsek.terra.addons.terrascript.Environment; -import com.dfsek.terra.addons.terrascript.Environment.ScopeException.NonexistentSymbolException; -import com.dfsek.terra.addons.terrascript.Environment.ScopeException.SymbolTypeMismatchException; -import com.dfsek.terra.addons.terrascript.Environment.Symbol; -import com.dfsek.terra.addons.terrascript.ErrorHandler; -import com.dfsek.terra.addons.terrascript.Type; -import com.dfsek.terra.addons.terrascript.ast.Expr; -import com.dfsek.terra.addons.terrascript.ast.Expr.Assignment; -import com.dfsek.terra.addons.terrascript.ast.Expr.Binary; -import com.dfsek.terra.addons.terrascript.ast.Expr.Call; -import com.dfsek.terra.addons.terrascript.ast.Expr.Grouping; -import com.dfsek.terra.addons.terrascript.ast.Expr.Literal; -import com.dfsek.terra.addons.terrascript.ast.Expr.Unary; -import com.dfsek.terra.addons.terrascript.ast.Expr.Variable; -import com.dfsek.terra.addons.terrascript.ast.Expr.Visitor; -import com.dfsek.terra.addons.terrascript.ast.Expr.Void; -import com.dfsek.terra.addons.terrascript.ast.Stmt; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.IdentifierAlreadyDeclaredException; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.UndefinedReferenceException; -import com.dfsek.terra.addons.terrascript.parser.ParseException; +import com.dfsek.terra.addons.terrascript.v2.Environment; +import com.dfsek.terra.addons.terrascript.v2.Environment.ScopeException.NonexistentSymbolException; +import com.dfsek.terra.addons.terrascript.v2.Environment.ScopeException.SymbolTypeMismatchException; +import com.dfsek.terra.addons.terrascript.v2.Environment.Symbol; +import com.dfsek.terra.addons.terrascript.v2.ErrorHandler; +import com.dfsek.terra.addons.terrascript.v2.Type; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Assignment; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Binary; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Call; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Grouping; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Literal; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Unary; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Variable; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Visitor; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Void; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.IdentifierAlreadyDeclaredException; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.UndefinedReferenceException; +import com.dfsek.terra.addons.terrascript.v2.parser.ParseException; import com.dfsek.terra.api.util.generic.pair.Pair; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/SemanticAnalyzer.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/SemanticAnalyzer.java similarity index 66% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/SemanticAnalyzer.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/SemanticAnalyzer.java index 3b92afec6..d0456d6b3 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/SemanticAnalyzer.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/SemanticAnalyzer.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.addons.terrascript.semanticanalysis; +package com.dfsek.terra.addons.terrascript.v2.semanticanalysis; -import com.dfsek.terra.addons.terrascript.Environment; -import com.dfsek.terra.addons.terrascript.ErrorHandler; -import com.dfsek.terra.addons.terrascript.ast.Stmt; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt; +import com.dfsek.terra.addons.terrascript.v2.Environment; +import com.dfsek.terra.addons.terrascript.v2.ErrorHandler; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt; public class SemanticAnalyzer { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/TypeChecker.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/TypeChecker.java similarity index 89% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/TypeChecker.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/TypeChecker.java index 6bda8cf58..6dd2299ae 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/semanticanalysis/TypeChecker.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/semanticanalysis/TypeChecker.java @@ -1,30 +1,30 @@ -package com.dfsek.terra.addons.terrascript.semanticanalysis; +package com.dfsek.terra.addons.terrascript.v2.semanticanalysis; import java.util.List; import java.util.Optional; -import com.dfsek.terra.addons.terrascript.Environment; -import com.dfsek.terra.addons.terrascript.Environment.Symbol; -import com.dfsek.terra.addons.terrascript.ErrorHandler; -import com.dfsek.terra.addons.terrascript.Type; -import com.dfsek.terra.addons.terrascript.ast.Expr.Assignment; -import com.dfsek.terra.addons.terrascript.ast.Expr.Binary; -import com.dfsek.terra.addons.terrascript.ast.Expr.Call; -import com.dfsek.terra.addons.terrascript.ast.Expr.Grouping; -import com.dfsek.terra.addons.terrascript.ast.Expr.Literal; -import com.dfsek.terra.addons.terrascript.ast.Expr.Unary; -import com.dfsek.terra.addons.terrascript.ast.Expr.Variable; -import com.dfsek.terra.addons.terrascript.ast.Expr.Visitor; -import com.dfsek.terra.addons.terrascript.ast.Expr.Void; -import com.dfsek.terra.addons.terrascript.ast.Stmt; -import com.dfsek.terra.addons.terrascript.ast.TypedExpr; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.InvalidFunctionDeclarationException; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.InvalidTypeException; -import com.dfsek.terra.addons.terrascript.parser.ParseException; +import com.dfsek.terra.addons.terrascript.v2.Environment; +import com.dfsek.terra.addons.terrascript.v2.Environment.Symbol; +import com.dfsek.terra.addons.terrascript.v2.ErrorHandler; +import com.dfsek.terra.addons.terrascript.v2.Type; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Assignment; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Binary; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Call; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Grouping; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Literal; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Unary; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Variable; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Visitor; +import com.dfsek.terra.addons.terrascript.v2.ast.Expr.Void; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedExpr; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.InvalidFunctionDeclarationException; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.InvalidTypeException; +import com.dfsek.terra.addons.terrascript.v2.parser.ParseException; import com.dfsek.terra.api.util.generic.pair.Pair; -import static com.dfsek.terra.addons.terrascript.util.OrdinalUtil.ordinalOf; +import static com.dfsek.terra.addons.terrascript.v2.util.OrdinalUtil.ordinalOf; public class TypeChecker implements Visitor, Stmt.Visitor { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/util/ASMUtil.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/util/ASMUtil.java similarity index 81% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/util/ASMUtil.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/util/ASMUtil.java index 911ac10ef..c8c6034fd 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/util/ASMUtil.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/util/ASMUtil.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.addons.terrascript.util; +package com.dfsek.terra.addons.terrascript.v2.util; -import com.dfsek.terra.addons.terrascript.Type; +import com.dfsek.terra.addons.terrascript.v2.Type; public class ASMUtil { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/util/OrdinalUtil.java b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/util/OrdinalUtil.java similarity index 85% rename from common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/util/OrdinalUtil.java rename to common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/util/OrdinalUtil.java index 28d9f50d5..8432c2948 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/util/OrdinalUtil.java +++ b/common/addons/structure-terrascript-v2/src/main/java/com/dfsek/terra/addons/terrascript/v2/util/OrdinalUtil.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.terrascript.util; +package com.dfsek.terra.addons.terrascript.v2.util; public class OrdinalUtil { public static String ordinalOf(int i) { diff --git a/common/addons/structure-terrascript-loader-v1/src/main/resources/terra.addon.yml b/common/addons/structure-terrascript-v2/src/main/resources/terra.addon.yml similarity index 73% rename from common/addons/structure-terrascript-loader-v1/src/main/resources/terra.addon.yml rename to common/addons/structure-terrascript-v2/src/main/resources/terra.addon.yml index 0850687c9..4ce382b35 100644 --- a/common/addons/structure-terrascript-loader-v1/src/main/resources/terra.addon.yml +++ b/common/addons/structure-terrascript-v2/src/main/resources/terra.addon.yml @@ -1,10 +1,10 @@ schema-version: 1 contributors: - Terra contributors -id: structure-terrascript-loader +id: structure-terrascript-v2 version: @VERSION@ entrypoints: - - "com.dfsek.terra.addons.terrascript.TerraScriptAddon" + - "com.dfsek.terra.addons.terrascript.v2.TerraScript2Addon" website: issues: https://github.com/PolyhedralDev/Terra/issues source: https://github.com/PolyhedralDev/Terra diff --git a/common/addons/structure-terrascript-loader/src/test/java/codegen/CodeGenTest.java b/common/addons/structure-terrascript-v2/src/test/java/codegen/CodeGenTest.java similarity index 87% rename from common/addons/structure-terrascript-loader/src/test/java/codegen/CodeGenTest.java rename to common/addons/structure-terrascript-v2/src/test/java/codegen/CodeGenTest.java index 52edb265d..46929d745 100644 --- a/common/addons/structure-terrascript-loader/src/test/java/codegen/CodeGenTest.java +++ b/common/addons/structure-terrascript-v2/src/test/java/codegen/CodeGenTest.java @@ -1,18 +1,16 @@ package codegen; -import com.dfsek.terra.addons.terrascript.ErrorHandler; -import com.dfsek.terra.addons.terrascript.ast.Stmt.Block; -import com.dfsek.terra.addons.terrascript.ast.TypedStmt; -import com.dfsek.terra.addons.terrascript.codegen.TerraScript; -import com.dfsek.terra.addons.terrascript.codegen.asm.TerraScriptClassGenerator; -import com.dfsek.terra.addons.terrascript.lexer.Lexer; -import com.dfsek.terra.addons.terrascript.parser.Parser; -import com.dfsek.terra.addons.terrascript.semanticanalysis.SemanticAnalyzer; +import com.dfsek.terra.addons.terrascript.v2.ErrorHandler; +import com.dfsek.terra.addons.terrascript.v2.ast.Stmt.Block; +import com.dfsek.terra.addons.terrascript.v2.ast.TypedStmt; +import com.dfsek.terra.addons.terrascript.v2.codegen.TerraScript; +import com.dfsek.terra.addons.terrascript.v2.codegen.asm.TerraScriptClassGenerator; +import com.dfsek.terra.addons.terrascript.v2.lexer.Lexer; +import com.dfsek.terra.addons.terrascript.v2.parser.Parser; +import com.dfsek.terra.addons.terrascript.v2.semanticanalysis.SemanticAnalyzer; import org.junit.jupiter.api.Test; -import java.util.Objects; - public class CodeGenTest { diff --git a/common/addons/structure-terrascript-loader/src/test/java/lexer/LexerTest.java b/common/addons/structure-terrascript-v2/src/test/java/lexer/LexerTest.java similarity index 73% rename from common/addons/structure-terrascript-loader/src/test/java/lexer/LexerTest.java rename to common/addons/structure-terrascript-v2/src/test/java/lexer/LexerTest.java index 6da293121..6afbea2ae 100644 --- a/common/addons/structure-terrascript-loader/src/test/java/lexer/LexerTest.java +++ b/common/addons/structure-terrascript-v2/src/test/java/lexer/LexerTest.java @@ -1,11 +1,11 @@ package lexer; -import com.dfsek.terra.addons.terrascript.lexer.Lexer; +import com.dfsek.terra.addons.terrascript.v2.lexer.Lexer; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; -import com.dfsek.terra.addons.terrascript.lexer.Token; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.v2.lexer.Token; -import com.dfsek.terra.addons.terrascript.lexer.Token.TokenType; +import com.dfsek.terra.addons.terrascript.v2.lexer.Token.TokenType; import org.junit.jupiter.api.Test; diff --git a/common/addons/structure-terrascript-loader/src/test/java/lexer/LookaheadStreamTest.java b/common/addons/structure-terrascript-v2/src/test/java/lexer/LookaheadStreamTest.java similarity index 94% rename from common/addons/structure-terrascript-loader/src/test/java/lexer/LookaheadStreamTest.java rename to common/addons/structure-terrascript-v2/src/test/java/lexer/LookaheadStreamTest.java index 8910f1f81..bfd2d8b7f 100644 --- a/common/addons/structure-terrascript-loader/src/test/java/lexer/LookaheadStreamTest.java +++ b/common/addons/structure-terrascript-v2/src/test/java/lexer/LookaheadStreamTest.java @@ -7,10 +7,10 @@ package lexer; -import com.dfsek.terra.addons.terrascript.lexer.LookaheadStream; -import com.dfsek.terra.addons.terrascript.lexer.Char; +import com.dfsek.terra.addons.terrascript.v2.lexer.LookaheadStream; +import com.dfsek.terra.addons.terrascript.v2.lexer.Char; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.v2.lexer.SourcePosition; import org.junit.jupiter.api.Test; diff --git a/common/addons/structure-terrascript-loader/src/test/java/semanticanalysis/SemanticAnalyzerTest.java b/common/addons/structure-terrascript-v2/src/test/java/semanticanalysis/SemanticAnalyzerTest.java similarity index 95% rename from common/addons/structure-terrascript-loader/src/test/java/semanticanalysis/SemanticAnalyzerTest.java rename to common/addons/structure-terrascript-v2/src/test/java/semanticanalysis/SemanticAnalyzerTest.java index eb2fe5ef8..e31613631 100644 --- a/common/addons/structure-terrascript-loader/src/test/java/semanticanalysis/SemanticAnalyzerTest.java +++ b/common/addons/structure-terrascript-v2/src/test/java/semanticanalysis/SemanticAnalyzerTest.java @@ -1,14 +1,14 @@ package semanticanalysis; -import com.dfsek.terra.addons.terrascript.ErrorHandler; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.IdentifierAlreadyDeclaredException; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.UndefinedReferenceException; -import com.dfsek.terra.addons.terrascript.semanticanalysis.SemanticAnalyzer; -import com.dfsek.terra.addons.terrascript.lexer.Lexer; -import com.dfsek.terra.addons.terrascript.parser.Parser; +import com.dfsek.terra.addons.terrascript.v2.ErrorHandler; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.IdentifierAlreadyDeclaredException; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.UndefinedReferenceException; +import com.dfsek.terra.addons.terrascript.v2.semanticanalysis.SemanticAnalyzer; +import com.dfsek.terra.addons.terrascript.v2.lexer.Lexer; +import com.dfsek.terra.addons.terrascript.v2.parser.Parser; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.InvalidFunctionDeclarationException; -import com.dfsek.terra.addons.terrascript.exception.semanticanalysis.InvalidTypeException; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.InvalidFunctionDeclarationException; +import com.dfsek.terra.addons.terrascript.v2.exception.semanticanalysis.InvalidTypeException; import org.junit.jupiter.api.Test; diff --git a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java index dcb20edc5..1dfb1d293 100644 --- a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java +++ b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java @@ -7,18 +7,16 @@ package com.dfsek.terra.addon.terrascript.check; -import com.dfsek.terra.addons.terrascript.Type; - import net.jafama.FastMath; import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.ImplementationArguments; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.Expression; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.Scope; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.functions.Function; -import com.dfsek.terra.addons.terrascript.legacy.script.TerraImplementationArguments; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.parser.lang.Scope; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; +import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; +import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.vector.Vector2; import com.dfsek.terra.api.util.vector.Vector3; @@ -27,10 +25,10 @@ import com.dfsek.terra.api.world.WritableWorld; public class CheckFunction implements Function { - private final Expression x, y, z; - private final SourcePosition position; + private final Returnable x, y, z; + private final Position position; - public CheckFunction(Expression x, Expression y, Expression z, SourcePosition position) { + public CheckFunction(Returnable x, Returnable y, Returnable z, Position position) { this.x = x; this.y = y; this.z = z; @@ -39,32 +37,32 @@ public class CheckFunction implements Function { @Override - public String evaluate(ImplementationArguments implementationArguments, Scope scope) { + public String apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = Vector2.of(x.evaluate(implementationArguments, scope).doubleValue(), - z.evaluate(implementationArguments, scope).doubleValue()); + Vector2 xz = Vector2.of(x.apply(implementationArguments, scope).doubleValue(), + z.apply(implementationArguments, scope).doubleValue()); RotationUtil.rotateVector(xz, arguments.getRotation()); Vector3 location = arguments.getOrigin().toVector3Mutable().add( - Vector3.of(FastMath.roundToInt(xz.getX()), y.evaluate(implementationArguments, scope).doubleValue(), + Vector3.of(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), FastMath.roundToInt(xz.getZ()))).immutable(); return apply(location, arguments.getWorld()); } @Override - public SourcePosition getPosition() { + public Position getPosition() { return position; } @Override - public Type returnType() { - return Type.STRING; + public ReturnType returnType() { + return ReturnType.STRING; } private String apply(Vector3 vector, WritableWorld world) { diff --git a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunctionBuilder.java b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunctionBuilder.java index 880bcf122..dc0a0b1da 100644 --- a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunctionBuilder.java +++ b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunctionBuilder.java @@ -9,10 +9,9 @@ package com.dfsek.terra.addon.terrascript.check; import java.util.List; -import com.dfsek.terra.addons.terrascript.Type; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.Expression; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.Platform; @@ -25,9 +24,9 @@ public class CheckFunctionBuilder implements FunctionBuilder { @SuppressWarnings("unchecked") @Override - public CheckFunction build(List> argumentList, SourcePosition position) { - return new CheckFunction((Expression) argumentList.get(0), (Expression) argumentList.get(1), - (Expression) argumentList.get(2), position); + public CheckFunction build(List> argumentList, Position position) { + return new CheckFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), position); } @Override @@ -36,9 +35,9 @@ public class CheckFunctionBuilder implements FunctionBuilder { } @Override - public Type getArgument(int position) { + public Returnable.ReturnType getArgument(int position) { return switch(position) { - case 0, 1, 2 -> Type.NUMBER; + case 0, 1, 2 -> Returnable.ReturnType.NUMBER; default -> null; }; } diff --git a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/TerraScriptCheckFunctionAddon.java b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/TerraScriptCheckFunctionAddon.java index ad3b345eb..26a1ca358 100644 --- a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/TerraScriptCheckFunctionAddon.java +++ b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/TerraScriptCheckFunctionAddon.java @@ -1,7 +1,7 @@ package com.dfsek.terra.addon.terrascript.check; import com.dfsek.terra.addons.manifest.api.AddonInitializer; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java index 1505660fe..83cf2563b 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/ConstantSamplerFunction.java @@ -1,29 +1,28 @@ package com.dfsek.terra.addons.terrascript.sampler; -import com.dfsek.terra.addons.terrascript.Type; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.ImplementationArguments; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.Expression; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.Scope; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.functions.Function; -import com.dfsek.terra.addons.terrascript.legacy.script.TerraImplementationArguments; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.parser.lang.Scope; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; +import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; +import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.noise.NoiseSampler; public class ConstantSamplerFunction implements Function { - private final Expression x, y, z; + private final Returnable x, y, z; private final NoiseSampler sampler; private final boolean twoD; - private final SourcePosition position; + private final Position position; public ConstantSamplerFunction(NoiseSampler sampler, - Expression x, - Expression y, - Expression z, + Returnable x, + Returnable y, + Returnable z, boolean twoD, - SourcePosition position) { + Position position) { this.x = x; this.y = y; this.z = z; @@ -33,27 +32,27 @@ public class ConstantSamplerFunction implements Function { } @Override - public Number evaluate(ImplementationArguments implementationArguments, Scope scope) { + public Number apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - double x = this.x.evaluate(implementationArguments, scope).doubleValue(); + double x = this.x.apply(implementationArguments, scope).doubleValue(); - double z = this.z.evaluate(implementationArguments, scope).doubleValue(); + double z = this.z.apply(implementationArguments, scope).doubleValue(); if(twoD) { return sampler.noise(arguments.getWorld().getSeed(), x, z); } else { - double y = this.y.evaluate(implementationArguments, scope).doubleValue(); + double y = this.y.apply(implementationArguments, scope).doubleValue(); return sampler.noise(arguments.getWorld().getSeed(), x, y, z); } } @Override - public SourcePosition getPosition() { + public Position getPosition() { return position; } @Override - public Type returnType() { - return Type.NUMBER; + public ReturnType returnType() { + return ReturnType.NUMBER; } } diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java index 23376b58a..abaafecab 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunction.java @@ -2,32 +2,31 @@ package com.dfsek.terra.addons.terrascript.sampler; import java.util.function.Supplier; -import com.dfsek.terra.addons.terrascript.Type; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.ImplementationArguments; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.Expression; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.Scope; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.functions.Function; -import com.dfsek.terra.addons.terrascript.legacy.script.TerraImplementationArguments; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.parser.lang.Scope; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; +import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; +import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.api.noise.NoiseSampler; public class SamplerFunction implements Function { - private final Expression x, y, z; - private final Expression function; + private final Returnable x, y, z; + private final Returnable function; private final java.util.function.Function, NoiseSampler> samplerFunction; private final boolean twoD; - private final SourcePosition position; + private final Position position; - public SamplerFunction(Expression function, - Expression x, - Expression y, - Expression z, + public SamplerFunction(Returnable function, + Returnable x, + Returnable y, + Returnable z, java.util.function.Function, NoiseSampler> samplerFunction, boolean twoD, - SourcePosition position) { + Position position) { this.x = x; this.y = y; this.z = z; @@ -38,28 +37,28 @@ public class SamplerFunction implements Function { } @Override - public Number evaluate(ImplementationArguments implementationArguments, Scope scope) { + public Number apply(ImplementationArguments implementationArguments, Scope scope) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - double x = this.x.evaluate(implementationArguments, scope).doubleValue(); + double x = this.x.apply(implementationArguments, scope).doubleValue(); - double z = this.z.evaluate(implementationArguments, scope).doubleValue(); + double z = this.z.apply(implementationArguments, scope).doubleValue(); - NoiseSampler sampler = samplerFunction.apply(() -> function.evaluate(implementationArguments, scope)); + NoiseSampler sampler = samplerFunction.apply(() -> function.apply(implementationArguments, scope)); if(twoD) { return sampler.noise(arguments.getWorld().getSeed(), x, z); } else { - double y = this.y.evaluate(implementationArguments, scope).doubleValue(); + double y = this.y.apply(implementationArguments, scope).doubleValue(); return sampler.noise(arguments.getWorld().getSeed(), x, y, z); } } @Override - public SourcePosition getPosition() { + public Position getPosition() { return position; } @Override - public Type returnType() { - return Type.NUMBER; + public ReturnType returnType() { + return ReturnType.NUMBER; } } diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java index a82864198..07ce640fd 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/SamplerFunctionBuilder.java @@ -6,16 +6,15 @@ import java.util.Map; import java.util.Objects; import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.functions.Function; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.Expression; -import com.dfsek.terra.addons.terrascript.Type; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.constants.NumericConstant; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.constants.StringConstant; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.addons.terrascript.lexer.SourcePosition; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; +import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; +import com.dfsek.terra.addons.terrascript.parser.lang.constants.NumericConstant; +import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.addons.terrascript.tokenizer.Position; -public class SamplerFunctionBuilder implements FunctionBuilder> { +public class SamplerFunctionBuilder implements FunctionBuilder> { private final Map samplers2d; private final Map samplers3d; @@ -34,25 +33,25 @@ public class SamplerFunctionBuilder implements FunctionBuilder> @SuppressWarnings("unchecked") @Override - public Function build(List> argumentList, - SourcePosition position) { - Expression arg = (Expression) argumentList.get(0); + public com.dfsek.terra.addons.terrascript.parser.lang.functions.Function build(List> argumentList, + Position position) { + Returnable arg = (Returnable) argumentList.get(0); if(argumentList.size() == 3) { // 2D if(arg instanceof StringConstant constant) { return new ConstantSamplerFunction(Objects.requireNonNull(samplers2d.get(constant.getConstant()), "No such 2D noise function " + constant.getConstant()) .getSampler(), - (Expression) argumentList.get(1), + (Returnable) argumentList.get(1), new NumericConstant(0, position), - (Expression) argumentList.get(2), + (Returnable) argumentList.get(2), true, position); } else { - return new SamplerFunction((Expression) argumentList.get(0), - (Expression) argumentList.get(1), + return new SamplerFunction((Returnable) argumentList.get(0), + (Returnable) argumentList.get(1), new NumericConstant(0, position), - (Expression) argumentList.get(2), + (Returnable) argumentList.get(2), s -> Objects.requireNonNull(samplers2d.get(s.get()), "No such 2D noise function " + s.get()) .getSampler(), true, @@ -64,16 +63,16 @@ public class SamplerFunctionBuilder implements FunctionBuilder> return new ConstantSamplerFunction(Objects.requireNonNull(samplers3d.get(constant.getConstant()), "No such 3D noise function " + constant.getConstant()) .getSampler(), - (Expression) argumentList.get(1), - (Expression) argumentList.get(2), - (Expression) argumentList.get(3), + (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), + (Returnable) argumentList.get(3), true, position); } else { - return new SamplerFunction((Expression) argumentList.get(0), - (Expression) argumentList.get(1), - (Expression) argumentList.get(2), - (Expression) argumentList.get(3), + return new SamplerFunction((Returnable) argumentList.get(0), + (Returnable) argumentList.get(1), + (Returnable) argumentList.get(2), + (Returnable) argumentList.get(3), s -> Objects.requireNonNull(samplers3d.get(s.get()), "No such 3D noise function " + s.get()) .getSampler(), true, @@ -88,10 +87,10 @@ public class SamplerFunctionBuilder implements FunctionBuilder> } @Override - public Type getArgument(int position) { + public ReturnType getArgument(int position) { return switch(position) { - case 0 -> Type.STRING; - case 1, 2, 3 -> Type.NUMBER; + case 0 -> ReturnType.STRING; + case 1, 2, 3 -> ReturnType.NUMBER; default -> null; }; } diff --git a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java index f2d9821d3..cdb4b92bd 100644 --- a/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java +++ b/common/addons/terrascript-function-sampler/src/main/java/com/dfsek/terra/addons/terrascript/sampler/TerraScriptSamplerFunctionAddon.java @@ -2,7 +2,7 @@ package com.dfsek.terra.addons.terrascript.sampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.noise.NoiseConfigPackTemplate; -import com.dfsek.terra.addons.terrascript.legacy.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;