From 662d2fb803f628434cea97349bcdd58160cb06d8 Mon Sep 17 00:00:00 2001 From: EmreTr1 Date: Wed, 2 Dec 2020 00:07:18 +0300 Subject: [PATCH] initial commit --- .gitignore | 1 + .../6.3/executionHistory/executionHistory.bin | Bin 0 -> 164919 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/6.3/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/6.3/fileContent/fileContent.lock | Bin 0 -> 17 bytes .gradle/6.3/fileHashes/fileHashes.bin | Bin 0 -> 25647 bytes .gradle/6.3/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../6.3/fileHashes/resourceHashesCache.bin | Bin 0 -> 21319 bytes .gradle/6.3/gc.properties | 0 .gradle/6.3/javaCompile/classAnalysis.bin | Bin 0 -> 718210 bytes .gradle/6.3/javaCompile/jarAnalysis.bin | Bin 0 -> 94341 bytes .gradle/6.3/javaCompile/javaCompile.lock | Bin 0 -> 17 bytes .gradle/6.3/javaCompile/taskHistory.bin | Bin 0 -> 23069 bytes .../6.5/executionHistory/executionHistory.bin | Bin 0 -> 20095 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/6.5/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/6.5/fileHashes/fileHashes.bin | Bin 0 -> 18697 bytes .gradle/6.5/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/6.5/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 19037 bytes .gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/checksums/md5-checksums.bin | Bin 0 -> 19247 bytes .gradle/checksums/sha1-checksums.bin | Bin 0 -> 21089 bytes .gradle/vcs-1/gc.properties | 0 build.gradle | 36 ++ .../java/main/com/phoshp/molang/MoLang.class | Bin 0 -> 279 bytes .../com/phoshp/molang/parser/Expression.class | Bin 0 -> 126 bytes .../phoshp/molang/parser/InfixParselet.class | Bin 0 -> 308 bytes .../phoshp/molang/parser/MoLangParser.class | Bin 0 -> 8743 bytes .../com/phoshp/molang/parser/Parselet.class | Bin 0 -> 261 bytes .../expression/ArrayAccessExpression.class | Bin 0 -> 1862 bytes .../parser/expression/AssignExpression.class | Bin 0 -> 1854 bytes .../expression/BinaryOpExpression.class | Bin 0 -> 822 bytes .../parser/expression/BooleanExpression.class | Bin 0 -> 1226 bytes .../expression/BooleanNotExpression.class | Bin 0 -> 1522 bytes .../parser/expression/BreakExpression.class | Bin 0 -> 769 bytes .../expression/ContinueExpression.class | Bin 0 -> 781 bytes .../parser/expression/ForEachExpression.class | Bin 0 -> 2230 bytes .../expression/FuncCallExpression.class | Bin 0 -> 1985 bytes .../parser/expression/LoopExpression.class | Bin 0 -> 1828 bytes .../parser/expression/NameExpression.class | Bin 0 -> 1324 bytes .../parser/expression/NumberExpression.class | Bin 0 -> 1270 bytes .../parser/expression/ReturnExpression.class | Bin 0 -> 1506 bytes .../expression/StatementExpression.class | Bin 0 -> 1493 bytes .../parser/expression/StringExpression.class | Bin 0 -> 1344 bytes .../parser/expression/TernaryExpression.class | Bin 0 -> 2278 bytes .../parser/expression/ThisExpression.class | Bin 0 -> 765 bytes .../expression/UnaryMinusExpression.class | Bin 0 -> 1522 bytes .../expression/UnaryPlusExpression.class | Bin 0 -> 1518 bytes .../expression/binaryop/ArrowExpression.class | Bin 0 -> 654 bytes .../binaryop/BooleanAndExpression.class | Bin 0 -> 669 bytes .../binaryop/BooleanOrExpression.class | Bin 0 -> 666 bytes .../binaryop/CoalesceExpression.class | Bin 0 -> 663 bytes .../binaryop/DivideExpression.class | Bin 0 -> 656 bytes .../expression/binaryop/EqualExpression.class | Bin 0 -> 654 bytes .../binaryop/GreaterExpression.class | Bin 0 -> 659 bytes .../binaryop/GreaterOrEqualExpression.class | Bin 0 -> 681 bytes .../expression/binaryop/MinusExpression.class | Bin 0 -> 653 bytes .../binaryop/NotEqualExpression.class | Bin 0 -> 663 bytes .../expression/binaryop/PlusExpression.class | Bin 0 -> 650 bytes .../expression/binaryop/PowExpression.class | Bin 0 -> 647 bytes .../binaryop/SmallerExpression.class | Bin 0 -> 659 bytes .../binaryop/SmallerOrEqualExpression.class | Bin 0 -> 681 bytes .../parser/parselet/ArrayAccessParselet.class | Bin 0 -> 1363 bytes .../parser/parselet/AssignParselet.class | Bin 0 -> 1064 bytes .../parser/parselet/BooleanNotParselet.class | Bin 0 -> 939 bytes .../parser/parselet/BooleanParselet.class | Bin 0 -> 942 bytes .../parselet/BracketScopeParselet.class | Bin 0 -> 1864 bytes .../parser/parselet/BreakParselet.class | Bin 0 -> 754 bytes .../parser/parselet/ContinueParselet.class | Bin 0 -> 766 bytes .../parser/parselet/ForEachParselet.class | Bin 0 -> 1667 bytes .../parselet/GenericBinaryOpParselet$1.class | Bin 0 -> 1427 bytes .../parselet/GenericBinaryOpParselet.class | Bin 0 -> 2821 bytes .../parser/parselet/GroupParselet.class | Bin 0 -> 1120 bytes .../molang/parser/parselet/LoopParselet.class | Bin 0 -> 1605 bytes .../molang/parser/parselet/NameParselet.class | Bin 0 -> 1860 bytes .../parser/parselet/NumberParselet.class | Bin 0 -> 934 bytes .../parser/parselet/ReturnParselet.class | Bin 0 -> 923 bytes .../parser/parselet/StringParselet.class | Bin 0 -> 880 bytes .../parser/parselet/TernaryParselet.class | Bin 0 -> 1464 bytes .../molang/parser/parselet/ThisParselet.class | Bin 0 -> 750 bytes .../parser/parselet/UnaryMinusParselet.class | Bin 0 -> 939 bytes .../parser/parselet/UnaryPlusParselet.class | Bin 0 -> 935 bytes .../molang/parser/tokenizer/Token.class | Bin 0 -> 2002 bytes .../parser/tokenizer/TokenIterator.class | Bin 0 -> 3152 bytes .../parser/tokenizer/TokenPosition.class | Bin 0 -> 2188 bytes .../molang/parser/tokenizer/TokenType.class | Bin 0 -> 3958 bytes .../test/com/phoshp/molang/ParseTest.class | Bin 0 -> 3252 bytes build/libs/MoLang-1.0-SNAPSHOT.jar | Bin 0 -> 52256 bytes .../classes/com.phoshp.molang.ParseTest.html | 449 ++++++++++++++++++ build/reports/tests/test/css/base-style.css | 179 +++++++ build/reports/tests/test/css/style.css | 84 ++++ build/reports/tests/test/index.html | 133 ++++++ build/reports/tests/test/js/report.js | 194 ++++++++ .../test/packages/com.phoshp.molang.html | 103 ++++ build/resources/test/parse_test.txt | 21 + build/resources/test/parse_test2.txt | 1 + .../test/TEST-com.phoshp.molang.ParseTest.xml | 344 ++++++++++++++ build/test-results/test/binary/output.bin | 353 ++++++++++++++ build/test-results/test/binary/output.bin.idx | Bin 0 -> 69 bytes build/test-results/test/binary/results.bin | Bin 0 -> 115 bytes build/tmp/jar/MANIFEST.MF | 2 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++++++ gradlew.bat | 104 ++++ settings.gradle | 2 + src/main/java/com/phoshp/molang/MoLang.java | 8 + .../com/phoshp/molang/parser/Expression.java | 4 + .../phoshp/molang/parser/InfixParselet.java | 8 + .../phoshp/molang/parser/MoLangParser.java | 200 ++++++++ .../com/phoshp/molang/parser/Parselet.java | 8 + .../expression/ArrayAccessExpression.java | 11 + .../parser/expression/AssignExpression.java | 11 + .../parser/expression/BinaryOpExpression.java | 14 + .../parser/expression/BooleanExpression.java | 10 + .../expression/BooleanNotExpression.java | 10 + .../parser/expression/BreakExpression.java | 9 + .../parser/expression/ContinueExpression.java | 9 + .../parser/expression/ForEachExpression.java | 12 + .../parser/expression/FuncCallExpression.java | 11 + .../parser/expression/LoopExpression.java | 11 + .../parser/expression/NameExpression.java | 10 + .../parser/expression/NumberExpression.java | 10 + .../parser/expression/ReturnExpression.java | 10 + .../expression/StatementExpression.java | 10 + .../parser/expression/StringExpression.java | 10 + .../parser/expression/TernaryExpression.java | 12 + .../parser/expression/ThisExpression.java | 9 + .../expression/UnaryMinusExpression.java | 10 + .../expression/UnaryPlusExpression.java | 10 + .../expression/binaryop/ArrowExpression.java | 16 + .../binaryop/BooleanAndExpression.java | 16 + .../binaryop/BooleanOrExpression.java | 16 + .../binaryop/CoalesceExpression.java | 16 + .../expression/binaryop/DivideExpression.java | 16 + .../expression/binaryop/EqualExpression.java | 16 + .../binaryop/GreaterExpression.java | 16 + .../binaryop/GreaterOrEqualExpression.java | 16 + .../expression/binaryop/MinusExpression.java | 16 + .../binaryop/NotEqualExpression.java | 16 + .../expression/binaryop/PlusExpression.java | 16 + .../expression/binaryop/PowExpression.java | 16 + .../binaryop/SmallerExpression.java | 16 + .../binaryop/SmallerOrEqualExpression.java | 16 + .../parser/parselet/ArrayAccessParselet.java | 20 + .../parser/parselet/AssignParselet.java | 16 + .../parser/parselet/BooleanNotParselet.java | 15 + .../parser/parselet/BooleanParselet.java | 15 + .../parser/parselet/BracketScopeParselet.java | 33 ++ .../molang/parser/parselet/BreakParselet.java | 15 + .../parser/parselet/ContinueParselet.java | 15 + .../parser/parselet/ForEachParselet.java | 23 + .../parselet/GenericBinaryOpParselet.java | 49 ++ .../molang/parser/parselet/GroupParselet.java | 19 + .../molang/parser/parselet/LoopParselet.java | 23 + .../molang/parser/parselet/NameParselet.java | 27 ++ .../parser/parselet/NumberParselet.java | 15 + .../parser/parselet/ReturnParselet.java | 15 + .../parser/parselet/StringParselet.java | 15 + .../parser/parselet/TernaryParselet.java | 27 ++ .../molang/parser/parselet/ThisParselet.java | 15 + .../parser/parselet/UnaryMinusParselet.java | 15 + .../parser/parselet/UnaryPlusParselet.java | 15 + .../phoshp/molang/parser/tokenizer/Token.java | 16 + .../parser/tokenizer/TokenIterator.java | 105 ++++ .../parser/tokenizer/TokenPosition.java | 14 + .../molang/parser/tokenizer/TokenType.java | 64 +++ .../java/com/phoshp/molang/ParseTest.java | 56 +++ src/test/resources/parse_test.txt | 21 + src/test/resources/parse_test2.txt | 1 + 173 files changed, 3513 insertions(+) create mode 100644 .gitignore create mode 100644 .gradle/6.3/executionHistory/executionHistory.bin create mode 100644 .gradle/6.3/executionHistory/executionHistory.lock create mode 100644 .gradle/6.3/fileChanges/last-build.bin create mode 100644 .gradle/6.3/fileContent/fileContent.lock create mode 100644 .gradle/6.3/fileHashes/fileHashes.bin create mode 100644 .gradle/6.3/fileHashes/fileHashes.lock create mode 100644 .gradle/6.3/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/6.3/gc.properties create mode 100644 .gradle/6.3/javaCompile/classAnalysis.bin create mode 100644 .gradle/6.3/javaCompile/jarAnalysis.bin create mode 100644 .gradle/6.3/javaCompile/javaCompile.lock create mode 100644 .gradle/6.3/javaCompile/taskHistory.bin create mode 100644 .gradle/6.5/executionHistory/executionHistory.bin create mode 100644 .gradle/6.5/executionHistory/executionHistory.lock create mode 100644 .gradle/6.5/fileChanges/last-build.bin create mode 100644 .gradle/6.5/fileHashes/fileHashes.bin create mode 100644 .gradle/6.5/fileHashes/fileHashes.lock create mode 100644 .gradle/6.5/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/checksums/checksums.lock create mode 100644 .gradle/checksums/md5-checksums.bin create mode 100644 .gradle/checksums/sha1-checksums.bin create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 build.gradle create mode 100644 build/classes/java/main/com/phoshp/molang/MoLang.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/Expression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/InfixParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/MoLangParser.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/Parselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/ArrayAccessExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/AssignExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/BinaryOpExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/BooleanExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/BooleanNotExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/BreakExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/ContinueExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/ForEachExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/FuncCallExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/LoopExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/NameExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/NumberExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/ReturnExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/StatementExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/StringExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/TernaryExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/ThisExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/UnaryMinusExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/UnaryPlusExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/ArrowExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/BooleanAndExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/BooleanOrExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/CoalesceExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/DivideExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/EqualExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/GreaterExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/GreaterOrEqualExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/MinusExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/NotEqualExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/PlusExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/PowExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/SmallerExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/SmallerOrEqualExpression.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/ArrayAccessParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/AssignParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/BooleanNotParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/BooleanParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/BracketScopeParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/BreakParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/ContinueParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/ForEachParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet$1.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/GroupParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/LoopParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/NameParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/NumberParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/ReturnParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/StringParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/TernaryParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/ThisParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/UnaryMinusParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/parselet/UnaryPlusParselet.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/tokenizer/Token.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/tokenizer/TokenIterator.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/tokenizer/TokenPosition.class create mode 100644 build/classes/java/main/com/phoshp/molang/parser/tokenizer/TokenType.class create mode 100644 build/classes/java/test/com/phoshp/molang/ParseTest.class create mode 100644 build/libs/MoLang-1.0-SNAPSHOT.jar create mode 100644 build/reports/tests/test/classes/com.phoshp.molang.ParseTest.html create mode 100644 build/reports/tests/test/css/base-style.css create mode 100644 build/reports/tests/test/css/style.css create mode 100644 build/reports/tests/test/index.html create mode 100644 build/reports/tests/test/js/report.js create mode 100644 build/reports/tests/test/packages/com.phoshp.molang.html create mode 100644 build/resources/test/parse_test.txt create mode 100644 build/resources/test/parse_test2.txt create mode 100644 build/test-results/test/TEST-com.phoshp.molang.ParseTest.xml create mode 100644 build/test-results/test/binary/output.bin create mode 100644 build/test-results/test/binary/output.bin.idx create mode 100644 build/test-results/test/binary/results.bin create mode 100644 build/tmp/jar/MANIFEST.MF create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/phoshp/molang/MoLang.java create mode 100644 src/main/java/com/phoshp/molang/parser/Expression.java create mode 100644 src/main/java/com/phoshp/molang/parser/InfixParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/MoLangParser.java create mode 100644 src/main/java/com/phoshp/molang/parser/Parselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/ArrayAccessExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/AssignExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/BinaryOpExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/BooleanExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/BooleanNotExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/BreakExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/ContinueExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/ForEachExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/FuncCallExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/LoopExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/NameExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/NumberExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/ReturnExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/StatementExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/StringExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/TernaryExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/ThisExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/UnaryMinusExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/UnaryPlusExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/ArrowExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/BooleanAndExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/BooleanOrExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/CoalesceExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/DivideExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/EqualExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/GreaterExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/GreaterOrEqualExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/MinusExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/NotEqualExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/PlusExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/PowExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/SmallerExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/expression/binaryop/SmallerOrEqualExpression.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/ArrayAccessParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/AssignParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/BooleanNotParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/BooleanParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/BracketScopeParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/BreakParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/ContinueParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/ForEachParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/GroupParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/LoopParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/NameParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/NumberParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/ReturnParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/StringParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/TernaryParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/ThisParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/UnaryMinusParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/parselet/UnaryPlusParselet.java create mode 100644 src/main/java/com/phoshp/molang/parser/tokenizer/Token.java create mode 100644 src/main/java/com/phoshp/molang/parser/tokenizer/TokenIterator.java create mode 100644 src/main/java/com/phoshp/molang/parser/tokenizer/TokenPosition.java create mode 100644 src/main/java/com/phoshp/molang/parser/tokenizer/TokenType.java create mode 100644 src/test/java/com/phoshp/molang/ParseTest.java create mode 100644 src/test/resources/parse_test.txt create mode 100644 src/test/resources/parse_test2.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc8a670 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/* \ No newline at end of file diff --git a/.gradle/6.3/executionHistory/executionHistory.bin b/.gradle/6.3/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..e7d1838f8dde536dd86291bfdb841ffd0e81ed3f GIT binary patch literal 164919 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 literal 0 HcmV?d00001 diff --git a/.gradle/6.3/fileChanges/last-build.bin b/.gradle/6.3/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/6.3/fileContent/fileContent.lock b/.gradle/6.3/fileContent/fileContent.lock new file mode 100644 index 0000000000000000000000000000000000000000..699a6e92708b18c41a5e72cc5a0bb72928f817dd GIT binary patch literal 17 TcmZSnx$x|?sr6RV8K3|FKpO<+ literal 0 HcmV?d00001 diff --git a/.gradle/6.3/fileHashes/fileHashes.bin b/.gradle/6.3/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..e41fe0a9e7c4aabc5e18770825621575dab6fa89 GIT binary patch literal 25647 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 F{12;Mt&;!% literal 0 HcmV?d00001 diff --git a/.gradle/6.3/fileHashes/fileHashes.lock b/.gradle/6.3/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..e6d5a11556f1f752da1fc7e5c1f98880eb89e9c9 GIT binary patch literal 17 VcmZQ}&3=01>G5wH8Nh(G6aYl<1}Xpm literal 0 HcmV?d00001 diff --git a/.gradle/6.3/fileHashes/resourceHashesCache.bin b/.gradle/6.3/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..e6d61792ddc5518d86625936d77e9231b94c1753 GIT binary patch literal 21319 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 DY(xFe literal 0 HcmV?d00001 diff --git a/.gradle/6.3/gc.properties b/.gradle/6.3/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/6.3/javaCompile/classAnalysis.bin b/.gradle/6.3/javaCompile/classAnalysis.bin new file mode 100644 index 0000000000000000000000000000000000000000..29b27aa89919d0ddca243916855c60c7ea308697 GIT binary patch literal 718210 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 literal 0 HcmV?d00001 diff --git a/.gradle/6.3/javaCompile/javaCompile.lock b/.gradle/6.3/javaCompile/javaCompile.lock new file mode 100644 index 0000000000000000000000000000000000000000..0840de41025d7a6a1fc5fb273510cb5158cff48a GIT binary patch literal 17 VcmZQhHfS;3}C<^4FEFq1aJTV literal 0 HcmV?d00001 diff --git a/.gradle/6.3/javaCompile/taskHistory.bin b/.gradle/6.3/javaCompile/taskHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..52ea3fd2936dec8f81227bee8b20a3068bc4829b GIT binary patch literal 23069 zcmeI4O^6&t6vro%Y+S{U)kDZ3Ifx2scAEaGuC5hKqPuJovKondky2A%-I;Y}dYGOy zc-lpb35(w(8{WmaVtUPE@Mn7~w6DsYSnR%1dsp{Kmter z2_OL^fCP{L5cc+W*4~l!{7mglS)7Luw;FpWX7jrlc?-X!D0!RP}AOR$R1dsp{Kmter z2_OL^fCP{L5?wz`Sh>xeHk#bXQn5X!5ZN#odGGSCRiR-7bp#aJrQ#){LV#`B$Pg;v0s6WY}C zB-K$!d^d0%(CZr4F(D;{nouz&LnU(?xMQ%%wY}QBAb0eQPmTP#>fx7alUByF$M|&) z&FQ}@#Vs&)`bHsb&Qh0SsAcF#-3&^28)mkr5*7au>g@%_j4&K`N|(gR=39K5lY z`@6^b`U+pU(1ovLzC1BmD>q?ZFE>qt=e1J1Ruc6xCzc0ZFQ{SE2<6hy_ZU%(;GwUj%#@PJBcwAPV;sN@k7m_Rd0LQNG!fIv&aq@z7{l~y1;!R_bje|Y4#jf0zR z=;xb8PW^ItAvxcrdVm^FiiR$W8t*9QupP^`Z0?zexHMokF=2=8or6TSb1PwC=FXqJ10Z%tzZ#-*RT`nf~yV&u*K0J^LTL6%tST zc0xQ|eHha7Sz1N_{D*kD=9?~iO4PGC+o~jST&~4g4t8e12O7L1&+OUG~sS1RvT&9Wb8(&cow#9;Fr`9jF>=}J@Zr#oPohR=5cK_g1 zuSf7+p8ZyicdmX7ymRd_NJq2OrFULswR3Hk&E>0|v&q}R#UK0oFD=}C`uC~bBk1Y> qm8bWzC-r(1!gXY8S&8e&?1>!Lk?s zT1^f1;KmB3`DPT?4s@P!xgK!yQBF3LGf-rKWVk$3IPZ}00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX?}zaZcj zgc`{_UAgmqW`bp>e8$w&7>P;A@hnM7@kt-2s%Fhqyd-SuY}7rw9#!K8 zU(8*Z7Rwl#o~lNzJqiC(@b2z{;RNwXfpBI**fZ?>beh&aD{IZ6UDMAEo9pZuxV^hX zgeC1S5{8lHL63)1HmNC;7k7d++$6HknN5OY zK1K{BVSVc2=ILNGVy5O%I>G34v`3|6i0NZgF?h6J?<1+vsFft^HpkhWN8XV>=fJ5a zKUY6_uihMNt29HU{Ywg7A0zCHmZaiqvFy1=3;U+96j$+kW~Q<`eV^t2rrE}gD~{uh z_hvrasZ!!9r74--tu)ikcZ8u)o@aQwe}V_V6SRQJaG#4kEwW#3rGX3+sehZVnDo zL^eB$ zS%w?rtjSI@a6Q~*cDJ2*`}g6c&7M{v3g$j1l7s3GWp8qC{GEtA4!QPXdd literal 0 HcmV?d00001 diff --git a/.gradle/6.5/fileHashes/fileHashes.lock b/.gradle/6.5/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..17fd0aa1a69544a0701deed82966fd587e55c58d GIT binary patch literal 17 UcmZSnc%w;r;&fGW1_)pS05vBA^Z)<= literal 0 HcmV?d00001 diff --git a/.gradle/6.5/gc.properties b/.gradle/6.5/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..c442cd51b5721d52202b2d81cefee9113e4f7203 GIT binary patch literal 17 UcmZP;mP_f#=d;#e00YKX02&4Y>;M1& literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..01076bb --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Tue Nov 24 11:43:07 TRT 2020 +gradle.version=6.3 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..e2c0b43a843e6a216fa031baab2baee0b6781ce7 GIT binary patch literal 19037 zcmeI%Ye-XZ7{~GB1-xV?x_Mbw-z3fvriK~}69wG@lca$!B9bgBNl~0eMGbPPy&85y zCo42zhK7g|Xc>5+l7c2ADJs*_35r-+Lc}`bJWnErAfh1TH#ld1zUMjro%4CSOhJeY zannaw|0vg&SU~^+5P$##AOHafKmY;|fB*y_009U<00Izz00bbgSp<%WFA^xdOr*x! zv)EQ42=PJUV%I(8)w$6Z(RI>g-AVrc!1`t;xcN|R4)xdEn;nbBgHF>p^&alMS?1d< zrmcIZ`*D9--30<$o;+ThM{-A{-M z#DwCqoA%Li_x-HyThWDuQlH`;;4ofXYqUpDkK?{YH67Y!FDj?~`?yDh9Z2qs?eC!Z zyWC?|UG0^_`^-|;r*hZSEftI_lQL=E&OOQ8Wg0mDWr6mu;I36nX5@?%o}+zYxa;z} zEgwgxE>S{;cj0Rx z^gJ`%OC~=ICGUJRN4<@E>9GIfXDeTKQ-Axjj}568EDhXixEoWS^lwkuTPe-!mE8GT z5WJnzHJl*;0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2y8xqMDdjZ#KX&Tcuv6^iWvT@^6#GT&vusI^|y*#UcR$@MqYmB Iu3yaj0AHz`%K!iX literal 0 HcmV?d00001 diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..7c28b800627a825729e9ad00546b288da17607d1 GIT binary patch literal 17 UcmZSnq?0qX*f@700|W#E05G%!8UO$Q literal 0 HcmV?d00001 diff --git a/.gradle/checksums/md5-checksums.bin b/.gradle/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..7efdad663bcbcb6613a3232aefe889dea0c64e7f GIT binary patch literal 19247 zcmeI)e=L+?00;2*{M_j_6pbvot+uWt5?N9m=hqP##xZk-RcnG}1jZxf&0h-rvxlG&===83lfaZf-ek3(nFMM&ipXBltF6Z_PBgiDj@D2e8KmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00I#BHvwn1CShONhXKT9nb$XGN5%)XBy3NK+B7Bo%>HsceVuo(3z^&S8M}A*v*9GD zb1HAk(hJWTk#zVd;>AE=TSSU6_uukOX?rh9_CW=o-IK8nAQj zh2~SR=Nb@}TGO6~}vR>x0f+-}^zJEix~tgaE#eL+`Xd>8qRZ}lpH zyJvt+jPiVJb9B=!(&(aVhz|1`-eYCmM}IoIQ+OXHHAutZ&H?}2&-Pa$^ z%Uv}{FD}#TuqKVpF<{9 literal 0 HcmV?d00001 diff --git a/.gradle/checksums/sha1-checksums.bin b/.gradle/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..9f8a625ec03c7c2e40703ae13adb29230085e417 GIT binary patch literal 21089 zcmeI3do+}JAHbh6h*@`9(=Qrn=ne&K7l+8td8uIO7fExua@6Z2uL7fYaAQesZ+laypHI<9%0k^4!{MJ^5 zL?xM)UrBxda&9QMVtkV347fuk|BX z>l6cSdk6B4UDjSZDtaOSXR1QpO;hp+nYf}!E)Vf+cOi#d zZUFAE8S)QhA_G)k>+^s!n2^sTuzgB{^V$Jt9)g_0P4ZmpRn-Z&-B!qjCbDS^R-qW+ z-!Fq)Dq;{j+`wf5?#TYg)3tirtap(8?Fu26X>{5D^woCJg!SeKe$gRX} zPYY#fRs(MH`XkqAAmeyq=v&lQiU^rG~CF_uiM}`r9E7ms+0HGITD7GOSDs2cW?T0CFcoAk4L9E-#J{+ z#?Lh-EH7|=uc}e5pw&jdIO!<0U@Df{qV8E9AT+vGZX2+EVDn~4WtIzCCWHG{-FuOF z=s?goBa(IMn7@D5AYrK)@9*JRm^fX~x*4tDOBGvr+|EbcBx?A6v(vDKIIs?qXMxYd z*TTPDx(+O(i!5o)tgCTP%=InBD+4#-=R{K?hI4-w1+#=xKik6JVItY^Q`Q!j-%S3f zf6d+Fu_~K=&MsK{KN%rlR;oUjC7LccYYvN;WihwaTP}H0;#?{t_>zc_O5ONFn~XE~ zx`~E|)PW`LDLAWR*~C!#%=P4vO{||UWP146-Ywvg)@{-v&LrpCH#la#d&CwN?Yk4v zA9t>lBU#VBF$AomlRS$uuwBs7iLLZ%T)QyeXM4x&eZ8ToGW#(DV5P)?S>420?tHVN zcZy9FtfMx*U-M1HFuRkjI9C3Gu!QsU5`ZOE_4$^Xaq7*vtt56))BKzAZZ7`KB?am# zK{cWJGQ3&&4aDJu-_(-uJHB@~m!)QW4BsD#+o!D4&*Dn8_M2?FoMvv8wVq>9_KVJX zP$Rv7CsD5V;*Wf@f-a79P1U9QY!A(2wQ+kwtMXJ$fR&LAECUTeYu&h3ut@(7M!f6H z8cyxqoz&Ue-nfPD^S_4jEKDrwvn_m&%KUC_>t*}9@MkhnHfqIQ%5P)kttG}jbb(og zYk{TGDmZHnil3qPs3{*t zzX?tnIxHuff6}e3)oL18xx>I>KM}P0g0?CiY}g$?oIQTEmdS4MS$M=8Soy@aCx!{x ztibR2KCg9y$)eSd%iX&)rPMR)-RP>@TJbA;hjV+b-ArC%5O>b>%aDS zAHHgErTB7Kqan|-oPI=%!Z2~-dy#KeQtQ&)fB#)l&5f+tY#1!n!!UaXzC|r(_VOf5 zcB7!R@zUu7ztgmW#Jvv6`kAua7Sp}8I!SE+IbRHa@?g}pAOHGKqFkJj+41p{XVtwr}LZe6+3Ucu=c+Y_Rz^Fa71 U7yq1ySsmc76yY5F?+?uIzb)kl5&!@I literal 0 HcmV?d00001 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..6f98cb3 --- /dev/null +++ b/build.gradle @@ -0,0 +1,36 @@ +plugins { + id 'java' +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +group 'com.phoshp' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'com.google.code.gson:gson:2.8.6' + compileOnly 'org.projectlombok:lombok:1.18.16' + annotationProcessor 'org.projectlombok:lombok:1.18.16' + + testCompileOnly 'org.projectlombok:lombok:1.18.16' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.16' + + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1' + + compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.0' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.0' +} + +test { + useJUnitPlatform() + + maxHeapSize = '1G' +} diff --git a/build/classes/java/main/com/phoshp/molang/MoLang.class b/build/classes/java/main/com/phoshp/molang/MoLang.class new file mode 100644 index 0000000000000000000000000000000000000000..05995fa464dd003343b07fd6927e2de746fb8b8f GIT binary patch literal 279 zcmZ{ey>7xl5QJxqf50&TQ6V}ypx_!h5KSa10|kiwY)<%)?L)@oy;4O=kq5{_MXU`i zyVBgvr=8XQ{r~&|n4#;VfwqTt4;_NL(77&`gvMxmAlM(~s0f`<=W27yB30~Vlrrgs zCYI?z7P|6JXqSn;5(Z&xGI2@FHMxk)q%uE=wF&u|6a1aI6|q|BYRlULPtWpG2C(4} z`meHtZZ#(Ab=&By;u1qxe0){J&3RUrov1zFOuj*13@mu8E@N<@$r{vu2QB#Q_!L$P F!5xigI$Hn$ literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/Expression.class b/build/classes/java/main/com/phoshp/molang/parser/Expression.class new file mode 100644 index 0000000000000000000000000000000000000000..dc60650aaa5a33dcd321c7d632cee216007f3298 GIT binary patch literal 126 zcmX^0Z`VEs1_l!bc6J6dTa{eq1A;*0|Q-29xxymbA7#G>NVB7KBXMg{?pVtufze^ORzatY92Mg}IJO(4L? Kzzigr7+3&PE+MM` literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/InfixParselet.class b/build/classes/java/main/com/phoshp/molang/parser/InfixParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..84382c412e95a1892420f3015d7b33a55d6b1d2f GIT binary patch literal 308 zcmX^0Z`VEs1_l!bPId-%b_Nbc2G)YaqT*CWhPfI($@#hZ1sVCp83p>e`8kPs>H1)~ zB7NU{A0RIPq_D^ux3ZG_?9{x>s?;L=5D*KGO4o{lqSWHz%=|oSP2A=osbXZ{3eGPr zN=|jl%mF%9$TKf3vjXg(oYWG%ti-ZJMg}#U?nhD0$RGexuMhU1e^ORzatRwF10w?y YFkBcI7+Dw@m>F0=ECyB}$;7}007a)_h5!Hn literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/MoLangParser.class b/build/classes/java/main/com/phoshp/molang/parser/MoLangParser.class new file mode 100644 index 0000000000000000000000000000000000000000..526925ff8f9f3eb129ba6216d9871eb2af3134e5 GIT binary patch literal 8743 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 J#v=UT{{q)*X3GEo literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/Parselet.class b/build/classes/java/main/com/phoshp/molang/parser/Parselet.class new file mode 100644 index 0000000000000000000000000000000000000000..948b0210126bbf797755f739bb756152a86cc7e4 GIT binary patch literal 261 zcmZ{fO$x#=5QX2={-_{$1$VkJ8+Tpns-mD5h$Yz6wh2j<;?Z1q01qW51()3nZCKo$dIgeTYrV{PCi%<*z literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/ArrayAccessExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/ArrayAccessExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..bee26d1bb905db0a930bc2e1f982e1862db5f89b GIT binary patch literal 1862 zcma)6U2hvj6g{)vFFPCJn53=S6aq=9KjNA~N~oO#(ln(hc0moQ1P>J(XBBU8yk@;d z<*)Dq$V(nTqOJrIf|pj}H}KA{pykZ&I%#4@RI+Ez+&TBoz2{#0ujjx14qy?r6eh8h zgo+R4a@{~B#l0%c%Mz_fv})j^6p~mn@v+?3_;1dDO_I>+%flIZ9 zw^!~oy>7Ep-t$^^d$-)N{jTGeHy(9-r`vVCc9nd$z2iI*(3jn|8>|Y{bFbw2N~HXK z0d?KmaRer6Zri!r+uL^hFYN6WEt#6vuv_ymOd+c}Ow(P7vM+T+ZcB4>jbp8EfHu+p}9tV>(xRXn$vyL-jt}e&{rUYW^z$;mP!euBfIL zG#y_cCCiwPTQL?I2dC&NRz1FoPvcvG-T0<%cS12Z2yCi=*|fXONW?@gzsW~FzqeW6 zU>3wWJK1Xm1cUhcd>qXTysf}@+q(i&RN*Mw$jaWQw!EI-aBjJ>9p^`?c}2QeID^|3 zUdNP$X-o-RKXtbLuR9hl;tdP4c+0|@5-p%4aQ0+!H+pVsM+!MJGOJvu?23g=+>y(t zRB2&0tb2vJg2p*h*JJ#_ z*bFsbz{geo$S1*xg2FFV=Kn%Q3e8=o{S3}>J;zg>j0E?I!V`!>@iCOb!ebfv#w=u`Ora4se)Jwz;y#R0ALiH6Zd6oxkyYaxQx?vvnb8F;Mp5H}5?I0&$kuAOhIfe+ zq_|%V3!39xy%!cFlfMJ?1q~{b7lJuMh!?E-=&VS?G_(O>z)_EzNaK6_{l%5uf_p`}m!!2UtrY`bBoN1teUtb%{2qJ4SXeFKDRrrz1egG zE>-K^PO07Sx{Y>e$7|ZH?NZzBbe&FV?T2>9>2_VORS{4fo&@wIx8?dP0=4WrCB9Qo z?g8;vy)Dw2sJboZUT3kOwOjW(Q-Fy%cj-0CBaJvH6N5f0HA^Fk`*09|=Qq9=5 z;}0MOE@yM2fsW)E%##iZ;e6k-o8*wrR-f9>?NXrJH=9qLx?jmX5)ht1>iCs_=J^eW z2;;Jbxr0ue3jBv0@gP7JB9I6#!^8N7Z`YsI>~^3AXMufXQyX@-5vmx==GOVpxA)g; zYh*%Orx?AaFAzWUfHoK6nZCE-cih&tz!ar8C@1u?`-u&&*Qqi&8yy|wl?XF9)jQd3XB}BgP0!n`V1!BL@ zr63c9%cOI(XTngN$23n&3ZO+`NpOXr>_h}z;x6yB{I5`crg0cB9spWlKm;gc^G-;P z4JRi~OlJF|YO{SjJhuka_-TD}kM-aMDGTKpSh8TAz=cVQJX zY9D$K#t5UVF~lhA8BNCMuaMfsct*?UgCKQ}FT{>%bSHdyU!%wP5VPc!=1k2|H-+49 z;Szl@>bZiCXz`zz+%MD8u*%FVEgd=HUw~0Tef_5Lt;qeKFIh?)h{_I^NqJr!H1GvR|;s5{u literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/BinaryOpExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/BinaryOpExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..f81c52464fb99146b2c7e0f8e4667fb0a1b193b7 GIT binary patch literal 822 zcma)4%SyvQ6g`usjn-;wt=9Jg5!)(eBO)j+6kSCHE8VAcOh(cqOrq#tDJX&qKfsR? z@1$aVRovWrb2;bCIWu{AeR>A4j=6s57*}N?i!>$;Oc|IqFvFmG{5)n@vRXmg4Ba4d zL$e)tw(ppsEh8??{p(QjC=!9c#gLZ5aS7k&@VG7<;W3mdRqMjOvdx54kEQS(LK=jy z676LI{7+rq3(h!0-V#1Px@ai;#hRxpM{KLArD|}nt z9EV@hs1zriK$&gfi+G3Ou+m%a6Zv1DYJ(wL4=!bk9|)DB{L{voy1N_<^ySd6N(r+J z8$B=V&rA%3?o%8$FL;aIYO$wQHxEOqQf=r9^oyjykb#Dx@l6k9G%@5b zNOg#2lRBfGuHA#((x4$vHIpo}DA1hi05D8aiahcwS^G{N_?2A3C`qW359z2B^?dCS nsoKf|SZ(zI+8wPvdoU82`405m1Cf$&%6LABr;+Gb!Ysc5n|Qu~ literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/BooleanExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/BooleanExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..2b8a94a347617f53c0f9a0af1a53cbf5030eb557 GIT binary patch literal 1226 zcmbVL&rj4q6#izr-7d9CS^1^AC<^NS04fTiS>S+ygk%vThD1&dOGAsLt!r_k`4+}Y%TE!L?s8(DV9FxO~$`-X3Mq2(L)U%~GpdUO<_RiYA!^Et zEHhv@yAko`vo-F=6iF9`yv0K+>5HnYQtrb?t82>yMs|+qwVa5uB5xxKYt8zI$ z&;<>5Feiq))LKQuHC$)VPjM0%8OHv~>-20GNGiGyIqv(WyTdTqc_67I-72LdNvsmx zr!EoygfUH*RRf(CeFdQwU1*tX9euF}SVV?iK&>8uRg0gH`9P}-&eNEq95MFOIGAK% zfGqK-F&YUVWK6LPn#B&e`VpB!GCE;;Vi-Y2P)J}HF5qIiIiPHbV&k>yTgchN+IL8= zAxnp~Z;;liZDc3tdm}tqfh~1W98LD0P#i}QB|;ydwnyRyF3~>vf0g`C^eMPZu~A$} z>%UCv7xnslcA=!#Em89o^7{Ha$U1+zQ2JNdVp>)rHLhZeKxHa9PF4n@>3o>o=6jZX?IP;$3o$4lsl&D)usW9A# Hv&z2#V3+UY literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/BooleanNotExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/BooleanNotExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..d744bfd5d448ff2383cedef48d901cff5980e076 GIT binary patch literal 1522 zcma)*TTc^F6ouEB&U8u{v{o)wtDvCvLK!c3fdVQ96B9rq#zdbS%7hM|y7!vztbOLs*4OU<#&IW(BQU!V!6hA+;~cNZ zovSj8>$nz&4l{=9a=anK%@`)+IH{wkV@e=yzpmBoM#FKd0_W#T?z&kkyNzUc8(naqDxWSy{r(>&U$+Jo?7Oa|oXf}{d z5r~zoMmaDmlF8nu=EFz#7v}g-&ZF#Av*HPKcPPa?cgd?e)m4FBp0W)V>{2zpg*GwmU08LwOaWR;^}NR|E>X+Z$T7-@Oo)CU)fi zyAJ!@{+Ex-d>@a1mw~^e^px+c=Fg8a_Hs1?g&!cE`vQ^6e}?jrD+PUwQRc|l&)6Si zVE`w%V!p3NN2JrCmdR08Xt_^NK5(*IrpuQxf`m{;$PR_Y@0hKzW+I<^4^7?7|3u_1 zw8&=u2O!##o1IKxNwVFZIb zi$eNA3~?{Qn8I1kRGgz$5}F>{!YLiYI!5@7$7w`Xd(K1I(;x!E+`GLB6Q&*G8EQ`ljTgI!F|a2SQ2I!$~Kc#!U#bY2(eA#_F55= wj(0PpyGIGxi}W|>Pro3R>}s*cG_Zy4q``R$J$qXebUJ8JdZ$GNswf!y3rLbk(EtDd literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/BreakExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/BreakExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..1327a3cf5a9b7ea195925fa4aced456878ac40be GIT binary patch literal 769 zcmbV}%Wl(95QhJ;Pht~V+J>~;VZkP81r`D%q*g3IAR&c|6x0Q~6LVC%b$pENAfAN> zV3h@|kXRtG<)IM2FDfVz8#Z(E%s2n|{QULpJAiw*(SyQe4_AC#^>EF@bwT$aPUG^S zz#Wbb1?sVVYXlqPI5jWkv#H5n>uJJDe{4gY9O^u-^0uhTC@uu|$Dy4CS!9bS3uZRa z=~0mByfArSK4iHmirA*Xqul6|C#U&7cbj)}oe;1+93SiVI;baKPLEAk?vLIG#8!(} zJ_*(*r4CP?>#P;xN4kg_>Ad3^(cC&uN+Ou}rJa;{oE`}V!_i;7rb;EfiJj-6c^X%z z4wjVOt^};13r}$OKQ0w)EfI$!!RGQ=f}8(@|M_jW1Bb6D=6X+k9#1w}D z?r3}>Adl=@EwC~%iGESeXF7YWW-%+ni49eJqB2wEZBZ7H$p!W%p`8b5Wb-Hu<~CNz zX^^Tc*IA%HrkT!jW0T;>CWT2#eSBHk=X(9VR52MFqsf{2pn`h%fUwo> z&L@H8X`#Y*&sExL@gtQ-je4H)jA$+{7Pc&TZ?RYqXEjBB*j@GEvZ^uwL)bM)k5=R2HF=(!8IVAbuAHk1-U=v#{Mkq}|MN4figxE^0hD%!z6blrgt)tU%JcKhOHRQyTQ1!Y0 z!XF?nJm`$1GdknwOP%pQ+4}9XPe>r(_~1-t?X~y%*6myCmi&9&X;zN1;$i#9S3EZ;qu{`fev0`D>!kUG9^0sc`6B8Q())U9C zI9pX$;L1wL+bz_~UZY$u?0QwFwo|A(e#7+(i{I9Lx6!D0wP^v}@qOnz0d33M=3&fK zYL(`kfS>+P0scQw<{^t%@U~fd|4OCiuI=q^x&D3CO>)I6In{?@cj2SfELR!=H_xuY zJ?gZubzpk{d&)-vYw&z%46q=QwS)( zxAoX9HK#M53kXjj*=ynmyk^<;1^Q$^#x$QOZuEtjLb0Gs~=DePelbkwsEBxE*`dra-JKw=o`O(#KU`tLbev z{Yq^|V35ppT2`-It@x(5=a<~2irmKwJp-7OE;cS<)5Zl1+qfu23c~_7&fML9o2ZR9 z@TQF`c+19Rsf|nV4yFW#PnI{oSE+7G(nosgO1CF4YvVp1NWs;#CdL8+W(CZNF-ZY6 zk+Ct28G(ULd^K@_%V+k`*(Cw8&)|krue-HvfqeJwghcjo8x~KBkKx<9)-#JX9@qG% zG6=3HqDV^8`Hz&8yay+#=V{V@2_uxFygfn$8qdM(Gl*>N5RvS}A)?v*A+(?P9>J@W z2GLT!MwwN3ypA#6=o#dZ_Q4=iB+z88D7`qbFjIl2MCsX|5&4lycj#CU+E#!tG$}sS zIeOALeyTH<^vVtpziH5n&Z|Lad^Z(j~@tj^sZ2QhLhh0>z3ZL9wEhG9}0gL1xNo zgR}#d5$&1BBURqfJf7kz(ky-mHDoxW2&Y}))Y9}FLkT%*8fLMC32HhPa2t7Q2DUh@ zNopp_+>Zh^3vV-L8VS>Sfe{neOkC&B5`W{OQe)jJv+`>UiJN3*gWeAYrf0O-fT+=d z=`v}u26Fo_^DV@`l^=|QvKz<9|Ajm-+d9wEd_!aMhfd>De>2DCBS z@uv`Gbiq2vldlA`O#ag-?(hXmmEX$LuSk6M40f`wg>#a^7W$I|O6OkmC(kQACiNus X7G62I;OeVYpVrjTr!~vy5zPGq#ks#6 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/FuncCallExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/FuncCallExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..efa58f3bb02749bf422aa72950e778d625dc429c GIT binary patch literal 1985 zcma)7ZF3V<7(I8h$)?-Igiu}zsAvn#D=S(NNQ;)*LLdn*Eg7HzAB?nb$o^;dAug0WeuO}n8f8IR^+}am+MK~kPjtQN^0%~qdS-&$rM#_f$K zcEc~{z7!CyyyVCufw=28ZBJlAUUoJVRu6K~;n13IHNLJ{onR_75?vsWY+BuBIL%l# zS0T=wdzIP>U&J^;?Rzbs$p|CqyKBDZw6_GNIEW#QFiVf&&wVI zCs8+W495+ez_h@{eGT|VWemKB_YIuIIRi78)o|Ou9o#iw;sXQsuto}dIbQ2ItxY+o z6Qks^a%_tR)^T4hG@4dCBTdiTLwv!ZNpyIJ{ty0*8)#=#nO@Y#GYemA1Y8lOm zlD<~|zZG}U3n7N}0ipGQQRc=H8tE_N0>93tKfJ(XBBU8yvAN5 z_$&MX@{$LTs4Ibl;H60X2HyDig=s7& zq2fKcyl9e?+G0e!`5d%>DOJ@-<9F9pg! zApeHH>k3TOytaFe%z zIENV<8O#XW7&}N~dtu`;Ub8WWH*CBvtwodsE}Tqfz3;VlrEZzgJaVCet2VZ9S1z9j z7>jeV!c_{8xA6{^1X9OzQI7=X$EJGRasdj;!PK2j$8GNllwRz1tkY@f;#{fV2!1#n zr=%X@ah;#=G&nd=_)l5+)u*Mh+;#fT;{w-6l7z# z40@IJTm;1>%<{ybkXnS6Bv(kvCdAZb?($A6`~u}C8ZQziLqa4xooH zB8-Ygh*8nAn#AZ&kv_m=R?F%`kb1}$5~nn}6TN(-(L=n6dFGYjOf671g}L9t75Wm? za}96N;_oeUze-EP1|xH{bmYl@8Kz-A!zBX+14aIs;y+xB%%qf;Lmn6X52-bVR8rLy zbu}zLn^PH<2VL>wayHKCgp)z?Pm@|ZU&Z>{kigaY44FN-pI_e^f@A3PKE4|M*u0BqV@F42eEjM#GBRI=9aFXZY-^ ziM;TjiH<}Qqc58HM}gnlHXsZiOxt_!xjpCH&-tGF`{2tr0MnR{p&R)qLYUA|h;hCt zcP8a9rQ=o%I`R=r%lUQ$cjSCm$2}c00&2~yS^|lc9rKl0sF=0w!n)hAYuiPE@SI(< z-35VUy7PBtgTW7+Ee7|j*fnddRo%22Pt47Vm(D4fl?}6DOFP(9-Ll;jm|iJ4)k3}O zG|Tlu)$xw3n~kQ`C|IxS4XfF-omydySc^v{Vf1awm74;6=}adMX|0znv%&*T&_3MU zu}W?+^GrZEC+iG;322U6wi*Ia2{`5p67%)~qkG*oOD|TpHBrg{RAve_*A3WU;` zW#)PGczJb^2XP%{A+3tb%^*j_b$nq3V(U(;QL>h7Db@Ltl}^Y$80f{UfgZ#Krv6_o z0~ax1;1UK6jNzI<|LNx5Z`qYCS#saW)6=r}c>_hvv5bs?ECvMP$Kk$a0;B(=I&PW( zW#KIeoAtU?+Y-p1b&Wb&8L$;G$(!5_fph#4QVia9jq6@o)Q#2x6h1&KyAP4geTMRp zmV!QxVfx51$?<~k#krpr{k?3gPzn{~DsYw&TJ{r^4_y46ChDaze1{;7kOBw6@93>D zW+sXF8ZmHtIY{Rh+6(UpJbT+y{pdw`R2jW-3)@M{m@eR;{7$ICaC`(i=vzWj1y5 zRikOPT9#w$KHU9-gOWge%XIx?fp9J_`Is--MxB_MTxHvMY3LrX!0PNZOHH zdaeW%$F0e(`c_?|`h3}FcpRybK&)o8YJOv^vc%X&D@)7w2}VCke(k!;DA!qao0h#L zkj~}1O8BRwn^<+)&8k_pq#&82{Y*+y8dA8eA&KJx)BmH2hLbp@qNHIKa~kGxM_}l% zU7yQB+p2HMW`~cG$l2b|n0XiXq*-8>c@1O82_z43d_@ID|H<)iP~L3#HU=&qy g_Yh0PJJg*eIyjcn=y%Zf{;zd>*|G<+<-MrFZ|SA~%>V!Z literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/ReturnExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/ReturnExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..dc759cb2ec3b9e196ed5d32dafc5de16a504f0c7 GIT binary patch literal 1506 zcma)5-%ry}7(KUZ*D(st=|p6T3hI71D~c!%@K-c30X1Sw^vNwq|>p7V@ zFT4k134v3E;_gs!p`6Wr-mw~dcCIl0)Oul= zfeLq*p4v6PT6`=ZT*$b-cCHL`|pFk$~XIpAu(YI>P7OYknZAdBKUGzPtxgxNiQ^v%?EK$>oZpW+Hw;U;V zZl_vjWQTz)W({PpS7372OAyc0qq%`$95OJ1ynz!qDKNB?$n}oXSeE+acQPo%xa2U0 zD>7W=&_x4foTh#;R%nF4*sdgFHw7pnuU^t>we04yKxM0?kvzSMMMNpww)($Uphw}q z^_bxMHwaz;{<2a_zN1>O-^aM0r#UG60O`_ah*J3zln*>9$T22aBjW+a17Q`0aF8d~ z2WV78svKdNTxEw=`UvGcH(O!)0vIDKh+u?tCu)AfYK=Y9<RR~+60e~p*2>?J zSSWR&-Z{;1S*`p+|FHTKd*8vR469veL7BS7=0p$g$q;mt_cRXU2p^flI7T^(LiVFL z%3OkR7{|C%ahzCLXnJZLBRa-(jPsk4)A1%ngkP~&W!-3|I-|}81oN3{o%B+f@;m62 zE|O1X^Z%w*3R@#u394`k1p;fNQ{+yez&VrxT9V8dlnoZEBqId5K!^=8j?apa?07dL scDD#2y~uxs{^&DO*}g74rhr}aXASPV7}#l1=yYgNe$%1~Q52l{154yW{Qv*} literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/StatementExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/StatementExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..67bf1dbca85c08d63d6c76452a5e4305469cc1a9 GIT binary patch literal 1493 zcma)6ZBNrs6n^fyt)mp2bG)c1D9YLms3?j!Kmjq53^hPV)GwCph84H9cAe3`;t%i> zA2d-gni&1+Z!*Sn+h&_E3|V^bxu@slInQ&uUw^)S2QZEM3VM<2f`oAy6AJB<3JhEm z%an}k3S{IGxFPmw;k=o^EpeEUaa+bLLpOipxV&Ds>{^{+?0KPRR}H6Z*UOGkwJTiAY!?P;JqU)M(Ni(Iyxw8@qD6Z(?4*3o)A*w18A2vnm@02QZi<^$a zYbAz>_S+Hab5ydBAX3h6u-Vi%)3HGt+^{63=-ciEeLVD}grxNS$9($?t!X+fAVNPt z$sT}ZbDt6UNT&$;XpK{hSo>-1527%DK{`>qUybAtN{6)!+C@ez`w5W`WVDy*^2?|} zKv;(1Jch#L21QGhlgVY@BNpAu{e<)mF=;RN1JYV{AJK7oz98m1qk9x89YHw~lxU*N z-~ujEgFc#mn2<*>LV5I$CntU*E#nfsyNuBg!g>fHoy^Zg=ZBK{vS|AS@fY($qF?(s z0V_ejbl6WKey`vvRf`ehV`N3hrpp@EU-i$x@Hfa$50FT8?Gx{Qi*B+~DlPlyIm}$p ODqwE7$(-&3%KioLrd9a> literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/StringExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/StringExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..f6967bc4f52fe0894ab2b3d913251f207c36e5ae GIT binary patch literal 1344 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 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/BooleanAndExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/BooleanAndExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..b00196da11e9f521ca8f0af7fd3f1072aba1afba GIT binary patch literal 669 zcma)(%TB^T6o&udR;(zBsBxzY33%(qxWSkJ(ZrgfQu^m%7&9oSOD_xnm@Bw@% zw&nCW{$1@svntGCFD_H$kb{Kt(i-mcOZt7c^K_wJd?}7AWcn>*x*W&>nV<5HC0u<06QkFuK)l5 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/BooleanOrExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/BooleanOrExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..88224c31941a5c8a726f2e7c04e2ef85565d5318 GIT binary patch literal 666 zcma)(%SyvQ6o&svFR8Iwt@X0hh0uD-M%+|HDhfihi%R#?Iwm7&CQMRM=tJpBaNz^^ zP~w@icmWH|;+#2W{`t-&AD?gU01mP4Adi(2YBpAFtT7aiWhB!RhO4^QR|7W=R1(DQ zK!rT=-I(h{X!rav)*?xyikdTt8eN9`nYtAW6;DRudN}9_eZzYpWvZU)^RUacH1Q;v zPXn1Sw5H?5cMon)MqEFs*lj5l3LdrfuLh}dDDF~*?dhyP@`9FrK>Cs|(vI|H$WW^{ zynFt@-E0Y+RLjV3GB_PI)O~Rw%@`a16hAPJ$|#`7V2wr$r&Cut<2VdQvmjd8M%wYu zVAw*Aezo~5Fw+uQo1#m~=g8YTyL+!-FPWf3)*&G?T>d;lNH zc%~39F(hhKV~= z5sw2m;W`!CJ$p>FNK>ie_DrHypP|@Qw}PSS$yi*Ch6AB*_#mQ8%~L*)`dmvBPm;wf zlqti>biDZP!5zq$>nD}CUBx4j`r=oAR5%iM8N=3e)E{|C%OE6uIS^S-1~Ou(H(TC4 zf8cJugI=a(9JCpno*HRioJ%uB+_5~Y?tG@sM literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/DivideExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/DivideExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..fb7af37413bdcc14132e354c95e4d1365c33e7d5 GIT binary patch literal 656 zcma)3$xZ@65Pi)yh$xDnS3Q`3TVIS9ToSj$WYhzOdjsuEn_+s=GZ6hNJ(+m$1Nb5M7%%1}5|p-PS!t{ZMo4|wG3*pK)?2O{)% zBup#~zj%y{jANz4)=Z#ghaq>S`;wvJs!-kx2VH6IL^q&F)zv)_bc9jXp9FJ>uVRLi z>Gbk@2HsVnFi$$-=W3+-^4E0KHjwuT!{&6NKk&R!o=^CqCzH1FRKQScG~EX=5;Wql&2ph=K2iunc zv*VC-$h)F=mbA0Az4Hq8k^+h(O9TYw2v{NstdC*j&67t3C}V+0thGp%rLACTLc2@a b=CakyGpP(LrR@m(Jsm39~|o8CYVc^v2@i1|>5 zBJz1GOd<_GeTU#aB}3Iyk-QoW`_kNqen^>`rw1bJ38QR0Nfy#T zB@9Q?@$$O|-dB+@Pdeu3Mv7FLU+q!dP~N2so6|{u=2EArT6TU3W_K(FxqEl>NaPZgyCQoz;U*U>-c9TY#>kn z*nT-M+YecXq6^CB$va!yJFj3bnV?M8B_S|JLYFMCK9*55PZ2#p1q%eRr$sthY!yor e>@InGm#^iX$>m^?wkAkyah37)1jn$PscK)wjjDVA literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/GreaterOrEqualExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/GreaterOrEqualExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..d3ccd0139e7be327a28c7c51d4073b7277167519 GIT binary patch literal 681 zcmb7>Jx{|h5Qbl;A1R?wC zk3ydZt{rg|3uU(-BPHTkhCy>CsL^N0pM^Jqq2kCuT#ZKqp|1JBr%crehurUTC3QSa z<`YlG44rIw@m+&GkO5auVPtod;E7OO)xIBd|5ugtyf1DOhV5*@KX^e&*CW243V?Pm9<>j(%P*15DRN)}-iy@;UP6&hFkT*h>nO$XWyfa|Bvsfz1g<(L6aug`K-fU3ux}L`Tzg` literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/MinusExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/MinusExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..9134dc051861260bec86a8bc3a7d452da63a8ebd GIT binary patch literal 653 zcma)3%TB^T6g|VMSWy&Fx4JL^6=!4IKv-xrF)6yhupe-2$COSpEk^%JS0*m}06)rj zrx0HW3A4D*bI*Ou$LHHSfMaaCC}5+Ex`RyzTMVU+id5QV=rz2N9`iWRNf7g~4n^ei zSeQf_e*PF6nIuX_?S(+i0Yl+T-%5t6ry_YZ84sno5yOxoHBXO3I1olze-D`M5!LtMO zQ==lk&EWR+#Ej&HvMbd8H9oQh6%549 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/NotEqualExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/NotEqualExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..9f58f913f7396c0ad90c602db72e18ed2939cbfa GIT binary patch literal 663 zcma)(%TB^T6o&sPmtsXxMA^#11iW=)+~6f@Ffl<~VAu~hwqr`CPK(jE(v^t|AHat) zo+-pj3<+JFGv~}d-?{YT^X(nL9;yzqSSg@lW7WnQL;gU9GC5+nthWbh=tjPZ{m31v zfQOzNaUBcowjLub;#jJ%Ig_Z-W5}MV8^KU&%TRPi!@khhydO}e+*Sh~^thHLo+Pu0 zFJp$2>3H$ogWH!O*H0>PJ1S}2k9hE_KPnuE+k|0bI_i%+r={nUzTkGA48#5`gwu2#SJBT{ zs3AlD*?bn5>4>aN(FNr*PZGjaAq?Ru)h^4>)0tqR6NJZV45dRAsq~oPvg!5pfX9JOf|w6< zC?cQ7!X(o0v!~d|BvCqQ&jhu)424sDCmE`qisaRB(39p?^g_ziJlz*zR~TjEak7vG zDq%R9E-!z2;5`)y^Q>cj6AqI`qEUW8eA$<2NBJsbXf#{igLo7? zo4=D975Qxjx1)!qFVB^opgvi5&+-)%QDR`*4DG4!`2P$H2eaHh$zI?({+$LJ$kW%_ zl>@WQkaZ}!pnRUZv$ehR2KJf(WwI`Tz#M@tSzvvHQ8Z5xT|fm3Bw}}qw6n5RERAJ% d$=kDhE%!n$2PECrtSa$ literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/PowExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/PowExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..58329153b2ceb890bd730b19788fae858c2cb2b6 GIT binary patch literal 647 zcma)($xg#C5QcwuO9_QSC~$=XQd^c>5C>Xu0D*)Q7OALrx0u8zjUy*zc`G;}ao_=X zD8x9efF3I9!;EMA`JWm4^XvTsz&_S(6tGf8&BCgMHHK1KMlwBOxTt%5HE`oVB|+>C zRLCRWjk!*Qc2A#TEs{j4s5KMR=rR;e)U9BsdNLB1!$D8z8{P{k<9Mpi!!Fm-#N%Wk z4P?U5o-QwbdT@I(;`&*|?zMXS(;C$b#a+sl+Tm5n%g^XV6PcaCTkN2%n@jl1vW+)Me`KV1yry=B4)QpJ0n}g(pYwv cygAD|xfgOd7)etT1RJ@^=y)v0u$)oOH;( literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/SmallerExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/SmallerExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..b5299e701f9b1099854cba338be33fdf980d9828 GIT binary patch literal 659 zcma)(%SyvQ6o&ulEj3oFwbrdJgw|U&;-;mDq98aqsy9 zck&f@nU=BNWw1Rp)+2E)%@D1Br4P)L8p^0JupUEy<~HY=gyCo&z)8M}>*Qx9Y@ta1 z*n9;r(+^pTq6^9w$y+^^yOS8NoX$rWIbrY1;iaJ9+x6vwcds~TV21*(hy literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/SmallerOrEqualExpression.class b/build/classes/java/main/com/phoshp/molang/parser/expression/binaryop/SmallerOrEqualExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..573ac26f2a124874c0eda864dd32a3dbe9d80f72 GIT binary patch literal 681 zcmb7>Jx{|h5Qbl;Eh(W;CGzm_M;9tRn#J~^W zM#m5k-c)0VOAHTjke|)~Z1318%g(8;AsGC?ZvC1&hmZ40K87>>nAR5}SA0>Wl z52JvGo*i?Q2xWI3VzRJX3p>8q^SYM%(e$k#O-Z%w9ykLz4a7%f zQaXx7M_i+lE-h^R$ZrJbf zrWj*}_cNZxG=dqInsBFBJ2S{fwL0fpYGD~V{W=Wu^aaIer&*)bpp!{EqdieN0sAh^ z7idjNWf}`48$$ literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/AssignParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/AssignParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..5c2232d8d92682975fa261e911cdc885bb63ea6e GIT binary patch literal 1064 zcma)5>q;9@5dJ0?SGS4xTWjm3^%7HbMe;ADP)Z9zYy~yYpPTe(j&AmZ-BqOT(s!tT z6fE=s`cTC=C!tANP6!J#JG0;SojEhJzyCb^0#L$+ixE6^@XW;$p1Vllg@a`WD-Ko( zBX49VledI)VY^DmyjNcZVWJ{K@#(5r6VZuZ3pg`fQFTA4`jOOeCz(kaGA8U->Z<9r z8Y*tIyrv5L@Z4+pQ7odi3q<0*i(`2n9_cKHWkS{<2;U2K_MxhK}%TDO4ldon9A{6b6e@iBe2I4HyClfa8yuQ-h zV|5kP#Yd?JG}GVV-3$NP&tVi}gpzeU;%`4X1M2EKSj*uhUTKYW!k$&b^ymK(6DD;D zp4o=awF^;C2%A=wgYZn=m`Sq~x4;VQ?KLl|IlWsokEt;1WDf^yURQC*ZK`4oS^m)o z4*zv2_S|~5E=L}FVxKMEgKo{|Cu}ts49Ky~wE@UuoFl#$CfRE8DKh*3`JYIA*?E13 p^gS{^IFUkEWZZ}p+rW+pQ!s^TBb>(!W|^ULbC^e(vkOLJ@ev=JG8_N^ literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/BooleanNotParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/BooleanNotParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..1afce8079d6f9a9b9ef7dc926147015af2076e6b GIT binary patch literal 939 zcma)5T}$IY6g{_J(HOr!s=Izw5nBcGQbefi!-_sgR|TcuV_F9rO*18lBK|6UQBd#) z_@l%-Q?c%@BNDhbcXIBTGv`j8Uml(Sl(A?dhrESJ8&mjUBZZ$9rY+1^m?h*k{m@T- z5z@s{jgZ-rCxS3o^+U0D(W;B+$g2muGE$WdFQ|Euuj;qOOw#mY!g{qKTW-54<7V4! z$-oOw-L@CSBI=|-B<^o11L1{xGC5FRc&S3jY82tBXlD2$tIVgHqKX-o$a4|;*SzJC zdaIPo(Cw>sB;weYAxp@0gc6p`4Sz{s)p{?&in-%oH3a)mUPKMC<0~`s|GTkv=3ROY zdeBSQFxn~JrGGHAdmamO4(3r%JPU-fkw+i;^RWv&|NfX5a#ENoh6 z5Gn^Umf34U(e>Jd(p&Xe5UPQU#nIWIBa&9wiMX;7sBRdw!$ju!v{=geG9|nUx@zDL z`zq}Z{eg4n?{+O3JZxYJ7g)nl>@Iw_anFb|Ib6cjqh**B* z^IG|?>6u&KjfROxQ>kK>P?@MC?3e+6Nnq9bEW)lCF|USTAFH#ZE8ff8$=aM1FHXbr z(7^(1!oJZ+aija%%GsA#c;a9S+ZLWWc!r&v%q6@ulIhR>&r}F^axuQ1;D^qs=w^h5 zkw(vjX$Y>dXU+_Q)e~7uj2KjNy`9DLpIY(|RGDm$G_B$-S2HicwGv zd&#J#G;1iSebrn|>3Q`fzau53udwVG4g$_GV!BKbEhi)FY-Z~FYEFAgNt1jR4mz7g z5AuduC}?_)Ghjny=y7(q0D(|jxfpt#JuagmCzY}iTXpiD@F8Oq60r=Kp?m9El<-Hz7)BifTTS59s8lqI4Xd+PcJ|bi$&a%qB_3_~~c+2l^O7Wbvf(j*41JG^dXcbB0#V9&|9`he=fyZ;12?K$plMz6DdaW`-dU*eV09jE*5lrjB(gu@erip#ydF5uiV1`Xab! zrGX{cOecv}Mr%dyG1w>Tx`m|IQdZ*@?M2%Ft!SeY!)@Fl$(?_~Lq8yK3fIOl-0{B8 z@EoDyJwklvK7#ihydTgy(02sk1eGqV(?u0G`TNT@_N|}7zcJwc3h@NhE__GLF={_j zR1Y|kho~f3PqLBVH=~`j4+u#g;TXYPOya(Uve!m(hLSMRUAu)mfqP`*q6kam*#S4j dv|nXwI!W`0G=6w~qd`Ddb(27j-K27%=O5#k7##or literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/BreakParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/BreakParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..075154cd949e7e4fe94921138b58c7915d2f7f7b GIT binary patch literal 754 zcmZ`%O;5r=5Peg=5d`sDFLDw%*ciQGJZR*EABlv-W2qZiC|%MPL;O{GBGJSj;Eys+ zw?u-bmw7wWc{6Wc_v`!p6Tm6<^GIPUgY7(w5O*@z&0vp^K9jBt&IyTHy-P@5sz*U6 zwWTX=CZnG4I#$o&N~NuA%jsI44D)$08T6%3IBwf&WRCmF?~l!qaxC}B99y0*ya*f- zm=~U~hIe6+vnC;>8wk@{Jo#F+d6Xu3&G@!J4TURTcv~ktHS6)MSJSa4d|xV;C8Q&b zgu{5kk_1+*cM%%#jK69K`Fl0-Y|)b1$0Z|<2G+AxKn7XDNvw(DS9N6L;uZummZfj^ z&w4^R+-d5cblV#UJ0MhJhiLP82&zc(3u4pwIT?&BnPZMKlaUxxjTz`of6jAE>tYTo zd@e){j781}t0-{{$t@n1V9b8Nc$gva%4Y)$eo^xeqMkXQyHUoPo|#1j>sru;W^Vof DE^x{6 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/ContinueParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/ContinueParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..69f7874d82df2519998eb1fc2974ec0bd8299b3b GIT binary patch literal 766 zcmZ`%O;5r=5Pic}0YMPO&x@P{4mL5w3&snP6MiHT5|0HpvRJxJTMY46>4`)We}F&A zI9&)tVlVqUzTWrE*w8 zYA%y-5>5CcfmQ2XgnBe%T@4|7uO{9=v}HKT^7<@JN7jp#gMl>RJaUv`DSSE1)msQ> zkwpE*|8_tqhMi5lu-pDf3<5$WvX0&Y*Fgmd{!KhR{#r3c7S3meJ(H0bll2+sU0-MU zOzB_-8*Jz135qM&X&GcAW1A^W%a_g?ihkU7b@<)QDT_PWUZoR?^~sPTPs=x-OOvY?v%LWkpg$M zRm)k?v-@v_nD{w{pj2TvPWYRzTN!dDjhs1uHP<@irty*DZHe1l(qDDu*miiSWLPFa zX!cMtjQAVWK_JvJ7DLM4q7e;MRd@1Kr;f~lexz$<*C=Qiqa=#ZQ(x8(_C;xD8g%FV z4) zN3e|N;#i?cyOhWC#t}CoSj7v0<|V_l?^yB6E?x{)wFnWc;T6M>uW_wv7hW?=_^QhJ z_{aECFRRJF**l;d83ujb$N?rd4DHhFasn8JeT`}dkD*0ES(I}WOC%engW9f?=mW@a zyhekq+cr0I4C#cYDO>1uiGD{FdtKwmOMhbRs^^evc@{KA7a(d~Gj#teAT5?aUZme$ z@7}8%g>|mj0o8V0u>t;9DY=b7bkZtixJG-mi70&lI(vxIh%%zVR0ZsdeD0;QSqfWm zo$e7&0XNV`9K%iY(ID@ithTu*G%`x=^A@Ah`EwM0h zCupr8^8E~LJL$kF+MDnL(X?`T3trqR==e5Z{EvUq6}6SpWb4 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet$1.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet$1.class new file mode 100644 index 0000000000000000000000000000000000000000..cec4e447c05aad26e99dee3bae8b1a9bb918264f GIT binary patch literal 1427 zcmbW0+fEZv6o&szOQ$UbD;`k9BUQlz73Cmu(6J0qnYP%edcg$_(}^7zW}0ci;FXC! zfQdeUi6-8v7-NhvCV1tQi9Udd@imNV6?C|eL`-J>e|>xQ+K09GeERwJJ%Ao$qBw%~ z2zDS5q39^%F$u>RI#@bcPOzM0ImL3CrHduWa)zaw2Q%hA2%TzQJuW1H2kIekf|Sro^x-HPSh%9z!XTa<8K!axicFc`xw?2cgw z!!eBDqChLBBzafKtg9^=r7_F2i;CyDUJRGGo6K^VCB-tzqOgpyjI&Izq*<=8OtPpL z78s=3CD&?~T&rDjt#)fhOHOXGl|;8dEbY)XQ?_2Im=%Gzztr69oM}`A2L5||fm562 z{yEp=hI0)q>GmQoqr0PXTHQ+Spg_Hx&*yFkbZs?Ja=juQvR%7Jbg=?*c9iZ|E>CwX zm6KIPODQzGrpnrcKuEcIO;$AlX*{pU1%-NTUyo*T`I+Be>oe)>HR=`3<_dorgHtNE zg=LNM(%K{qqGe=Ntqrms`Gdp{(Z9Eo{zVbr!&izUgwcXMMmfQYSXpRH5aS!4Uc@T$5`{<3*tUJgN5B~xV2S;WA literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..29bba848be9b2b60555b14ab20ef5043ff8cf015 GIT binary patch literal 2821 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 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/NameParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/NameParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..6cd71e3ef53caa1e4f8f9a67875713f57dc6edfb GIT binary patch literal 1860 zcma)7(N+>s6x|mY25}5EwKU7jR1g(2(-PCjG_4UWh%}!@oMaSca2Q(HpVV6YgT3G~ zSFN7=oIb$Sxr2s~)AD65_uO;#+2`DSF27E`{QxkIbst&~_F)wFd>F%h{%c&s10MuT zG++`Bx#f`;Q$9p6?ZsmeGa_dB(Gw9-A0#{#F(=}gh*FuWS=o8r@b}%QKA1DI*)srHy<#7tR_PMc)qR6f>`y zCDT|IA4Z7=WJC4wO3!!e(vm=CTmhpUkY%BSTx2hCAGV(=It# zwS+i_5%vnIxleo~B=ClsnN_Sb!^CCK7Ycf6PRV2{85nvU11nwaN{^$e+6>i+jykt-;kHcTs3Ajkf|zaw!^7N z-?Sx$1|q=m7gc48#$MekC>a{as@QU)Bf)pX*D|7}sq9mcfsJ!K&Rj0AF~t7!j#cy% zxtwrGFpYfL$I&*@iqE-Y@>wh^jj)BpaY$>W4M7X z`tso4^e^F|bt6=QD;63mp{@k?l=~RMI^P_^GbIckL1g%X?ofxj1aC`y3BJ#0KHW9Y z?h`tXA+2`^!*$=$c!Vo1{Dl7yO$Qyq0l~Y$DRtVZnkZ#6{8UL7)et2bYebCGoGDW| zrAef46Sr*Y8|cPus#~CW>%kq=QM`;^+$H2L%%TtdbT&X3ywtK+fV_fa@xyh3sE9!k PArV9EoN# zn_G`3<5XmsR0&IHlp+b+X22~8tXiK%*fAsSsv+2C>LTrnwk(WXy6wcf^XO~jU=B86 z-)N(_kv%nXb`J}$9BkpWg*Oh~V!Pn-2=9$t`qKADLRcuI1bTWOdgr2_6PiXAJrrgk zc*dSPP7tht$U9=fpk>bwXUCo8sZ0hu5qDN=$137RTg#m$E8cyO-{x2Awf!!dXz+6< zJm9xq;mDry`jE4LBXO+nT!DV*-wv-0U7W)_@13#%kKl5~X5cZe1^5J2{s8wkDxY>Q nQT>V973$x)RAJaP&Ag`BEL*2E48kIoG_{LmtY}?NG;;MnCNBH3 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/ReturnParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/ReturnParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..674043fd67da97b0962ebbd772f835ff41eb742d GIT binary patch literal 923 zcma)4+e+(D5M9$-jxpZvm!qvBwhBhXw~8;K4^l69q~K#(H#XX4mn1!iU!^Y!3Vwhe zCC=V0)(cxCFq7F?v-ZlGd3k+&2C#`m8yQSkn6xp4X&VX5SeUi&*TNhjv*ibVyiG{v z3uQuTN1hA9K*304pVW>j|dy3s%*H;nv7~qw;}6Z zaN#z+FcM)q)kW-{h`1F7$Lf^JA|b62gzLPy`#_eMOE-l@Gc1-@BJgkcx>NO5ESRCY z*UeBwkuL+5kZFq~ESnoXNnq9bF2ahrSs@U_Dkt3g-SiAK8dk+4fhp=h1 zQM}9U7}@;~3-b=L$SIBm!n%<||Lpfs5C)Y5S5NJzaw)1YA!lUK!(bM|k`eRKGu|bA zaaStF<3!c zW0`#*6#e#qP&!s$1mQ_2V{v{pABvi-}4n zi(sy1Q9KS7QId)zPcxAPy)2RO_>=B(*(H<>g0S@M>@yXzmLVlwJ1kR|B9`CyxW0bt zw(Zc9>Hb_$c)t8@DI%W*U8sJUqZd z!jW~1;>PxBkn8_&@X|vQEv@m2@Ybqfe)j$<2sLdXFk8DAPQ@rAw5%#-8LUF^t(ZF# zAUI=@^~I7&n|?c7AD54UH?ig4@3seMq0D!e`FxQJoOwzdU9JMo#JSwL2K_LfA92)R zFv#QR&PE?})uH5$zvx6;s>8>kyy4-IS@ JQ(K1l^go_x?{EMB literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/TernaryParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/TernaryParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..8e9003ac28780f4b7a19b8dc4e60e57ab22b97f6 GIT binary patch literal 1464 zcma)6-A)rh6#h=T?ZUEHK+qyuf3Wlqx*~XEjW>-ZCWV^NG|{_l9qdB8+iVvDzKJHj zgL(l*6Cc25GR8C0Vr#>aW|KWLXTEd3^EdPB&-b4Iwy|Yk3aM$_#vKE9aZkspl=ls2 zNb6YBk6FenEv$;A!D|>GQAyIK$v3t~M2)|}G+N@cqcul)qw|z(M2TCny zIX%KwrRjC7Zp-Vnx>m<)+wNPdYx_On_eEO-R!#V>?Vr4qYTlO!F$E!f%7&ZocolZ0 zjQmnKEbtD6>%3>anp|Cie0JRRMX%?0ZYdY;Zv;h{3R=RI8bW$PlXyRSLMGhcztp%I zDhEP7++sXS4y`TrgMMhUdx70N+_Af=H9B$xW6wMCo8q}6`?omOfZ~Du&Ng9SMn~R6 z0qZ(8OcY@e9)-43{43viLx-g@@c^6B<3qw`s0US<3kHHPCnK`d@KhTIq8Sj@LfyP@ z_nl)k7wn6$8VVf7M_3O8h=BKKcHOripVLVA29y|+N%vJoFaCH z_-82}YlG8|NT}0gjpW&2eGX+eQAp|=Ob#Y9m@dgwDJ&w3C4O43t8liNGKDm*vR;$q ngTUl!3D;DxWyU5sQ>j~KT$H_nvyUWyV@1abgKn}Sf?Iz9HgKoP literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/parselet/ThisParselet.class b/build/classes/java/main/com/phoshp/molang/parser/parselet/ThisParselet.class new file mode 100644 index 0000000000000000000000000000000000000000..0fb6fa9d29d72096d0a1802d4dd92e28d5ddf3f7 GIT binary patch literal 750 zcmZ`%%TB^T6g{^*3KitxTQ{;2SWsi!VcZy5)kh*BaanL8#nK^dF~qOZ6^SN(fFEVN zof1)!ZsyFrbI-kJ&dk^M`zL@?92m%8TgQ$8Ey7(Ldph*=^J{I1=1Ia9Udz;=7K??mw;nGT0eKsdGra%@h9G8j(Gv2<b8?pW>eNkwk zKfoVVyfYD_wNqr_-o3Nuo;h>w?8Bd*zX5Dv)kO}|4rW};;-iZc<{ZpBSa7gN$nD5b zCSM5YVyQ~Vd{t+HFj|qJ_}*>TM06a~TD+34sCv+<29ebD(_$uR$e8fCQde!i(@=4v zR3>B%if~o5GwiDh^O>foY=;Kw<&qt`d)0|V97`3lgj`Q3Vcp*FN&>4kdl5G59e=AKxJRlR)y1CFW=_9#W3w4t z1|9}5NZ7X8DW0XjFtmRj2TLB7QP4aqge@zNIrP8BLKxFhd^5#^T2s^$Lcz*p2E$B* zH7n+&e|)#h=6%s@eeu21D*or9^cl;gDhkN*wI?|I52QG=u^e5le9puDtG~@ zmHGkwD8%drVQ!0%r5VrenKNf+=Kt-Ve*k`9&PD-a7QWgT$ApaxCM`@^n6@xOD6IOS zpR5tG4{UCYxSR_aa}#_lLQp<;R4dwWe&lotBJS z9k(q5FZ}IxyeJk?&jliJ4?{0H-wV3&p1R(E@5^q~6q~;4<>-rMEFXKP zo`VnQBdi#kDIS!k?Mz=|;hTdZN{VKd@ZCtGpZw}f2!l$9t0%bII2O%>P%;wfsW1^? z-iUeJJl-o^JJrm6FTZzGpb$S5wV}K);j6t?4c?((o81WaGqor$PZ;-p>ID?d)O$Ulez)GPZ2L{OwN+`movzoZ1pY&>)%cFmx=8EvpOHB4+dv_+^uYbbt!V$Xpwnn= z(UzEPv>L&@!sXn{rOn@C;st+`1*Ml7EpMf_z2SA%-Hj$SnI*sGHt)HehMXg%5!4%9 zg~EyNVR=d2k@TTpZFxZ`P3Q6_P7-0DgEb7N8GIZN-q$_1$@<1}2h4Xi9(c82CjX^^ z@()88nG{SvsCyl$mHk}`bge0^iw==N-##$t!|+<*)*ddqZH*AAp~r03-EKWZHlE8b z@`Agoi_14y0p&!;>-L(QrWqyYu5;Oe9}ZPv;U!0Tpx=lWGThXf-|N)8n++LgO7m$- zaC0z@B?qtIw1s5{E4bib3}+N_C#9u>*D>kfA}%?2L&7VVRv14zlxw|4b5npF(wFB1 z**OPya95VkNr=*<^gc&q@($j^1%;9QB;kA%h#|WvowT@+VM%gr?a}sz-z4O2yY00$ z70L&hF+l1+;6-JVyodY;O!{AcT;|sx!!JjSE77Ht5n#DnAUrtBHOtc~Jz`=lJb@|{ zA0t*M_7Q&!<0ookcvWmLxH?>ik;EyCB8_v@oCzZ_f%80x-)p>y0LnEimWKHo&JVRy&!&x(%7&sZbydkbp z3R_C(s&0ih?;&#^Z{jW1HHJmJO|%4r>&Q_TCsOmsQ!+5e)(ezOEHF!vQUWFBKM&io zpW~c`vV|%BZ1oS$hGJ6SCgr21|6*#BA=QzYSz}H&IWaO*XN&eoaR*kpkK|XPx2uL2 zvPNXFrE!`jj&JBnm^ErBj`vBhcX+3Xt9X}EjQ=as{F{=7E|OkXbwg78Z5S`8Fj%}& ztQktZpws?2CWWe2B$~b)tOT&Gf%A`Zt=9U@Z z(#Pmg`hOV4{UblsbGTE96dFRfpll==Zr HF?{$hGz*Vs literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/phoshp/molang/parser/tokenizer/TokenIterator.class b/build/classes/java/main/com/phoshp/molang/parser/tokenizer/TokenIterator.class new file mode 100644 index 0000000000000000000000000000000000000000..7fbb79d96a1890e92c567e2c837e3be6539b2951 GIT binary patch literal 3152 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 literal 0 HcmV?d00001 diff --git a/build/libs/MoLang-1.0-SNAPSHOT.jar b/build/libs/MoLang-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..ae64516523699de61ac0855ebeba85ad85a308bd GIT binary patch literal 52256 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 literal 0 HcmV?d00001 diff --git a/build/reports/tests/test/classes/com.phoshp.molang.ParseTest.html b/build/reports/tests/test/classes/com.phoshp.molang.ParseTest.html new file mode 100644 index 0000000..72811c5 --- /dev/null +++ b/build/reports/tests/test/classes/com.phoshp.molang.ParseTest.html @@ -0,0 +1,449 @@ + + + + + +Test results - Parse + + + + + +

+

Parse

+
+
+ + + + + +
+
+ + + + + + + +
+
+
2
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.549s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + +
TestMethod nameDurationResult
Parse File 1parse1()0.526spassed
Parse File 2parse2()0.023spassed
+
+
+

Standard output

+ +
Raw Code: 
+v.x = 1;
+v.y = 1;
+loop(10, {
+  t.x = v.x + v.y;
+  v.x = v.y;
+  v.y = t.x;
+});
+
+(v.moo > 0) ? {
+  v.x = math.sin(q.life_time * 45);
+  v.x = v.x * v.x + 17.3;
+  t.sin_x = math.sin(v.x);
+  v.x = t.sin_x * t.sin_x + v.x * v.x;
+  v.x = math.sqrt(v.x) * v.x * math.pi;
+};
+
+v.x = 0;
+for_each(v.pig, query.get_nearby_entities(4, 'minecraft:pig'), {
+    v.x = v.x + v.pig->query.get_relative_block_state(0, 1, 0, 'flammable');
+    v.a = v.x->v.z;
+});
+[
+  {
+    "variable": {
+      "name": "v.x"
+    },
+    "expr": {
+      "number": 1.0
+    }
+  },
+  {
+    "variable": {
+      "name": "v.y"
+    },
+    "expr": {
+      "number": 1.0
+    }
+  },
+  {
+    "count": {
+      "number": 10.0
+    },
+    "body": {
+      "expressions": [
+        {
+          "variable": {
+            "name": "t.x"
+          },
+          "expr": {
+            "left": {
+              "name": "v.x"
+            },
+            "right": {
+              "name": "v.y"
+            }
+          }
+        },
+        {
+          "variable": {
+            "name": "v.x"
+          },
+          "expr": {
+            "name": "v.y"
+          }
+        },
+        {
+          "variable": {
+            "name": "v.y"
+          },
+          "expr": {
+            "name": "t.x"
+          }
+        }
+      ]
+    }
+  },
+  {
+    "condition": {
+      "left": {
+        "name": "v.moo"
+      },
+      "right": {
+        "number": 0.0
+      }
+    },
+    "thenExpr": {
+      "expressions": [
+        {
+          "variable": {
+            "name": "v.x"
+          },
+          "expr": {
+            "name": {
+              "name": "math.sin"
+            },
+            "args": [
+              {
+                "left": {
+                  "name": {
+                    "name": "q.life_time"
+                  },
+                  "args": []
+                },
+                "right": {
+                  "number": 45.0
+                }
+              }
+            ]
+          }
+        },
+        {
+          "variable": {
+            "name": "v.x"
+          },
+          "expr": {
+            "left": {
+              "name": "v.x"
+            },
+            "right": {
+              "left": {
+                "name": "v.x"
+              },
+              "right": {
+                "number": 17.3
+              }
+            }
+          }
+        },
+        {
+          "variable": {
+            "name": "t.sin_x"
+          },
+          "expr": {
+            "name": {
+              "name": "math.sin"
+            },
+            "args": [
+              {
+                "name": "v.x"
+              }
+            ]
+          }
+        },
+        {
+          "variable": {
+            "name": "v.x"
+          },
+          "expr": {
+            "left": {
+              "name": "t.sin_x"
+            },
+            "right": {
+              "left": {
+                "name": "t.sin_x"
+              },
+              "right": {
+                "left": {
+                  "name": "v.x"
+                },
+                "right": {
+                  "name": "v.x"
+                }
+              }
+            }
+          }
+        },
+        {
+          "variable": {
+            "name": "v.x"
+          },
+          "expr": {
+            "left": {
+              "name": {
+                "name": "math.sqrt"
+              },
+              "args": [
+                {
+                  "name": "v.x"
+                }
+              ]
+            },
+            "right": {
+              "left": {
+                "name": "v.x"
+              },
+              "right": {
+                "name": {
+                  "name": "math.pi"
+                },
+                "args": []
+              }
+            }
+          }
+        }
+      ]
+    }
+  },
+  {
+    "variable": {
+      "name": "v.x"
+    },
+    "expr": {
+      "number": 0.0
+    }
+  },
+  {
+    "variable": {
+      "name": "v.pig"
+    },
+    "array": {
+      "name": {
+        "name": "query.get_nearby_entities"
+      },
+      "args": [
+        {
+          "number": 4.0
+        },
+        {
+          "string": "minecraft:pig"
+        }
+      ]
+    },
+    "body": {
+      "expressions": [
+        {
+          "variable": {
+            "name": "v.x"
+          },
+          "expr": {
+            "left": {
+              "name": "v.x"
+            },
+            "right": {
+              "left": {
+                "name": "v.pig"
+              },
+              "right": {
+                "name": {
+                  "name": "query.get_relative_block_state"
+                },
+                "args": [
+                  {
+                    "number": 0.0
+                  },
+                  {
+                    "number": 1.0
+                  },
+                  {
+                    "number": 0.0
+                  },
+                  {
+                    "string": "flammable"
+                  }
+                ]
+              }
+            }
+          }
+        },
+        {
+          "variable": {
+            "name": "v.a"
+          },
+          "expr": {
+            "left": {
+              "name": "v.x"
+            },
+            "right": {
+              "name": "v.z"
+            }
+          }
+        }
+      ]
+    }
+  },
+  null
+]
+Raw Code: 
+v.a = query.is_sleeping ? geometry.my_sleeping_geo : array.my_geos[math.cos(query.anim_time * 12.3 + 41.9) * 10 + 0.6];
+[
+  {
+    "variable": {
+      "name": "v.a"
+    },
+    "expr": {
+      "condition": {
+        "name": {
+          "name": "query.is_sleeping"
+        },
+        "args": []
+      },
+      "thenExpr": {
+        "name": "geometry.my_sleeping_geo"
+      },
+      "elseExpr": {
+        "array": {
+          "name": "array.my_geos"
+        },
+        "index": {
+          "left": {
+            "name": {
+              "name": "math.cos"
+            },
+            "args": [
+              {
+                "left": {
+                  "name": {
+                    "name": "query.anim_time"
+                  },
+                  "args": []
+                },
+                "right": {
+                  "left": {
+                    "number": 12.3
+                  },
+                  "right": {
+                    "number": 41.9
+                  }
+                }
+              }
+            ]
+          },
+          "right": {
+            "left": {
+              "number": 10.0
+            },
+            "right": {
+              "number": 0.6
+            }
+          }
+        }
+      }
+    }
+  },
+  null
+]
+
+
+
+
+ +
+ + diff --git a/build/reports/tests/test/css/base-style.css b/build/reports/tests/test/css/base-style.css new file mode 100644 index 0000000..4afa73e --- /dev/null +++ b/build/reports/tests/test/css/base-style.css @@ -0,0 +1,179 @@ + +body { + margin: 0; + padding: 0; + font-family: sans-serif; + font-size: 12pt; +} + +body, a, a:visited { + color: #303030; +} + +#content { + padding-left: 50px; + padding-right: 50px; + padding-top: 30px; + padding-bottom: 30px; +} + +#content h1 { + font-size: 160%; + margin-bottom: 10px; +} + +#footer { + margin-top: 100px; + font-size: 80%; + white-space: nowrap; +} + +#footer, #footer a { + color: #a0a0a0; +} + +#line-wrapping-toggle { + vertical-align: middle; +} + +#label-for-line-wrapping-toggle { + vertical-align: middle; +} + +ul { + margin-left: 0; +} + +h1, h2, h3 { + white-space: nowrap; +} + +h2 { + font-size: 120%; +} + +ul.tabLinks { + padding-left: 0; + padding-top: 10px; + padding-bottom: 10px; + overflow: auto; + min-width: 800px; + width: auto !important; + width: 800px; +} + +ul.tabLinks li { + float: left; + height: 100%; + list-style: none; + padding-left: 10px; + padding-right: 10px; + padding-top: 5px; + padding-bottom: 5px; + margin-bottom: 0; + -moz-border-radius: 7px; + border-radius: 7px; + margin-right: 25px; + border: solid 1px #d4d4d4; + background-color: #f0f0f0; +} + +ul.tabLinks li:hover { + background-color: #fafafa; +} + +ul.tabLinks li.selected { + background-color: #c5f0f5; + border-color: #c5f0f5; +} + +ul.tabLinks a { + font-size: 120%; + display: block; + outline: none; + text-decoration: none; + margin: 0; + padding: 0; +} + +ul.tabLinks li h2 { + margin: 0; + padding: 0; +} + +div.tab { +} + +div.selected { + display: block; +} + +div.deselected { + display: none; +} + +div.tab table { + min-width: 350px; + width: auto !important; + width: 350px; + border-collapse: collapse; +} + +div.tab th, div.tab table { + border-bottom: solid #d0d0d0 1px; +} + +div.tab th { + text-align: left; + white-space: nowrap; + padding-left: 6em; +} + +div.tab th:first-child { + padding-left: 0; +} + +div.tab td { + white-space: nowrap; + padding-left: 6em; + padding-top: 5px; + padding-bottom: 5px; +} + +div.tab td:first-child { + padding-left: 0; +} + +div.tab td.numeric, div.tab th.numeric { + text-align: right; +} + +span.code { + display: inline-block; + margin-top: 0em; + margin-bottom: 1em; +} + +span.code pre { + font-size: 11pt; + padding-top: 10px; + padding-bottom: 10px; + padding-left: 10px; + padding-right: 10px; + margin: 0; + background-color: #f7f7f7; + border: solid 1px #d0d0d0; + min-width: 700px; + width: auto !important; + width: 700px; +} + +span.wrapped pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: break-all; +} + +label.hidden { + display: none; +} \ No newline at end of file diff --git a/build/reports/tests/test/css/style.css b/build/reports/tests/test/css/style.css new file mode 100644 index 0000000..3dc4913 --- /dev/null +++ b/build/reports/tests/test/css/style.css @@ -0,0 +1,84 @@ + +#summary { + margin-top: 30px; + margin-bottom: 40px; +} + +#summary table { + border-collapse: collapse; +} + +#summary td { + vertical-align: top; +} + +.breadcrumbs, .breadcrumbs a { + color: #606060; +} + +.infoBox { + width: 110px; + padding-top: 15px; + padding-bottom: 15px; + text-align: center; +} + +.infoBox p { + margin: 0; +} + +.counter, .percent { + font-size: 120%; + font-weight: bold; + margin-bottom: 8px; +} + +#duration { + width: 125px; +} + +#successRate, .summaryGroup { + border: solid 2px #d0d0d0; + -moz-border-radius: 10px; + border-radius: 10px; +} + +#successRate { + width: 140px; + margin-left: 35px; +} + +#successRate .percent { + font-size: 180%; +} + +.success, .success a { + color: #008000; +} + +div.success, #successRate.success { + background-color: #bbd9bb; + border-color: #008000; +} + +.failures, .failures a { + color: #b60808; +} + +.skipped, .skipped a { + color: #c09853; +} + +div.failures, #successRate.failures { + background-color: #ecdada; + border-color: #b60808; +} + +ul.linkList { + padding-left: 0; +} + +ul.linkList li { + list-style: none; + margin-bottom: 5px; +} diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html new file mode 100644 index 0000000..bd45b13 --- /dev/null +++ b/build/reports/tests/test/index.html @@ -0,0 +1,133 @@ + + + + + +Test results - Test Summary + + + + + +
+

Test Summary

+
+ + + + + +
+
+ + + + + + + +
+
+
2
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.549s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Packages

+ + + + + + + + + + + + + + + + + + + + + +
PackageTestsFailuresIgnoredDurationSuccess rate
+com.phoshp.molang +2000.549s100%
+
+
+

Classes

+ + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+com.phoshp.molang.ParseTest +2000.549s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js new file mode 100644 index 0000000..83bab4a --- /dev/null +++ b/build/reports/tests/test/js/report.js @@ -0,0 +1,194 @@ +(function (window, document) { + "use strict"; + + var tabs = {}; + + function changeElementClass(element, classValue) { + if (element.getAttribute("className")) { + element.setAttribute("className", classValue); + } else { + element.setAttribute("class", classValue); + } + } + + function getClassAttribute(element) { + if (element.getAttribute("className")) { + return element.getAttribute("className"); + } else { + return element.getAttribute("class"); + } + } + + function addClass(element, classValue) { + changeElementClass(element, getClassAttribute(element) + " " + classValue); + } + + function removeClass(element, classValue) { + changeElementClass(element, getClassAttribute(element).replace(classValue, "")); + } + + function initTabs() { + var container = document.getElementById("tabs"); + + tabs.tabs = findTabs(container); + tabs.titles = findTitles(tabs.tabs); + tabs.headers = findHeaders(container); + tabs.select = select; + tabs.deselectAll = deselectAll; + tabs.select(0); + + return true; + } + + function getCheckBox() { + return document.getElementById("line-wrapping-toggle"); + } + + function getLabelForCheckBox() { + return document.getElementById("label-for-line-wrapping-toggle"); + } + + function findCodeBlocks() { + var spans = document.getElementById("tabs").getElementsByTagName("span"); + var codeBlocks = []; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].className.indexOf("code") >= 0) { + codeBlocks.push(spans[i]); + } + } + return codeBlocks; + } + + function forAllCodeBlocks(operation) { + var codeBlocks = findCodeBlocks(); + + for (var i = 0; i < codeBlocks.length; ++i) { + operation(codeBlocks[i], "wrapped"); + } + } + + function toggleLineWrapping() { + var checkBox = getCheckBox(); + + if (checkBox.checked) { + forAllCodeBlocks(addClass); + } else { + forAllCodeBlocks(removeClass); + } + } + + function initControls() { + if (findCodeBlocks().length > 0) { + var checkBox = getCheckBox(); + var label = getLabelForCheckBox(); + + checkBox.onclick = toggleLineWrapping; + checkBox.checked = false; + + removeClass(label, "hidden"); + } + } + + function switchTab() { + var id = this.id.substr(1); + + for (var i = 0; i < tabs.tabs.length; i++) { + if (tabs.tabs[i].id === id) { + tabs.select(i); + break; + } + } + + return false; + } + + function select(i) { + this.deselectAll(); + + changeElementClass(this.tabs[i], "tab selected"); + changeElementClass(this.headers[i], "selected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + var h2 = document.createElement("H2"); + + h2.appendChild(document.createTextNode(this.titles[i])); + this.headers[i].appendChild(h2); + } + + function deselectAll() { + for (var i = 0; i < this.tabs.length; i++) { + changeElementClass(this.tabs[i], "tab deselected"); + changeElementClass(this.headers[i], "deselected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + var a = document.createElement("A"); + + a.setAttribute("id", "ltab" + i); + a.setAttribute("href", "#tab" + i); + a.onclick = switchTab; + a.appendChild(document.createTextNode(this.titles[i])); + + this.headers[i].appendChild(a); + } + } + + function findTabs(container) { + return findChildElements(container, "DIV", "tab"); + } + + function findHeaders(container) { + var owner = findChildElements(container, "UL", "tabLinks"); + return findChildElements(owner[0], "LI", null); + } + + function findTitles(tabs) { + var titles = []; + + for (var i = 0; i < tabs.length; i++) { + var tab = tabs[i]; + var header = findChildElements(tab, "H2", null)[0]; + + header.parentNode.removeChild(header); + + if (header.innerText) { + titles.push(header.innerText); + } else { + titles.push(header.textContent); + } + } + + return titles; + } + + function findChildElements(container, name, targetClass) { + var elements = []; + var children = container.childNodes; + + for (var i = 0; i < children.length; i++) { + var child = children.item(i); + + if (child.nodeType === 1 && child.nodeName === name) { + if (targetClass && child.className.indexOf(targetClass) < 0) { + continue; + } + + elements.push(child); + } + } + + return elements; + } + + // Entry point. + + window.onload = function() { + initTabs(); + initControls(); + }; +} (window, window.document)); \ No newline at end of file diff --git a/build/reports/tests/test/packages/com.phoshp.molang.html b/build/reports/tests/test/packages/com.phoshp.molang.html new file mode 100644 index 0000000..8b82a5b --- /dev/null +++ b/build/reports/tests/test/packages/com.phoshp.molang.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package com.phoshp.molang + + + + + +
+

Package com.phoshp.molang

+ +
+ + + + + +
+
+ + + + + + + +
+
+
2
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.549s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+Parse +2000.549s100%
+
+
+ +
+ + diff --git a/build/resources/test/parse_test.txt b/build/resources/test/parse_test.txt new file mode 100644 index 0000000..f2b16dd --- /dev/null +++ b/build/resources/test/parse_test.txt @@ -0,0 +1,21 @@ +v.x = 1; +v.y = 1; +loop(10, { + t.x = v.x + v.y; + v.x = v.y; + v.y = t.x; +}); + +(v.moo > 0) ? { + v.x = math.sin(q.life_time * 45); + v.x = v.x * v.x + 17.3; + t.sin_x = math.sin(v.x); + v.x = t.sin_x * t.sin_x + v.x * v.x; + v.x = math.sqrt(v.x) * v.x * math.pi; +}; + +v.x = 0; +for_each(v.pig, query.get_nearby_entities(4, 'minecraft:pig'), { + v.x = v.x + v.pig->query.get_relative_block_state(0, 1, 0, 'flammable'); + v.a = v.x->v.z; +}); \ No newline at end of file diff --git a/build/resources/test/parse_test2.txt b/build/resources/test/parse_test2.txt new file mode 100644 index 0000000..1450b7b --- /dev/null +++ b/build/resources/test/parse_test2.txt @@ -0,0 +1 @@ +v.a = query.is_sleeping ? geometry.my_sleeping_geo : array.my_geos[math.cos(query.anim_time * 12.3 + 41.9) * 10 + 0.6]; \ No newline at end of file diff --git a/build/test-results/test/TEST-com.phoshp.molang.ParseTest.xml b/build/test-results/test/TEST-com.phoshp.molang.ParseTest.xml new file mode 100644 index 0000000..821595d --- /dev/null +++ b/build/test-results/test/TEST-com.phoshp.molang.ParseTest.xml @@ -0,0 +1,344 @@ + + + + + + 0) ? { + v.x = math.sin(q.life_time * 45); + v.x = v.x * v.x + 17.3; + t.sin_x = math.sin(v.x); + v.x = t.sin_x * t.sin_x + v.x * v.x; + v.x = math.sqrt(v.x) * v.x * math.pi; +}; + +v.x = 0; +for_each(v.pig, query.get_nearby_entities(4, 'minecraft:pig'), { + v.x = v.x + v.pig->query.get_relative_block_state(0, 1, 0, 'flammable'); + v.a = v.x->v.z; +}); +[ + { + "variable": { + "name": "v.x" + }, + "expr": { + "number": 1.0 + } + }, + { + "variable": { + "name": "v.y" + }, + "expr": { + "number": 1.0 + } + }, + { + "count": { + "number": 10.0 + }, + "body": { + "expressions": [ + { + "variable": { + "name": "t.x" + }, + "expr": { + "left": { + "name": "v.x" + }, + "right": { + "name": "v.y" + } + } + }, + { + "variable": { + "name": "v.x" + }, + "expr": { + "name": "v.y" + } + }, + { + "variable": { + "name": "v.y" + }, + "expr": { + "name": "t.x" + } + } + ] + } + }, + { + "condition": { + "left": { + "name": "v.moo" + }, + "right": { + "number": 0.0 + } + }, + "thenExpr": { + "expressions": [ + { + "variable": { + "name": "v.x" + }, + "expr": { + "name": { + "name": "math.sin" + }, + "args": [ + { + "left": { + "name": { + "name": "q.life_time" + }, + "args": [] + }, + "right": { + "number": 45.0 + } + } + ] + } + }, + { + "variable": { + "name": "v.x" + }, + "expr": { + "left": { + "name": "v.x" + }, + "right": { + "left": { + "name": "v.x" + }, + "right": { + "number": 17.3 + } + } + } + }, + { + "variable": { + "name": "t.sin_x" + }, + "expr": { + "name": { + "name": "math.sin" + }, + "args": [ + { + "name": "v.x" + } + ] + } + }, + { + "variable": { + "name": "v.x" + }, + "expr": { + "left": { + "name": "t.sin_x" + }, + "right": { + "left": { + "name": "t.sin_x" + }, + "right": { + "left": { + "name": "v.x" + }, + "right": { + "name": "v.x" + } + } + } + } + }, + { + "variable": { + "name": "v.x" + }, + "expr": { + "left": { + "name": { + "name": "math.sqrt" + }, + "args": [ + { + "name": "v.x" + } + ] + }, + "right": { + "left": { + "name": "v.x" + }, + "right": { + "name": { + "name": "math.pi" + }, + "args": [] + } + } + } + } + ] + } + }, + { + "variable": { + "name": "v.x" + }, + "expr": { + "number": 0.0 + } + }, + { + "variable": { + "name": "v.pig" + }, + "array": { + "name": { + "name": "query.get_nearby_entities" + }, + "args": [ + { + "number": 4.0 + }, + { + "string": "minecraft:pig" + } + ] + }, + "body": { + "expressions": [ + { + "variable": { + "name": "v.x" + }, + "expr": { + "left": { + "name": "v.x" + }, + "right": { + "left": { + "name": "v.pig" + }, + "right": { + "name": { + "name": "query.get_relative_block_state" + }, + "args": [ + { + "number": 0.0 + }, + { + "number": 1.0 + }, + { + "number": 0.0 + }, + { + "string": "flammable" + } + ] + } + } + } + }, + { + "variable": { + "name": "v.a" + }, + "expr": { + "left": { + "name": "v.x" + }, + "right": { + "name": "v.z" + } + } + } + ] + } + }, + null +] +Raw Code: +v.a = query.is_sleeping ? geometry.my_sleeping_geo : array.my_geos[math.cos(query.anim_time * 12.3 + 41.9) * 10 + 0.6]; +[ + { + "variable": { + "name": "v.a" + }, + "expr": { + "condition": { + "name": { + "name": "query.is_sleeping" + }, + "args": [] + }, + "thenExpr": { + "name": "geometry.my_sleeping_geo" + }, + "elseExpr": { + "array": { + "name": "array.my_geos" + }, + "index": { + "left": { + "name": { + "name": "math.cos" + }, + "args": [ + { + "left": { + "name": { + "name": "query.anim_time" + }, + "args": [] + }, + "right": { + "left": { + "number": 12.3 + }, + "right": { + "number": 41.9 + } + } + } + ] + }, + "right": { + "left": { + "number": 10.0 + }, + "right": { + "number": 0.6 + } + } + } + } + } + }, + null +] +]]> + + diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin new file mode 100644 index 0000000..c7a77d1 --- /dev/null +++ b/build/test-results/test/binary/output.bin @@ -0,0 +1,353 @@ + Raw Code: + v.x = 1; + v.y = 1; + loop(10, { + t.x = v.x + v.y; + v.x = v.y; + v.y = t.x; +}); + +(v.moo > 0) ? { +$ v.x = math.sin(q.life_time * 45); + v.x = v.x * v.x + 17.3; + t.sin_x = math.sin(v.x); +' v.x = t.sin_x * t.sin_x + v.x * v.x; +( v.x = math.sqrt(v.x) * v.x * math.pi; +}; + + v.x = 0; +Afor_each(v.pig, query.get_nearby_entities(4, 'minecraft:pig'), { +M v.x = v.x + v.pig->query.get_relative_block_state(0, 1, 0, 'flammable'); + v.a = v.x->v.z; +}); +[ + { + "variable": { + "name": "v.x" + }, + "expr": { + "number": 1.0 + } + }, + { + "variable": { + "name": "v.y" + }, + "expr": { + "number": 1.0 + } + }, + { + "count": { + "number": 10.0 + }, + "body": { + "expressions": [ + + { + "variable": { + "name": "t.x" + }, + "expr": { + "left": { + "name": "v.x" + }, + "right": { + "name": "v.y" + } + } + }, + + { + "variable": { + "name": "v.x" + }, + "expr": { + "name": "v.y" + } + }, + + { + "variable": { + "name": "v.y" + }, + "expr": { + "name": "t.x" + } + + } + ] + } + }, + { + "condition": { + "left": { + "name": "v.moo" + }, + "right": { + "number": 0.0 + } + }, + "thenExpr": { + "expressions": [ + + { + "variable": { + "name": "v.x" + }, + "expr": { + "name": { +! "name": "math.sin" + }, + "args": [ + { + "left": { + "name": { +* "name": "q.life_time" + }, + "args": [] + }, + "right": { +! "number": 45.0 + } + } + ] + } + }, + + { + "variable": { + "name": "v.x" + }, + "expr": { + "left": { + "name": "v.x" + }, + "right": { + "left": { + "name": "v.x" + }, + "right": { + "number": 17.3 + } + } + } + }, + + { + "variable": { + "name": "t.sin_x" + }, + "expr": { + "name": { +! "name": "math.sin" + }, + "args": [ + { + "name": "v.x" + } + ] + } + }, + + { + "variable": { + "name": "v.x" + }, + "expr": { + "left": { + "name": "t.sin_x" + }, + "right": { + "left": { +" "name": "t.sin_x" + }, + "right": { + "left": { + "name": "v.x" + }, + "right": { + "name": "v.x" + } + } + } + } + }, + + { + "variable": { + "name": "v.x" + }, + "expr": { + "left": { + "name": { +$ "name": "math.sqrt" + }, + "args": [ + { + "name": "v.x" + } + ] + }, + "right": { + "left": { + "name": "v.x" + }, + "right": { + "name": { +$ "name": "math.pi" + }, + "args": [] + } + } + } + + } + ] + } + }, + { + "variable": { + "name": "v.x" + }, + "expr": { + "number": 0.0 + } + }, + { + "variable": { + "name": "v.pig" + }, + "array": { + "name": { +, "name": "query.get_nearby_entities" + }, + "args": [ + + { + "number": 4.0 + }, + + { +$ "string": "minecraft:pig" + + } + ] + }, + "body": { + "expressions": [ + + { + "variable": { + "name": "v.x" + }, + "expr": { + "left": { + "name": "v.x" + }, + "right": { + "left": { + "name": "v.pig" + }, + "right": { + "name": { +; "name": "query.get_relative_block_state" + }, + "args": [ + { +" "number": 0.0 + }, + { +" "number": 1.0 + }, + { +" "number": 0.0 + }, + { +* "string": "flammable" + } + ] + } + } + } + }, + + { + "variable": { + "name": "v.a" + }, + "expr": { + "left": { + "name": "v.x" + }, + "right": { + "name": "v.z" + } + } + + } + ] + } + }, + null +] + Raw Code: +yv.a = query.is_sleeping ? geometry.my_sleeping_geo : array.my_geos[math.cos(query.anim_time * 12.3 + 41.9) * 10 + 0.6]; +[ + { + "variable": { + "name": "v.a" + }, + "expr": { + "condition": { + "name": { +& "name": "query.is_sleeping" + }, + "args": [] + }, + "thenExpr": { ++ "name": "geometry.my_sleeping_geo" + }, + "elseExpr": { + "array": { +" "name": "array.my_geos" + }, + "index": { + "left": { + "name": { +! "name": "math.cos" + }, + "args": [ + { + "left": { + "name": { +. "name": "query.anim_time" + }, + "args": [] + }, + "right": { + "left": { +# "number": 12.3 + }, + "right": { +# "number": 41.9 + } + } + } + ] + }, + "right": { + "left": { + "number": 10.0 + }, + "right": { + "number": 0.6 + } + } + + } + } + } + }, + null +] diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx new file mode 100644 index 0000000000000000000000000000000000000000..19968786fc4971a472a2afed0a80d022729feb35 GIT binary patch literal 69 ecmZQ%Vq#=K0TOxt(Eu|Fyv9IE0L0|2JXB&q-a literal 0 HcmV?d00001 diff --git a/build/tmp/jar/MANIFEST.MF b/build/tmp/jar/MANIFEST.MF new file mode 100644 index 0000000..59499bc --- /dev/null +++ b/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..62d4c053550b91381bbd28b1afc82d634bf73a8a GIT binary patch literal 58910 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a4b4429 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..fbd7c51 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..5093609 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..a686e85 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'MoLang' + diff --git a/src/main/java/com/phoshp/molang/MoLang.java b/src/main/java/com/phoshp/molang/MoLang.java new file mode 100644 index 0000000..3a06c7e --- /dev/null +++ b/src/main/java/com/phoshp/molang/MoLang.java @@ -0,0 +1,8 @@ +package com.phoshp.molang; + +import com.phoshp.molang.parser.MoLangParser; + +public class MoLang { + + // TODO +} diff --git a/src/main/java/com/phoshp/molang/parser/Expression.java b/src/main/java/com/phoshp/molang/parser/Expression.java new file mode 100644 index 0000000..0ab8af6 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/Expression.java @@ -0,0 +1,4 @@ +package com.phoshp.molang.parser; + +public interface Expression { +} diff --git a/src/main/java/com/phoshp/molang/parser/InfixParselet.java b/src/main/java/com/phoshp/molang/parser/InfixParselet.java new file mode 100644 index 0000000..5c3dd53 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/InfixParselet.java @@ -0,0 +1,8 @@ +package com.phoshp.molang.parser; + +import com.phoshp.molang.parser.tokenizer.Token; + +public interface InfixParselet { + + Expression parse(MoLangParser parser, Token token, Expression leftExpr); +} diff --git a/src/main/java/com/phoshp/molang/parser/MoLangParser.java b/src/main/java/com/phoshp/molang/parser/MoLangParser.java new file mode 100644 index 0000000..8f2b1b3 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/MoLangParser.java @@ -0,0 +1,200 @@ +package com.phoshp.molang.parser; + +import com.phoshp.molang.parser.expression.*; +import com.phoshp.molang.parser.parselet.*; +import com.phoshp.molang.parser.tokenizer.Token; +import com.phoshp.molang.parser.tokenizer.TokenIterator; +import com.phoshp.molang.parser.tokenizer.TokenType; +import lombok.extern.log4j.Log4j2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Log4j2 +public final class MoLangParser { + + private final static Map prefixParselets = new HashMap<>(); + private final static Map infixParselets = new HashMap<>(); + + private final TokenIterator tokenIterator; + private final List readTokens = new ArrayList<>(); + private Token lastConsumed; + private Expression lastExpression; + + static { + prefixParselets.put(TokenType.NAME, new NameParselet()); + prefixParselets.put(TokenType.STRING, new StringParselet()); + prefixParselets.put(TokenType.NUMBER, new NumberParselet()); + prefixParselets.put(TokenType.TRUE, new BooleanParselet()); + prefixParselets.put(TokenType.FALSE, new BooleanParselet()); + prefixParselets.put(TokenType.RETURN, new ReturnParselet()); + prefixParselets.put(TokenType.CONTINUE, new ContinueParselet()); + prefixParselets.put(TokenType.BREAK, new BreakParselet()); + prefixParselets.put(TokenType.LOOP, new LoopParselet()); + prefixParselets.put(TokenType.FOR_EACH, new ForEachParselet()); + prefixParselets.put(TokenType.THIS, new ThisParselet()); + prefixParselets.put(TokenType.BRACKET_LEFT, new GroupParselet()); + prefixParselets.put(TokenType.CURLY_BRACKET_LEFT, new BracketScopeParselet()); + prefixParselets.put(TokenType.MINUS, new UnaryMinusParselet()); + prefixParselets.put(TokenType.PLUS, new UnaryPlusParselet()); + prefixParselets.put(TokenType.BANG, new BooleanNotParselet()); + + infixParselets.put(TokenType.QUESTION, new TernaryParselet()); + infixParselets.put(TokenType.ARRAY_LEFT, new ArrayAccessParselet()); + infixParselets.put(TokenType.PLUS, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.MINUS, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.SLASH, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.ASTERISK, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.EQUALS, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.NOT_EQUALS, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.GREATER, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.GREATER_OR_EQUALS, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.SMALLER, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.SMALLER_OR_EQUALS, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.AND, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.OR, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.COALESCE, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.ARROW, new GenericBinaryOpParselet()); + infixParselets.put(TokenType.ASSIGN, new AssignParselet()); + } + + public MoLangParser(TokenIterator iterator) { + this.tokenIterator = iterator; + } + + public List parse() { + List exprs = new ArrayList<>(); + + do { + exprs.add(parseExpression()); + } while (matchToken(TokenType.SEMICOLON)); + + return exprs; + } + + public Expression parseExpression() { + Token token = consumeToken(); + + if (token.getType().equals(TokenType.EOF)) { + return null; + } + + Parselet parselet = prefixParselets.get(token.getType()); + + if (parselet == null) { + throw new RuntimeException("Cannot parse " + token.getType().name() + " expression " + token.getText()); + } + + return parseInfixExpression(parselet.parse(this, token)); + } + + private Expression parseInfixExpression(Expression expression) { + Token nextToken = readToken(); + + if (infixParselets.containsKey(nextToken.getType())) { + Token token = consumeToken(); + + return infixParselets.get(nextToken.getType()).parse(this, token, expression); + } + + return expression; + } + + public List parseArgs() { + List args = new ArrayList<>(); + + if (matchToken(TokenType.BRACKET_LEFT)) { + if (!matchToken(TokenType.BRACKET_RIGHT)) { // check for empty groups + do { + args.add(parseExpression()); + } while (matchToken(TokenType.COMMA)); + + consumeToken(TokenType.BRACKET_RIGHT); + } + } + + return args; + } + + public String fixNameShortcut(String name) { + String[] splits = name.split("\\."); + + switch (splits[0]) { + case "q": + splits[0] = "query"; + break; + case "v": + splits[0] = "variable"; + break; + case "t": + splits[0] = "temp"; + break; + case "c": + splits[0] = "context"; + break; + } + + return String.join(".", splits); + } + + public String getNameHead(String name) { + return name.split("\\.")[0]; + } + + public boolean checkName(String name) { + String head = getNameHead(name); + + return head.equals("query") || head.equals("variable") || head.equals("temp") || head.equals("context"); + } + + public Token consumeToken() { + return consumeToken(null); + } + + public Token consumeToken(TokenType expectedType) { + tokenIterator.step(); + Token token = readToken(); + + if (expectedType != null) { + if (!token.getType().equals(expectedType)) { + throw new RuntimeException("Expected token " + expectedType.name() + " and " + token.getType().name() + " given"); + } + } + + lastConsumed = readTokens.remove(0); + + return lastConsumed; + } + + public boolean matchToken(TokenType expectedType) { + return matchToken(expectedType, true); + } + + public boolean matchToken(TokenType expectedType, boolean consume) { + Token token = readToken(); + + if (token == null || !token.getType().equals(expectedType)) { + return false; + } else { + if (consume) { + consumeToken(); + } + + return true; + } + } + + private Token readToken() { + return readToken(0); + } + + private Token readToken(int distance) { + while (distance >= readTokens.size()) { + readTokens.add(tokenIterator.next()); + } + + return readTokens.get(distance); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/Parselet.java b/src/main/java/com/phoshp/molang/parser/Parselet.java new file mode 100644 index 0000000..3568664 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/Parselet.java @@ -0,0 +1,8 @@ +package com.phoshp.molang.parser; + +import com.phoshp.molang.parser.tokenizer.Token; + +public interface Parselet { + + Expression parse(MoLangParser parser, Token token); +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/ArrayAccessExpression.java b/src/main/java/com/phoshp/molang/parser/expression/ArrayAccessExpression.java new file mode 100644 index 0000000..9dd1a73 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/ArrayAccessExpression.java @@ -0,0 +1,11 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class ArrayAccessExpression implements Expression { + + Expression array; + Expression index; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/AssignExpression.java b/src/main/java/com/phoshp/molang/parser/expression/AssignExpression.java new file mode 100644 index 0000000..fe673a3 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/AssignExpression.java @@ -0,0 +1,11 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class AssignExpression implements Expression { + + Expression variable; + Expression expr; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/BinaryOpExpression.java b/src/main/java/com/phoshp/molang/parser/expression/BinaryOpExpression.java new file mode 100644 index 0000000..cfbb2a7 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/BinaryOpExpression.java @@ -0,0 +1,14 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.*; + +@Getter +@RequiredArgsConstructor +abstract public class BinaryOpExpression implements Expression { + + private final Expression left; + private final Expression right; + + public abstract String getSigil(); +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/BooleanExpression.java b/src/main/java/com/phoshp/molang/parser/expression/BooleanExpression.java new file mode 100644 index 0000000..e41873f --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/BooleanExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class BooleanExpression implements Expression { + + boolean value; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/BooleanNotExpression.java b/src/main/java/com/phoshp/molang/parser/expression/BooleanNotExpression.java new file mode 100644 index 0000000..1c2f9e0 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/BooleanNotExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class BooleanNotExpression implements Expression { + + Expression expression; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/BreakExpression.java b/src/main/java/com/phoshp/molang/parser/expression/BreakExpression.java new file mode 100644 index 0000000..ffa9b0a --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/BreakExpression.java @@ -0,0 +1,9 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class BreakExpression implements Expression { + +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/ContinueExpression.java b/src/main/java/com/phoshp/molang/parser/expression/ContinueExpression.java new file mode 100644 index 0000000..2224b44 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/ContinueExpression.java @@ -0,0 +1,9 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class ContinueExpression implements Expression { + +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/ForEachExpression.java b/src/main/java/com/phoshp/molang/parser/expression/ForEachExpression.java new file mode 100644 index 0000000..26475b4 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/ForEachExpression.java @@ -0,0 +1,12 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class ForEachExpression implements Expression { + + Expression variable; + Expression array; + Expression body; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/FuncCallExpression.java b/src/main/java/com/phoshp/molang/parser/expression/FuncCallExpression.java new file mode 100644 index 0000000..9af29d5 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/FuncCallExpression.java @@ -0,0 +1,11 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class FuncCallExpression implements Expression { + + Expression name; + Expression[] args; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/LoopExpression.java b/src/main/java/com/phoshp/molang/parser/expression/LoopExpression.java new file mode 100644 index 0000000..7a1c89d --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/LoopExpression.java @@ -0,0 +1,11 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class LoopExpression implements Expression { + + Expression count; + Expression body; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/NameExpression.java b/src/main/java/com/phoshp/molang/parser/expression/NameExpression.java new file mode 100644 index 0000000..083f526 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/NameExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class NameExpression implements Expression { + + String name; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/NumberExpression.java b/src/main/java/com/phoshp/molang/parser/expression/NumberExpression.java new file mode 100644 index 0000000..4591f08 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/NumberExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class NumberExpression implements Expression { + + float number; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/ReturnExpression.java b/src/main/java/com/phoshp/molang/parser/expression/ReturnExpression.java new file mode 100644 index 0000000..ad1f494 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/ReturnExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class ReturnExpression implements Expression { + + Expression expression; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/StatementExpression.java b/src/main/java/com/phoshp/molang/parser/expression/StatementExpression.java new file mode 100644 index 0000000..fe86417 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/StatementExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class StatementExpression implements Expression { + + Expression[] expressions; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/StringExpression.java b/src/main/java/com/phoshp/molang/parser/expression/StringExpression.java new file mode 100644 index 0000000..1a042d1 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/StringExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class StringExpression implements Expression { + + String string; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/TernaryExpression.java b/src/main/java/com/phoshp/molang/parser/expression/TernaryExpression.java new file mode 100644 index 0000000..1235e72 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/TernaryExpression.java @@ -0,0 +1,12 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class TernaryExpression implements Expression { + + Expression condition; + Expression thenExpr; + Expression elseExpr; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/ThisExpression.java b/src/main/java/com/phoshp/molang/parser/expression/ThisExpression.java new file mode 100644 index 0000000..a2b070d --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/ThisExpression.java @@ -0,0 +1,9 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class ThisExpression implements Expression { + +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/UnaryMinusExpression.java b/src/main/java/com/phoshp/molang/parser/expression/UnaryMinusExpression.java new file mode 100644 index 0000000..aeb54c1 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/UnaryMinusExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class UnaryMinusExpression implements Expression { + + Expression expression; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/UnaryPlusExpression.java b/src/main/java/com/phoshp/molang/parser/expression/UnaryPlusExpression.java new file mode 100644 index 0000000..9bf65b6 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/UnaryPlusExpression.java @@ -0,0 +1,10 @@ +package com.phoshp.molang.parser.expression; + +import com.phoshp.molang.parser.Expression; +import lombok.Value; + +@Value +public class UnaryPlusExpression implements Expression { + + Expression expression; +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/ArrowExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/ArrowExpression.java new file mode 100644 index 0000000..a914d2a --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/ArrowExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class ArrowExpression extends BinaryOpExpression { + + public ArrowExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "->"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/BooleanAndExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/BooleanAndExpression.java new file mode 100644 index 0000000..80efd84 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/BooleanAndExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class BooleanAndExpression extends BinaryOpExpression { + + public BooleanAndExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "&&"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/BooleanOrExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/BooleanOrExpression.java new file mode 100644 index 0000000..edff6d2 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/BooleanOrExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class BooleanOrExpression extends BinaryOpExpression { + + public BooleanOrExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "||"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/CoalesceExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/CoalesceExpression.java new file mode 100644 index 0000000..f6744a2 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/CoalesceExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class CoalesceExpression extends BinaryOpExpression { + + public CoalesceExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "??"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/DivideExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/DivideExpression.java new file mode 100644 index 0000000..3b02213 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/DivideExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class DivideExpression extends BinaryOpExpression { + + public DivideExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "/"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/EqualExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/EqualExpression.java new file mode 100644 index 0000000..6beab61 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/EqualExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class EqualExpression extends BinaryOpExpression { + + public EqualExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "=="; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/GreaterExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/GreaterExpression.java new file mode 100644 index 0000000..e321647 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/GreaterExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class GreaterExpression extends BinaryOpExpression { + + public GreaterExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return ">"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/GreaterOrEqualExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/GreaterOrEqualExpression.java new file mode 100644 index 0000000..2a8250e --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/GreaterOrEqualExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class GreaterOrEqualExpression extends BinaryOpExpression { + + public GreaterOrEqualExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return ">="; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/MinusExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/MinusExpression.java new file mode 100644 index 0000000..284f3e4 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/MinusExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class MinusExpression extends BinaryOpExpression { + + public MinusExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "-"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/NotEqualExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/NotEqualExpression.java new file mode 100644 index 0000000..1e92d33 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/NotEqualExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class NotEqualExpression extends BinaryOpExpression { + + public NotEqualExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "!="; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/PlusExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/PlusExpression.java new file mode 100644 index 0000000..393319a --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/PlusExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class PlusExpression extends BinaryOpExpression { + + public PlusExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "+"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/PowExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/PowExpression.java new file mode 100644 index 0000000..6d8fd02 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/PowExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class PowExpression extends BinaryOpExpression { + + public PowExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "*"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/SmallerExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/SmallerExpression.java new file mode 100644 index 0000000..e85200c --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/SmallerExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class SmallerExpression extends BinaryOpExpression { + + public SmallerExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "<"; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/expression/binaryop/SmallerOrEqualExpression.java b/src/main/java/com/phoshp/molang/parser/expression/binaryop/SmallerOrEqualExpression.java new file mode 100644 index 0000000..e1a700b --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/expression/binaryop/SmallerOrEqualExpression.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.expression.binaryop; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.expression.BinaryOpExpression; + +public class SmallerOrEqualExpression extends BinaryOpExpression { + + public SmallerOrEqualExpression(Expression left, Expression right) { + super(left, right); + } + + @Override + public String getSigil() { + return "<="; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/ArrayAccessParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/ArrayAccessParselet.java new file mode 100644 index 0000000..c8b7e86 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/ArrayAccessParselet.java @@ -0,0 +1,20 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.InfixParselet; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.ArrayAccessExpression; +import com.phoshp.molang.parser.tokenizer.Token; +import com.phoshp.molang.parser.tokenizer.TokenType; + +public class ArrayAccessParselet implements InfixParselet { + + @Override + public Expression parse(MoLangParser parser, Token token, Expression leftExpr) { + Expression index = parser.parseExpression(); + parser.consumeToken(TokenType.ARRAY_RIGHT); + + return new ArrayAccessExpression(leftExpr, index); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/AssignParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/AssignParselet.java new file mode 100644 index 0000000..4a4cc79 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/AssignParselet.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.InfixParselet; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.AssignExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class AssignParselet implements InfixParselet { + + @Override + public Expression parse(MoLangParser parser, Token token, Expression leftExpr) { + return new AssignExpression(leftExpr, parser.parseExpression()); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/BooleanNotParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/BooleanNotParselet.java new file mode 100644 index 0000000..1a3a134 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/BooleanNotParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.BooleanNotExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class BooleanNotParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new BooleanNotExpression(parser.parseExpression()); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/BooleanParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/BooleanParselet.java new file mode 100644 index 0000000..5df956b --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/BooleanParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.BooleanExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class BooleanParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new BooleanExpression(Boolean.parseBoolean(token.getText())); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/BracketScopeParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/BracketScopeParselet.java new file mode 100644 index 0000000..26cf608 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/BracketScopeParselet.java @@ -0,0 +1,33 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.StatementExpression; +import com.phoshp.molang.parser.tokenizer.Token; +import com.phoshp.molang.parser.tokenizer.TokenType; + +import java.util.ArrayList; +import java.util.List; + +public class BracketScopeParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + List exprs = new ArrayList<>(); + + if (!parser.matchToken(TokenType.CURLY_BRACKET_RIGHT)) { + do { + if (parser.matchToken(TokenType.CURLY_BRACKET_RIGHT, false)) { + break; + } + + exprs.add(parser.parseExpression()); + } while (parser.matchToken(TokenType.SEMICOLON)); + + parser.consumeToken(TokenType.CURLY_BRACKET_RIGHT); + } + + return new StatementExpression(exprs.toArray(new Expression[0])); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/BreakParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/BreakParselet.java new file mode 100644 index 0000000..a16604c --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/BreakParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.BreakExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class BreakParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new BreakExpression(); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/ContinueParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/ContinueParselet.java new file mode 100644 index 0000000..5483b6f --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/ContinueParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.ContinueExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class ContinueParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new ContinueExpression(); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/ForEachParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/ForEachParselet.java new file mode 100644 index 0000000..67df5e3 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/ForEachParselet.java @@ -0,0 +1,23 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.ForEachExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +import java.util.List; + +public class ForEachParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + List args = parser.parseArgs(); + + if (args.size() != 3) { + throw new RuntimeException("ForEach: Expected 3 argument, " + args.size() + " argument given"); + } else { + return new ForEachExpression(args.get(0), args.get(1), args.get(2)); + } + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet.java new file mode 100644 index 0000000..9d0d2dd --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/GenericBinaryOpParselet.java @@ -0,0 +1,49 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.InfixParselet; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.binaryop.*; +import com.phoshp.molang.parser.tokenizer.Token; + +public class GenericBinaryOpParselet implements InfixParselet { + + @Override + public Expression parse(MoLangParser parser, Token token, Expression leftExpr) { + Expression rightExpr = parser.parseExpression(); + + switch (token.getType()) { + case ARROW: + return new ArrowExpression(leftExpr, rightExpr); + case AND: + return new BooleanAndExpression(leftExpr, rightExpr); + case OR: + return new BooleanOrExpression(leftExpr, rightExpr); + case COALESCE: + return new CoalesceExpression(leftExpr, rightExpr); + case SLASH: + return new DivideExpression(leftExpr, rightExpr); + case EQUALS: + return new EqualExpression(leftExpr, rightExpr); + case GREATER: + return new GreaterExpression(leftExpr, rightExpr); + case GREATER_OR_EQUALS: + return new GreaterOrEqualExpression(leftExpr, rightExpr); + case MINUS: + return new MinusExpression(leftExpr, rightExpr); + case NOT_EQUALS: + return new NotEqualExpression(leftExpr, rightExpr); + case PLUS: + return new PlusExpression(leftExpr, rightExpr); + case ASTERISK: + return new PowExpression(leftExpr, rightExpr); + case SMALLER: + return new SmallerExpression(leftExpr, rightExpr); + case SMALLER_OR_EQUALS: + return new SmallerOrEqualExpression(leftExpr, rightExpr); + } + + return null; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/GroupParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/GroupParselet.java new file mode 100644 index 0000000..9309f9b --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/GroupParselet.java @@ -0,0 +1,19 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.tokenizer.Token; +import com.phoshp.molang.parser.tokenizer.TokenType; + +public class GroupParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + // this only for conditions + Expression expr = parser.parseExpression(); + parser.consumeToken(TokenType.BRACKET_RIGHT); + + return expr; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/LoopParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/LoopParselet.java new file mode 100644 index 0000000..e484c6e --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/LoopParselet.java @@ -0,0 +1,23 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.LoopExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +import java.util.List; + +public class LoopParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + List args = parser.parseArgs(); + + if (args.size() != 2) { + throw new RuntimeException("Loop: Expected 2 argument, " + args.size() + " argument given"); + } else { + return new LoopExpression(args.get(0), args.get(1)); + } + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/NameParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/NameParselet.java new file mode 100644 index 0000000..2751738 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/NameParselet.java @@ -0,0 +1,27 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.FuncCallExpression; +import com.phoshp.molang.parser.expression.NameExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +import java.util.List; + +public class NameParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + List args = parser.parseArgs(); + String name = parser.fixNameShortcut(token.getText()); + + Expression nameExpr = new NameExpression(token.getText()); + + if (args.size() > 0 || parser.getNameHead(name).equals("query") || parser.getNameHead(name).equals("math")){ + return new FuncCallExpression(nameExpr, args.toArray(new Expression[0])); + } + + return nameExpr; + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/NumberParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/NumberParselet.java new file mode 100644 index 0000000..acba44a --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/NumberParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.NumberExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class NumberParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new NumberExpression(Float.parseFloat(token.getText())); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/ReturnParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/ReturnParselet.java new file mode 100644 index 0000000..d891e13 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/ReturnParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.ReturnExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class ReturnParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new ReturnExpression(parser.parseExpression()); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/StringParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/StringParselet.java new file mode 100644 index 0000000..a830c95 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/StringParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.StringExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class StringParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new StringExpression(token.getText()); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/TernaryParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/TernaryParselet.java new file mode 100644 index 0000000..9e6d08a --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/TernaryParselet.java @@ -0,0 +1,27 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.InfixParselet; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.TernaryExpression; +import com.phoshp.molang.parser.tokenizer.Token; +import com.phoshp.molang.parser.tokenizer.TokenType; + +public class TernaryParselet implements InfixParselet { + + @Override + public Expression parse(MoLangParser parser, Token token, Expression leftExpr) { + if (parser.matchToken(TokenType.COLON)) { + return new TernaryExpression(leftExpr, null, parser.parseExpression()); + } else { + Expression thenExpr = parser.parseExpression(); + + if (!parser.matchToken(TokenType.COLON)) { + return new TernaryExpression(leftExpr, thenExpr, null); + } else { + return new TernaryExpression(leftExpr, thenExpr, parser.parseExpression()); + } + } + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/ThisParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/ThisParselet.java new file mode 100644 index 0000000..27c8582 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/ThisParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.ThisExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class ThisParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new ThisExpression(); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/UnaryMinusParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/UnaryMinusParselet.java new file mode 100644 index 0000000..dc4a30d --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/UnaryMinusParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.UnaryMinusExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class UnaryMinusParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new UnaryMinusExpression(parser.parseExpression()); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/parselet/UnaryPlusParselet.java b/src/main/java/com/phoshp/molang/parser/parselet/UnaryPlusParselet.java new file mode 100644 index 0000000..794d64d --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/parselet/UnaryPlusParselet.java @@ -0,0 +1,15 @@ +package com.phoshp.molang.parser.parselet; + +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.Parselet; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.expression.UnaryPlusExpression; +import com.phoshp.molang.parser.tokenizer.Token; + +public class UnaryPlusParselet implements Parselet { + + @Override + public Expression parse(MoLangParser parser, Token token) { + return new UnaryPlusExpression(parser.parseExpression()); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/tokenizer/Token.java b/src/main/java/com/phoshp/molang/parser/tokenizer/Token.java new file mode 100644 index 0000000..fdf9887 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/tokenizer/Token.java @@ -0,0 +1,16 @@ +package com.phoshp.molang.parser.tokenizer; + +import lombok.RequiredArgsConstructor; +import lombok.Value; + +@Value +@RequiredArgsConstructor +public class Token { + TokenType type; + String text; + + public Token(TokenType tokenType) { + this.type = tokenType; + this.text = tokenType.getSymbol(); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/tokenizer/TokenIterator.java b/src/main/java/com/phoshp/molang/parser/tokenizer/TokenIterator.java new file mode 100644 index 0000000..062800e --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/tokenizer/TokenIterator.java @@ -0,0 +1,105 @@ +package com.phoshp.molang.parser.tokenizer; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@RequiredArgsConstructor +public class TokenIterator { + + private final String code; + + private int index = 0; + private int currentLine = 0; + private int lastStep = 0; + private int lastStepLine = 0; + + public boolean hasNext() { + return index < code.length(); + } + + public Token next() { + while (index < code.length()) { + if (code.length() > index + 1) { // check tokens with double chars + TokenType token = TokenType.bySymbol(code.substring(index, index + 2)); + + if (token != null) { + index += 2; + return new Token(token); + } + } + + String expr = getStringAt(index); + TokenType tokenType = TokenType.bySymbol(expr); + if (tokenType != null) { + index++; + return new Token(tokenType); + } else if (expr.equals("'")) { + int stringStart = index; + int stringLength = index + 1; + + while (stringLength < code.length() && !getStringAt(stringLength).equals("'")) { + stringLength++; + } + + stringLength++; + index = stringLength; + + return new Token(TokenType.STRING, code.substring(stringStart + 1, stringLength - 1)); + } else if (Character.isLetter(expr.charAt(0))) { + int nameLength = index + 1; + + while (nameLength < code.length() && (Character.isLetterOrDigit(getStringAt(nameLength).charAt(0)) || getStringAt(nameLength).equals("_") || getStringAt(nameLength).equals("."))) { + nameLength++; + } + + String value = code.substring(index, nameLength).toLowerCase(); + TokenType token = TokenType.bySymbol(value); + + if (token == null) { + token = TokenType.NAME; + } + + index = nameLength; + return new Token(token, value); + } else if (Character.isDigit(expr.charAt(0))) { + int numStart = index; + int numLength = index + 1; + boolean hasDecimal = false; + + while (numLength < code.length() && (Character.isDigit(getStringAt(numLength).charAt(0)) || (getStringAt(numLength).equals(".") && !hasDecimal))) { + if (getStringAt(numLength).equals(".")) { + hasDecimal = true; + } + numLength++; + } + + index = numLength; + + return new Token(TokenType.NUMBER, code.substring(numStart, numLength)); + } else if (expr.equals("\n") || expr.equals("\r")) { + currentLine++; + } + + index++; + } + + return new Token(TokenType.EOF); + } + + public void step() { + lastStep = index; + lastStepLine = currentLine; + } + + public TokenPosition getPosition() { + return new TokenPosition(lastStepLine, currentLine, lastStep, index); + } + + public String getStringAt(String str, int i) { + return str.substring(i, i + 1); + } + + public String getStringAt(int i) { + return code.substring(i, i + 1); + } +} diff --git a/src/main/java/com/phoshp/molang/parser/tokenizer/TokenPosition.java b/src/main/java/com/phoshp/molang/parser/tokenizer/TokenPosition.java new file mode 100644 index 0000000..be95033 --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/tokenizer/TokenPosition.java @@ -0,0 +1,14 @@ +package com.phoshp.molang.parser.tokenizer; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class TokenPosition { + + private int startLineNumber; + private int endLineNumber; + private int startColumn; + private int endColumn; +} diff --git a/src/main/java/com/phoshp/molang/parser/tokenizer/TokenType.java b/src/main/java/com/phoshp/molang/parser/tokenizer/TokenType.java new file mode 100644 index 0000000..7e2080e --- /dev/null +++ b/src/main/java/com/phoshp/molang/parser/tokenizer/TokenType.java @@ -0,0 +1,64 @@ +package com.phoshp.molang.parser.tokenizer; + +public enum TokenType { + EQUALS("=="), + NOT_EQUALS("!="), + COALESCE("??"), + AND("&&"), + OR("||"), + GREATER_OR_EQUALS(">="), + SMALLER_OR_EQUALS("<="), + ARROW("->"), + + GREATER(">"), + SMALLER("<"), + BRACKET_LEFT("("), + BRACKET_RIGHT(")"), + ARRAY_LEFT("["), + ARRAY_RIGHT("]"), + CURLY_BRACKET_LEFT("{"), + CURLY_BRACKET_RIGHT("}"), + COMMA(","), + ASSIGN("="), + PLUS("+"), + MINUS("-"), + ASTERISK("*"), + SLASH("/"), + QUESTION("?"), + COLON(":"), + SEMICOLON(";"), + BANG("!"), + + RETURN("return"), + CONTINUE("continue"), + BREAK("break"), + FOR_EACH("for_each"), + LOOP("loop"), + THIS("this"), + TRUE("true"), + FALSE("false"), + STRING(""), + NUMBER(""), + NAME(""), + EOF(""); + + public final String symbol; + + TokenType(String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return symbol; + } + + public static TokenType bySymbol(String symbol) { + for (TokenType tokenType : TokenType.values()) { + if (tokenType.getSymbol().equals(symbol)) { + return tokenType; + } + } + + return null; + } +} diff --git a/src/test/java/com/phoshp/molang/ParseTest.java b/src/test/java/com/phoshp/molang/ParseTest.java new file mode 100644 index 0000000..9e53bcb --- /dev/null +++ b/src/test/java/com/phoshp/molang/ParseTest.java @@ -0,0 +1,56 @@ +package com.phoshp.molang; + +import com.google.gson.GsonBuilder; +import com.phoshp.molang.parser.Expression; +import com.phoshp.molang.parser.MoLangParser; +import com.phoshp.molang.parser.tokenizer.Token; +import com.phoshp.molang.parser.tokenizer.TokenIterator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +@DisplayName("Parse") +public class ParseTest { + + @Test + @DisplayName("Parse File 1") + public void parse1() throws IOException { + dumpExpressions("parse_test.txt"); + } + + @Test + @DisplayName("Parse File 2") + public void parse2() throws IOException { + dumpExpressions("parse_test2.txt"); + } + + public void dumpExpressions(String fileName) throws IOException { + String code = readFile(getClass().getClassLoader().getResourceAsStream(fileName)); + System.out.println("Raw Code: \n" + code); + + MoLangParser parser = new MoLangParser(new TokenIterator(code)); + System.out.println((new GsonBuilder()).setPrettyPrinting().create().toJson(parser.parse())); + } + + public static String readFile(InputStream inputStream) throws IOException { + return readFile(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + } + + private static String readFile(Reader reader) throws IOException { + try (BufferedReader br = new BufferedReader(reader)) { + String temp; + StringBuilder stringBuilder = new StringBuilder(); + temp = br.readLine(); + while (temp != null) { + if (stringBuilder.length() != 0) { + stringBuilder.append("\n"); + } + stringBuilder.append(temp); + temp = br.readLine(); + } + return stringBuilder.toString(); + } + } +} diff --git a/src/test/resources/parse_test.txt b/src/test/resources/parse_test.txt new file mode 100644 index 0000000..f2b16dd --- /dev/null +++ b/src/test/resources/parse_test.txt @@ -0,0 +1,21 @@ +v.x = 1; +v.y = 1; +loop(10, { + t.x = v.x + v.y; + v.x = v.y; + v.y = t.x; +}); + +(v.moo > 0) ? { + v.x = math.sin(q.life_time * 45); + v.x = v.x * v.x + 17.3; + t.sin_x = math.sin(v.x); + v.x = t.sin_x * t.sin_x + v.x * v.x; + v.x = math.sqrt(v.x) * v.x * math.pi; +}; + +v.x = 0; +for_each(v.pig, query.get_nearby_entities(4, 'minecraft:pig'), { + v.x = v.x + v.pig->query.get_relative_block_state(0, 1, 0, 'flammable'); + v.a = v.x->v.z; +}); \ No newline at end of file diff --git a/src/test/resources/parse_test2.txt b/src/test/resources/parse_test2.txt new file mode 100644 index 0000000..1450b7b --- /dev/null +++ b/src/test/resources/parse_test2.txt @@ -0,0 +1 @@ +v.a = query.is_sleeping ? geometry.my_sleeping_geo : array.my_geos[math.cos(query.anim_time * 12.3 + 41.9) * 10 + 0.6]; \ No newline at end of file