From a6f90a2c3ef712910a105b05f0d44e1638692e5a Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Tue, 12 Sep 2023 21:40:44 +0200 Subject: [PATCH] [Build] Values --- .../peeratcode/parser/java/JavaParser.java | 175 ++++++++------ .../peeratcode/parser/java/Value.java | 30 ++- .../peeratcode/parser/java/ValueTests.java | 224 ++++++++++++++++++ 3 files changed, 349 insertions(+), 80 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index 3b30bdb..2279d69 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -18,6 +18,7 @@ import be.jeffcheasey88.peeratcode.parser.Token; import be.jeffcheasey88.peeratcode.parser.TokenType; import be.jeffcheasey88.peeratcode.parser.TokenValidator; import be.jeffcheasey88.peeratcode.parser.Tokenizer; +import be.jeffcheasey88.peeratcode.parser.java.Value.BiValue; import be.jeffcheasey88.peeratcode.parser.state.BuilderStateTree; import be.jeffcheasey88.peeratcode.parser.state.InitialStateTree; import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree; @@ -165,13 +166,32 @@ public class JavaParser extends Parser { function_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); //VALUE + BiFunction value_builder = (parent, bag) -> { + if(bag.has("right")){ + BiValue result = new BiValue(bag.get("left"), bag.get("action"), bag.get("right")); + bag.set(result); + } + return null; + }; + + BiConsumer value_right = (global, local) -> { + global.set("right", local.get("left")); + }; + StateTree value = new StateTree<>(); StateTree value_container = new StateTree<>(); StateTree value_list = new StateTree<>(); - StateTree value_list_element = value_list.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); - value_list_element.end((a,b) -> a); + StateTree value_list_element = value_list.then(new RedirectStateTree<>(value_container, (global, local) -> { + List list = global.get(); + if(list == null){ + list = new ArrayList<>(); + global.set(list); + } + list.add(local.get()); + })); + value_list_element.end(); value_list_element.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) .then(value_list_element); @@ -184,8 +204,12 @@ public class JavaParser extends Parser { .end((a,b) -> a) .multiple(braces_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); - value_name = value_name.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); - value_name.end((a,b) -> a); + value_name = value_name.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(local.get()))); + value_name.end((parent,bag) -> { + Value result = new Value(bag.get()); + bag.set(result); + return null; + }); value_name.then((validator) -> validator.validate((token) -> token.getValue().equals(":")) && validator.validate((token) -> token.getValue().equals(":"))) .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) @@ -233,7 +257,7 @@ public class JavaParser extends Parser { StateTree value_left = new StateTree<>(); StateTree value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); - StateTree value_cast = value_parenthesis.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) + StateTree value_cast = value_parenthesis.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); value_cast.then(value_left); @@ -250,9 +274,9 @@ public class JavaParser extends Parser { .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); value_lambda.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_lambda_arg.then(value_lambda); - StateTree value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + StateTree value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("left", local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - value_parenthesis_end.end((a,b) -> a); + value_parenthesis_end.end(); value_parenthesis_end.then((v) -> v.validate((t) -> { return false; })); @@ -262,59 +286,59 @@ public class JavaParser extends Parser { value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("-"))).then(value_container); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))).then(value_container); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("~"))).then(value_container); - StateTree value_inside = value_container.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); + StateTree value_inside = value_container.then(new RedirectStateTree<>(value, (global, local) -> global.set("left", local.get()))); value_inside.then((validator) -> validator.validate((token) -> token.getValue().equals("["))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals("]"))) .then(value_left); value_inside.then(value_left); - value_left.end((a,b) -> a); - StateTree value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="))); - value_equals.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_equals.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - StateTree value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))).loop(); - value_minus.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - StateTree value_max = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals(">"))).loop(); - value_max.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_max.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("!")) && validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - StateTree value_or = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("|"))); - value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("|"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_or.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - StateTree value_and = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("&"))); - value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("&"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_and.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - StateTree value_plus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))); - value_plus.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))).end((a,b) -> a); - StateTree value_min = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("-"))); - value_min.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("-"))).end((a,b) -> a); - StateTree value_div = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("/"))); - value_div.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_div.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - StateTree value_mod = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("%"))); - value_mod.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_mod.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - StateTree value_xor = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("^"))); - value_xor.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_xor.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - StateTree value_mult = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("*"))); - value_mult.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); - value_mult.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + value_left.end(); + StateTree value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))); + value_equals.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_equals.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "=="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"), (bag, token) -> bag.set("action", "(value_container, value_right)).end(value_builder); + value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "(value_container, value_right)).end(value_builder); + StateTree value_max = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals(">"), (bag, token) -> bag.set("action", ">?"))).loop(); + value_max.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_max.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", ">?="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("!")) && validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "!="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_or = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("|"), (bag, token) -> bag.set("action", "|"))); + value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("|"), (bag, token) -> bag.set("action", "||"))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "|="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_or.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_and = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&"))); + value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&&"))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "&="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_and.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_plus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("+"), (bag, token) -> bag.set("action", "+"))); + value_plus.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "+="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("+"), (bag, token) -> bag.set("action", "++"))).end(value_builder); + StateTree value_min = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("-"), (bag, token) -> bag.set("action", "-"))); + value_min.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "-="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("-"), (bag, token) -> bag.set("action", "--"))).end(value_builder); + StateTree value_div = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("/"), (bag, token) -> bag.set("action", "/"))); + value_div.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_div.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "/="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_mod = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("%"), (bag, token) -> bag.set("action", "%"))); + value_mod.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_mod.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "%="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_xor = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("^"), (bag, token) -> bag.set("action", "^"))); + value_xor.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_xor.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "^="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_mult = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("*"), (bag, token) -> bag.set("action", "*"))); + value_mult.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_mult.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "*="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("?"))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(":"))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) - .end((a,b) -> a); - StateTree value_instanceof = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("instanceof"))) - .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); - value_instanceof.end((a,b) -> a); + .then(new RedirectStateTree<>(value_container, value_right)) + .then((validator) -> validator.validate((token) -> token.getValue().equals(":"), (bag, token) -> bag.set("action", "?:"))) + .then(new RedirectStateTree<>(value_container, value_right)) + .end(value_builder); + StateTree value_instanceof = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("instanceof"), (bag, token) -> bag.set("action", "instanceof"))) + .then(new RedirectStateTree<>(TypeTests.get(), value_right)); + value_instanceof.end(value_builder); value_instanceof.then(value_left); value.then((validator) -> { @@ -328,34 +352,29 @@ public class JavaParser extends Parser { && validator.validate((token) -> token.getValue().equals("'"))); } return false; - }).end((a,b) -> a); + }).end(); value.then((validator) -> { if(validator.validate((token) -> token.getValue().equals("\""))){ - - boolean escaped = true; - while(escaped){ - while(validator.validate( - (token) -> !token.getValue().equals("\""), - (bag, token) -> { - Token current = bag.get(); - if(current == null) current = token; - else current = current.concat(token); - bag.set(current); - })); - - if(validator.validate((token) -> token.getValue().equals("\""), (bag, token) -> { - Token current = bag.get(); - if(current == null) current = token; - else current = current.concat(token); - bag.set(current); - })){ - }else escaped = false; - } - - return validator.validate((token) -> token.getValue().equals("\"")); + while(validator.validate( + (token) -> !token.getValue().equals("\""), + (bag, token) -> { + Token current = bag.get(); + if(current == null) current = token; + else current = current.concat(token); + bag.set(current); + })); + return validator.validate((token) -> token.getValue().equals("\""), (bag, token) -> { + Token current = bag.get(); + if(current == null) current = token; + else current = current.concat(token); + bag.set(current); + }); } return false; - }).end((a,b) -> a); + }).end((parent,bag) -> { + bag.set(new Value(bag.get())); + return null; + }); braces_container.then(clazz_container); StateTree braces_array = braces_container.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/Value.java b/src/be/jeffcheasey88/peeratcode/parser/java/Value.java index 0494927..cf8546a 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/Value.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/Value.java @@ -7,7 +7,15 @@ public class Value extends JavaElement{ private Token token; private JavaElement content; - public Value(){} + Value(){} + + public Value(Token token){ + this.token = token; + } + + public Value(JavaElement content){ + this.content = content; + } public Token getToken(){ return this.token; @@ -17,21 +25,39 @@ public class Value extends JavaElement{ return this.content; } + @Override + public String toString(){ + return "Value[token="+token+", content="+content+"]"; + } + public static class BiValue extends Value{ private Value left; + private String action; private Value right; - public BiValue(){} + public BiValue(Value left, String action, Value right){ + this.left = left; + this.action = action; + this.right = right; + } public Value left(){ return left; } + public String getAction(){ + return this.action; + } + public Value right(){ return right; } + @Override + public String toString(){ + return left+" "+action+" "+right; + } } public static class TriValue extends Value{ diff --git a/test/be/jeffcheasey88/peeratcode/parser/java/ValueTests.java b/test/be/jeffcheasey88/peeratcode/parser/java/ValueTests.java index ae78b8f..eb6a9f8 100644 --- a/test/be/jeffcheasey88/peeratcode/parser/java/ValueTests.java +++ b/test/be/jeffcheasey88/peeratcode/parser/java/ValueTests.java @@ -2,16 +2,236 @@ package be.jeffcheasey88.peeratcode.parser.java; import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; + +import org.junit.jupiter.api.Test; + +import be.jeffcheasey88.peeratcode.parser.Bag; import be.jeffcheasey88.peeratcode.parser.Parser; +import be.jeffcheasey88.peeratcode.parser.Token; +import be.jeffcheasey88.peeratcode.parser.TokenType; import be.jeffcheasey88.peeratcode.parser.TokenValidator; +import be.jeffcheasey88.peeratcode.parser.java.Value.BiValue; +import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree; import be.jeffcheasey88.peeratcode.parser.state.StateTree; public class ValueTests { public static StateTree get(){ + BiFunction value_builder = (parent, bag) -> { + if(bag.has("right")){ + BiValue result = new BiValue(bag.get("left"), bag.get("action"), bag.get("right")); + bag.set(result); + } + return null; + }; + + BiConsumer value_right = (global, local) -> { + global.set("right", local.get("left")); + }; + + StateTree value = new StateTree<>(); + StateTree value_container = new StateTree<>(); + StateTree value_list = new StateTree<>(); + StateTree value_list_element = value_list.then(new RedirectStateTree<>(value_container, (global, local) -> { + List list = global.get(); + if(list == null){ + list = new ArrayList<>(); + global.set(list); + } + list.add(local.get()); + })); + value_list_element.end(); + value_list_element.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(value_list_element); + + StateTree value_instance = value.then((validator) -> validator.validate((token) -> token.getValue().equals("new"))); + StateTree value_name = new StateTree(); + value.then(value_name); + value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> global.set(null))) + .end((a,b) -> a) + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) +// .multiple(braces_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + value_name = value_name.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(local.get()))); + value_name.end((parent,bag) -> { + Value result = new Value(bag.get()); + bag.set(result); + return null; + }); + + value_name.then((validator) -> validator.validate((token) -> token.getValue().equals(":")) && validator.validate((token) -> token.getValue().equals(":"))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) + .end((a,b) -> a); + + StateTree value_call = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))); + value_call.end((a,b) -> a); + value_call.then(value_name); + StateTree value_array_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("["))); + StateTree value_array_end = value_array_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("]"))); + value_array_begin.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("inside", local))) + .then(value_array_end); + value_array_end.end((a,b) -> a) + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(value_list) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + value_array_end.then(value_call); + value_array_end.then(value_array_begin); + + StateTree value_arg_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree value_arg_end = value_arg_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + value_arg_end.end((a,b) -> a); + value_arg_end.then(value_call); + StateTree value_generic_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))); + StateTree value_generic_name = value_generic_begin.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + StateTree value_generic_split = value_generic_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); + StateTree value_generic_end = value_generic_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(">"))); + value_generic_end.then(value_arg_begin); + value_generic_end.then(value_generic_name); + value_generic_end.then(value_generic_split); + value_generic_name.then(value_generic_begin); + value_generic_name.then(value_generic_end); + value_generic_split.then(value_generic_name); + StateTree value_arg = value_arg_begin.then(new RedirectStateTree<>(value_container, (global, local) -> { + Integer count = global.get("args"); + if(count == null) count = 0; + global.set("arg"+count, local); + global.set("args", (count+1)); + })); + value_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(value_arg); + value_arg.then(value_arg_end); + + StateTree value_left = new StateTree<>(); + + StateTree value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree value_cast = value_parenthesis.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) + .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); + value_cast.then(value_left); + StateTree value_lambda_arg = value_parenthesis.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + value_lambda_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(value_lambda_arg); + StateTree value_lambda = value_parenthesis.then((validator) -> + validator.validate((token) -> token.getValue().equals(")")) && + validator.validate((token) -> token.getValue().equals("-")) && + validator.validate((token) -> token.getValue().equals(">"))); + value_lambda.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a).end((a,b) -> a) +// .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + value_lambda.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + value_lambda_arg.then(value_lambda); + StateTree value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("left", local.get()))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + value_parenthesis_end.end(); + value_parenthesis_end.then((v) -> v.validate((t) -> { + return false; + })); + value_parenthesis_end.then(value_call); + value_parenthesis_end.then(value_left); + value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("!"))).then(value_container); + value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("-"))).then(value_container); + value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))).then(value_container); + value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("~"))).then(value_container); + StateTree value_inside = value_container.then(new RedirectStateTree<>(value, (global, local) -> global.set("left", local.get()))); + value_inside.then((validator) -> validator.validate((token) -> token.getValue().equals("["))) + .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("]"))) + .then(value_left); + value_inside.then(value_left); + value_left.end(); + StateTree value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))); + value_equals.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_equals.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "=="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"), (bag, token) -> bag.set("action", "(value_container, value_right)).end(value_builder); + value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "(value_container, value_right)).end(value_builder); + StateTree value_max = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals(">"), (bag, token) -> bag.set("action", ">?"))).loop(); + value_max.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_max.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", ">?="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("!")) && validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "!="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_or = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("|"), (bag, token) -> bag.set("action", "|"))); + value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("|"), (bag, token) -> bag.set("action", "||"))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "|="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_or.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_and = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&"))); + value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&&"))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "&="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_and.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_plus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("+"), (bag, token) -> bag.set("action", "+"))); + value_plus.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "+="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("+"), (bag, token) -> bag.set("action", "++"))).end(value_builder); + StateTree value_min = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("-"), (bag, token) -> bag.set("action", "-"))); + value_min.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "-="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("-"), (bag, token) -> bag.set("action", "--"))).end(value_builder); + StateTree value_div = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("/"), (bag, token) -> bag.set("action", "/"))); + value_div.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_div.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "/="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_mod = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("%"), (bag, token) -> bag.set("action", "%"))); + value_mod.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_mod.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "%="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_xor = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("^"), (bag, token) -> bag.set("action", "^"))); + value_xor.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_xor.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "^="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + StateTree value_mult = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("*"), (bag, token) -> bag.set("action", "*"))); + value_mult.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_mult.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "*="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); + value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("?"))) + .then(new RedirectStateTree<>(value_container, value_right)) + .then((validator) -> validator.validate((token) -> token.getValue().equals(":"), (bag, token) -> bag.set("action", "?:"))) + .then(new RedirectStateTree<>(value_container, value_right)) + .end(value_builder); + StateTree value_instanceof = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("instanceof"), (bag, token) -> bag.set("action", "instanceof"))) + .then(new RedirectStateTree<>(TypeTests.get(), value_right)); + value_instanceof.end(value_builder); + value_instanceof.then(value_left); + + value.then((validator) -> { + if(validator.validate((token) -> token.getValue().equals("'"))){ + validator.validate((token) -> token.getValue().equals("\\")); + + return + validator.validate((token) -> token.getValue().equals("'")) + || + (validator.validate((token) -> !token.getValue().equals("'")) + && validator.validate((token) -> token.getValue().equals("'"))); + } + return false; + }).end(); + value.then((validator) -> { + if(validator.validate((token) -> token.getValue().equals("\""))){ + while(validator.validate( + (token) -> !token.getValue().equals("\""), + (bag, token) -> { + Token current = bag.get(); + if(current == null) current = token; + else current = current.concat(token); + bag.set(current); + })); + return validator.validate((token) -> token.getValue().equals("\""), (bag, token) -> { + Token current = bag.get(); + if(current == null) current = token; + else current = current.concat(token); + bag.set(current); + }); + } + return false; + }).end((parent,bag) -> { + bag.set(new Value(bag.get())); + return null; + }); + return value_container; } @@ -36,4 +256,8 @@ public class ValueTests { return result; } + @Test + void doubleInDouble() throws Exception{ + JavaElement result = testCase("(jeffcheasey88 == \"test\")"); + } }