From ab2ef0f3f1d050e9b57ecaeaa93a5fab4cb9d456 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:29:59 +0200 Subject: [PATCH] Debug + start value refractor --- src/dev/peerat/parser/Bag.java | 3 +- src/dev/peerat/parser/java/JavaParser.java | 600 +++++++++--------- .../parser/java/element/BaseElementTests.java | 2 +- .../java/element/value/TypeOfValuesTests.java | 25 + 4 files changed, 344 insertions(+), 286 deletions(-) diff --git a/src/dev/peerat/parser/Bag.java b/src/dev/peerat/parser/Bag.java index 7686998..f813c4d 100644 --- a/src/dev/peerat/parser/Bag.java +++ b/src/dev/peerat/parser/Bag.java @@ -38,6 +38,7 @@ public class Bag{ public void set(Object value){ this.value = value; + System.out.println("edit Bag "+this); } public E get(String key){ @@ -62,6 +63,6 @@ public class Bag{ String map = ""; for(Entry entry : this.map.entrySet()) map+=","+(entry.getKey())+" -> "+entry.getValue(); if(map.length() > 0) map = map.substring(1); - return "([bag] | value="+value+" | map["+Arrays.toString(this.map.keySet().toArray())+"]="+map+" )"; + return "([bag] "+(value != null ? "| value="+value+" ":"")+"| map["+Arrays.toString(this.map.keySet().toArray())+"]="+map+" )"; } } diff --git a/src/dev/peerat/parser/java/JavaParser.java b/src/dev/peerat/parser/java/JavaParser.java index 915b1e8..f7bcfbe 100644 --- a/src/dev/peerat/parser/java/JavaParser.java +++ b/src/dev/peerat/parser/java/JavaParser.java @@ -306,280 +306,64 @@ public class JavaParser extends Parser { //VALUE - BiFunction value_builder = (parent, bag) -> { - System.out.println("value_builder {"); - System.out.println("begin: "+bag); - if(bag.has("right")){ - - if(!(bag.get("left") instanceof Value)) bag.set("left", new StaticValue(bag.get("left"))); - if(!(bag.get("right") instanceof Value)) bag.set("right", new StaticValue(bag.get("right"))); - - BiValue result = new BiValue( - - bag.get("left"), - - bag.get("action"), - - bag.get("right")); - bag.set(result); + StateTree value = new StateTree<>(); + StateTree value_operation = new StateTree<>(); + + StateTree value_name = value.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set("current", token))); + value_name.end((parent, bag) -> { + bag.set(new StaticValue(bag.get("current"))); + return null; + }); + value_name.then(value_operation); + + value_operation.then((validator) -> validator.validate((token) -> token.getValue().equals(">"), (bag, token) -> bag.set("action", ">"))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set("right", local.get()))) + .end((parent, bag) -> { + if(bag.has("current")){ + bag.set(new BiValue(new StaticValue(bag.get("current")), bag.get("action"), bag.get("right"))); + }else { + bag.set(new BiValue(bag.get(), bag.get("action"), bag.get("right"))); + } + System.out.println("value_op "+bag); + return null; + }); + + value_operation.then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&&"))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set("right", local.get()))) + .end((parent, bag) -> { + if(bag.has("current")){ + bag.set(new BiValue(new StaticValue(bag.get("current")), bag.get("action"), bag.get("right"))); + }else { + bag.set(new BiValue(bag.get(), bag.get("action"), bag.get("right"))); } - System.out.println("end: "+bag); - System.out.println("}"); + System.out.println("value_op "+bag); return null; - }; + }); - BiConsumer value_right = (global, local) -> { - System.out.println("merge{"); - System.out.println("global: "+global); - System.out.println("local: "+local); - System.out.println("More than simple merge ? "+local.get().getClass()); - System.out.println("}"); - global.set("right", local.get("left")); - }; - - //STRING CONCAT - 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); + value_operation.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "=="))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set("right", local.get()))) + .end((parent, bag) -> { + if(bag.has("current")){ + bag.set(new BiValue(new StaticValue(bag.get("current")), bag.get("action"), bag.get("right"))); + }else { + bag.set(new BiValue(bag.get(), bag.get("action"), bag.get("right"))); } - list.add(local.get()); - })); - value_list_element.end(); - value_list_element.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) - .then(value_list_element); - - value.then((validator) -> validator.validate( - (token) -> token.getType().equals(TokenType.STRING) || token.getType().equals(TokenType.CHAR), - (bag, token) -> bag.set(token))) - .end((parent,bag) -> { - bag.set(new StaticValue(bag.get())); + System.out.println("value_op "+bag); return null; }); - StateTree value_instance = value.then((validator) -> validator.validate( - (token) -> token.getValue().equals("new"), - (bag, token) -> bag.set("newit", token))); - StateTree value_name = new StateTree(); - value.then(value_name); - value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> { - System.out.println(local.get()+""); - if(global.has("newit")) global.set(new InstanceValue(global.get("newit"), local.get().getToken(), local.get().getParameters())); - else global.set(local.get()); - })) - .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<>(type, (global, local) -> { - System.out.println("value_name {"); - System.out.println("global: "+global); - System.out.println("local: "+local); - System.out.println("}"); - if(global.get() == null) global.set(local.get()); - else global.set(global.get().concat(local.get())); + StateTree value_parenthesis = value.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree value_parenthesis_close = value_parenthesis.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + StateTree value_inside = value_parenthesis.then(new RedirectStateTree<>(value, (global, local) -> { + global.set(local.get()); + System.out.println("valide_inside "+global); })); - value_name.end((parent,bag) -> { - System.out.println("{value_name} "+bag); - Value result = new StaticValue(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("."), - (bag, token) -> { - Value prev = bag.get("prev"); - if(prev == null){ - bag.set("prev", new StaticValue(bag.get())); - }else{ - Integer paramters = bag.get("args"); - List list = null; - if(paramters != null){ - list = new ArrayList<>(); - for(int i = 0; i < paramters; i++) list.add(bag.get("arg"+i).get()); - bag.remove("args"); - } - MethodCallValue methodCall = new MethodCallValue(prev, bag.get("gen"), bag.get(), list); - bag.set("prev", methodCall); - bag.remove("gen"); - } - bag.set(new Token(token.getLineNumber(), token.getCharacterNumber(), "", TokenType.GROUP)); - })); - value_call.end((a,b) -> a); - value_call.then(new RedirectStateTree<>(gen, (global, local) -> global.set("gen", global.get().concat(local.get())))).then(value_name); - 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((parent,bag) -> { - //to change - bag.set(new MethodCallValue(null, null, bag.get(), null)); - return parent; - }) - .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("("), - (bag, token) -> bag.set(bag.get().concat(token)))); - StateTree value_arg_end = value_arg_begin.then((validator) -> validator.validate( - (token) -> token.getValue().equals(")"), - (bag, token) -> bag.set(bag.get().concat(token)))); - value_arg_end.end((parent,bag) -> { - Integer paramters = bag.get("args"); - List list = null; - if(paramters != null){ - list = new ArrayList<>(); - for(int i = 0; i < paramters; i++) list.add(bag.get("arg"+i).get()); - } - - MethodCallValue methodCall = new MethodCallValue(bag.get("prev"), bag.get("gen"), bag.get(), list); - bag.set(methodCall); - return null; - }); - value_arg_end.then(value_call); - value_arg_end.then(value_array_begin); - 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<>(type, (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,bag) -> { - bag.set(new LambdaValue(null, new ArrayList<>())); - return 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("in", local.get()))).end((a,bag) ->{ - bag.set(new LambdaValue(null, bag.get("in"))); - return 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(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()); - System.out.println("value_inside "+global); - })); - 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((parent, bag) -> { - System.out.println("value_left -> end "+bag); - if(bag.get("left") instanceof Value) bag.set(bag.get("left")); - else bag.set(new StaticValue(bag.get("left"))); - return null; - }); - 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", "<"))).loop(); - value_minus.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); - value_minus.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_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<>(type, value_right)); - value_instanceof.end(value_builder); - value_instanceof.then(value_left); - - braces_container.then(clazz_container); - StateTree braces_array = braces_container.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); - braces_array.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) - .then(braces_array); - braces_array.end((a,b) -> a); - + value_inside.then(value_parenthesis_close); + value_inside.then(value_operation); + value_parenthesis_close.end(); + value_parenthesis_close.then(value_operation); //ENUM VALUE @@ -589,7 +373,7 @@ public class JavaParser extends Parser { enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(enum_name); StateTree enum_arg = enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); StateTree enum_end = enum_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); enum_end.end((a,b) -> a); enum_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); @@ -645,7 +429,7 @@ public class JavaParser extends Parser { })); annotation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(annotation_var); annotation_value.then(annotation_end); - annotation_begin.then(new RedirectStateTree<>(value_container, (global, local) -> { + annotation_begin.then(new RedirectStateTree<>(value, (global, local) -> { Map map = global.get("values"); if(map == null){ map = new LinkedHashMap<>(); @@ -690,7 +474,7 @@ public class JavaParser extends Parser { StateTree variable_split = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); variable_split.then(variable_name); StateTree variable_value = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) - .then(new RedirectStateTree<>(value_container, (global, local) -> { + .then(new RedirectStateTree<>(value, (global, local) -> { global.>get("vars").put(global.get("last"), local.get()); })); variable_value.then(variable_split); @@ -701,12 +485,12 @@ public class JavaParser extends Parser { //OPERATION StateTree operation = new StateTree<>(); // operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) -// .then(new RedirectStateTree<>(value_container, (global, local) -> global.set("newer", local.get()))) +// .then(new RedirectStateTree<>(value, (global, local) -> global.set("newer", local.get()))) // .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) // .end((parent, bag) -> parent); StateTree operation_return = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("return"))); - operation_return.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))) + operation_return.then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((parent,bag) -> { ReturnOperation op = new ReturnOperation(bag.get()); @@ -722,7 +506,7 @@ public class JavaParser extends Parser { }); operation.then((validator) -> validator.validate((token) -> token.getValue().equals("throw"))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((parent,bag) -> { ThrowOperation op = new ThrowOperation(bag.get()); @@ -802,7 +586,7 @@ public class JavaParser extends Parser { System.out.println("inside IF"); return true; }) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .end((parent,bag) -> { System.out.println("if "+bag); @@ -819,7 +603,7 @@ public class JavaParser extends Parser { StateTree switch_cases = new StateTree<>(); StateTree switch_case_begin = switch_cases.then((validator) -> validator.validate((token) -> token.getValue().equals("case"))); - StateTree switch_case = switch_case_begin.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + StateTree switch_case = switch_case_begin.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(":"))); switch_case.then(switch_case_begin); switch_case.end((a,b) -> a) @@ -833,7 +617,7 @@ public class JavaParser extends Parser { operation.then((validator) -> validator.validate((token) -> token.getValue().equals("switch"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")")) && validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) @@ -858,7 +642,7 @@ public class JavaParser extends Parser { operation_for_type.then(operation_for_assign); StateTree operation_for_assign_end = operation_for_assign.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); operation_for_assign.then(operation_for_assign); operation_for_assign.then(operation_for_first_part); @@ -871,7 +655,7 @@ public class JavaParser extends Parser { StateTree operation_for_second_part = operation_for_first_part.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))); - operation_for_first_part.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + operation_for_first_part.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) .then(operation_for_second_part); StateTree operation_for_end = operation_for_second_part.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); @@ -893,17 +677,17 @@ public class JavaParser extends Parser { .end((a,b) -> a); operation_for_assign.then((validator) -> validator.validate((token) -> token.getValue().equals(":"))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) .then(operation_for_end); - StateTree operation_for_update = operation_for_second_part.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); + StateTree operation_for_update = operation_for_second_part.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); operation_for_update.then(operation_for_end); operation_for_update.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) .then(operation_for_update); StateTree operation_while = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("while"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); operation_while.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((parent,bag) -> { @@ -923,7 +707,7 @@ public class JavaParser extends Parser { operation.then((validator) -> validator.validate((token) -> token.getValue().equals("synchronized"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((parent,bag) -> { @@ -935,7 +719,7 @@ public class JavaParser extends Parser { .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) .end((a,b) -> a); - StateTree operation_name = operation.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))); + StateTree operation_name = operation.then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))); operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((parent,bag) -> { Value action = bag.get(); if(action instanceof BiValue){ @@ -958,7 +742,7 @@ public class JavaParser extends Parser { operation_end.then(operation_call); operation_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); - StateTree operation_value = operation_begin.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); + StateTree operation_value = operation_begin.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); operation_value.then(operation_end); operation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(operation_value); @@ -1010,7 +794,7 @@ public class JavaParser extends Parser { .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); function_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end(); function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("default"))) - .then(new RedirectStateTree<>(value_container, (global, local) -> System.out.println("TODO DEFAULT IN FUNCTION"))) + .then(new RedirectStateTree<>(value, (global, local) -> System.out.println("TODO DEFAULT IN FUNCTION"))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end(function_builder); @@ -1301,4 +1085,252 @@ public class JavaParser extends Parser { return 0; } + /* + + + StateTree value = new StateTree<>(); + + StateTree value_list = new StateTree<>(); + StateTree value_list_element = value_list.then(new RedirectStateTree<>(value, (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); + + value.then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.STRING) || token.getType().equals(TokenType.CHAR), + (bag, token) -> bag.set(token))) + .end((parent,bag) -> { + bag.set(new StaticValue(bag.get())); + return null; + }); + + StateTree value_instance = value.then((validator) -> validator.validate( + (token) -> token.getValue().equals("new"), + (bag, token) -> bag.set("newit", token))); + StateTree value_name = new StateTree(); + value.then(value_name); + value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> { + System.out.println(local.get()+""); + if(global.has("newit")) global.set(new InstanceValue(global.get("newit"), local.get().getToken(), local.get().getParameters())); + else global.set(local.get()); + })) + .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<>(type, (global, local) -> { + System.out.println("value_name {"); + System.out.println("global: "+global); + System.out.println("local: "+local); + System.out.println("}"); + if(global.get() == null) global.set(local.get()); + else global.set(global.get().concat(local.get())); + })); + value_name.end((parent,bag) -> { + System.out.println("{value_name} "+bag); + Value result = new StaticValue(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("."), + (bag, token) -> { + Value prev = bag.get("prev"); + if(prev == null){ + bag.set("prev", new StaticValue(bag.get())); + }else{ + Integer paramters = bag.get("args"); + List list = null; + if(paramters != null){ + list = new ArrayList<>(); + for(int i = 0; i < paramters; i++) list.add(bag.get("arg"+i).get()); + bag.remove("args"); + } + MethodCallValue methodCall = new MethodCallValue(prev, bag.get("gen"), bag.get(), list); + bag.set("prev", methodCall); + bag.remove("gen"); + } + bag.set(new Token(token.getLineNumber(), token.getCharacterNumber(), "", TokenType.GROUP)); + })); + value_call.end((a,b) -> a); + value_call.then(new RedirectStateTree<>(gen, (global, local) -> global.set("gen", global.get().concat(local.get())))).then(value_name); + 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, (global, local) -> global.set("inside", local))) + .then(value_array_end); + value_array_end.end((parent,bag) -> { + //to change + bag.set(new MethodCallValue(null, null, bag.get(), null)); + return parent; + }) + .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("("), + (bag, token) -> bag.set(bag.get().concat(token)))); + StateTree value_arg_end = value_arg_begin.then((validator) -> validator.validate( + (token) -> token.getValue().equals(")"), + (bag, token) -> bag.set(bag.get().concat(token)))); + value_arg_end.end((parent,bag) -> { + Integer paramters = bag.get("args"); + List list = null; + if(paramters != null){ + list = new ArrayList<>(); + for(int i = 0; i < paramters; i++) list.add(bag.get("arg"+i).get()); + } + + MethodCallValue methodCall = new MethodCallValue(bag.get("prev"), bag.get("gen"), bag.get(), list); + bag.set(methodCall); + return null; + }); + value_arg_end.then(value_call); + value_arg_end.then(value_array_begin); + 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, (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.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree value_cast = value_parenthesis.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) + .then(new RedirectStateTree<>(value, (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,bag) -> { + bag.set(new LambdaValue(null, new ArrayList<>())); + return a; + }) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + value_lambda.then(new RedirectStateTree<>(value, (global, local) -> global.set("in", local.get()))).end((a,bag) ->{ + bag.set(new LambdaValue(null, bag.get("in"))); + return a; + }); + value_lambda_arg.then(value_lambda); + StateTree value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value, (global, local) -> global.set("left", local.get()))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + value_parenthesis_end.end(); + value_parenthesis_end.then(value_call); + value_parenthesis_end.then(value_left); + value.then((validator) -> validator.validate((token) -> token.getValue().equals("!"))).then(value); + value.then((validator) -> validator.validate((token) -> token.getValue().equals("-"))).then(value); + value.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))).then(value); + value.then((validator) -> validator.validate((token) -> token.getValue().equals("~"))).then(value); + StateTree value_inside = value.then(new RedirectStateTree<>(value, (global, local) -> { + global.set("left", local.get()); + System.out.println("value_inside "+global); + })); + value_inside.then((validator) -> validator.validate((token) -> token.getValue().equals("["))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("]"))) + .then(value_left); + value_inside.then(value_left); + value_left.end((parent, bag) -> { + System.out.println("value_left -> end "+bag); + if(bag.get("left") instanceof Value) bag.set(bag.get("left")); + else bag.set(new StaticValue(bag.get("left"))); + return null; + }); + StateTree value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))); + value_equals.then(new RedirectStateTree<>(value, value_right)).end(value_builder); + value_equals.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "=="))).then(new RedirectStateTree<>(value, value_right)).end(value_builder); + StateTree value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"), (bag, token) -> bag.set("action", "<"))).loop(); + value_minus.then(new RedirectStateTree<>(value, value_right)).end(value_builder); + value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "<="))).then(new RedirectStateTree<>(value, 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, value_right)).end(value_builder); + value_max.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", ">="))).then(new RedirectStateTree<>(value, 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, 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, value_right)).end(value_builder); + value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "|="))).then(new RedirectStateTree<>(value, value_right)).end(value_builder); + value_or.then(new RedirectStateTree<>(value, 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, value_right)).end(value_builder); + value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "&="))).then(new RedirectStateTree<>(value, value_right)).end(value_builder); + value_and.then(new RedirectStateTree<>(value, 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, value_right)).end(value_builder); + value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "+="))).then(new RedirectStateTree<>(value, 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, value_right)).end(value_builder); + value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "-="))).then(new RedirectStateTree<>(value, 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, value_right)).end(value_builder); + value_div.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "/="))).then(new RedirectStateTree<>(value, 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, value_right)).end(value_builder); + value_mod.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "%="))).then(new RedirectStateTree<>(value, 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, value_right)).end(value_builder); + value_xor.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "^="))).then(new RedirectStateTree<>(value, 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, value_right)).end(value_builder); + value_mult.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "*="))).then(new RedirectStateTree<>(value, value_right)).end(value_builder); + value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("?"))) + .then(new RedirectStateTree<>(value, value_right)) + .then((validator) -> validator.validate((token) -> token.getValue().equals(":"), (bag, token) -> bag.set("action", "?:"))) + .then(new RedirectStateTree<>(value, 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<>(type, value_right)); + value_instanceof.end(value_builder); + value_instanceof.then(value_left); + + braces_container.then(clazz_container); + StateTree braces_array = braces_container.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); + braces_array.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(braces_array); + braces_array.end((a,b) -> a); + + + + + */ + } diff --git a/test/dev/peerat/parser/java/element/BaseElementTests.java b/test/dev/peerat/parser/java/element/BaseElementTests.java index 3a5733d..e4672ba 100644 --- a/test/dev/peerat/parser/java/element/BaseElementTests.java +++ b/test/dev/peerat/parser/java/element/BaseElementTests.java @@ -50,7 +50,7 @@ public class BaseElementTests{ System.out.println("["+getClass().getSimpleName()+"] passed "+size+" tests"); }catch(Exception|AssertionError e){ System.err.println("["+getClass().getSimpleName()+"] failed "+text+" for cause "+e.getMessage()); - e.printStackTrace(); + throw new RuntimeException(e); } } diff --git a/test/dev/peerat/parser/java/element/value/TypeOfValuesTests.java b/test/dev/peerat/parser/java/element/value/TypeOfValuesTests.java index e54bb9b..5901c8d 100644 --- a/test/dev/peerat/parser/java/element/value/TypeOfValuesTests.java +++ b/test/dev/peerat/parser/java/element/value/TypeOfValuesTests.java @@ -71,6 +71,31 @@ public class TypeOfValuesTests extends BaseElementTests{ + " if(a && b == c){}" + "}" + "}", + (javafile) -> { + BiValue value = gotoValue(javafile); + printObject(value); + StaticValue left = (StaticValue) value.left(); + BiValue right = (BiValue) value.right(); + + StaticValue rightLeft = (StaticValue) right.left(); + StaticValue rightRight = (StaticValue) right.right(); + + assertToken("a", left.getToken()); + assertEquals("&&", value.getAction()); + assertToken("b", rightLeft.getToken()); + + assertEquals("==", right.getAction()); + assertToken("c", rightRight.getToken()); + }); + + register( + "package be.jeffcheasey88;" + + "" + + "public static class Test{ " + + " void test(){ " + + " if((a && b) == c){}" + + "}" + + "}", (javafile) -> { BiValue value = gotoValue(javafile); printObject(value);