From 477ebf082d27654a35dec394a511d41386ec59cf Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Wed, 26 Jul 2023 15:44:40 +0200 Subject: [PATCH] AutoTest -> 63.115% --- .../peeratcode/parser/java/JavaParser.java | 193 ++++++++++++++---- .../parser/state/BuilderStateTree.java | 13 +- 2 files changed, 161 insertions(+), 45 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index cda7b57..7de128a 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -78,11 +78,15 @@ public class JavaParser extends Parser { //- Modifier //- Type //- Value + //- Enum Value //- Annotation //- Operation //- Variable //- Function //- Class + //- Interface + //- Enum + //- Annotation Clazz //- Import //- Package @@ -107,34 +111,31 @@ public class JavaParser extends Parser { validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set(token))); - StateTree type_generic_begin = type_.then((validator) -> validator.validate( - (token) -> token.getValue().equals("<"), - (bag, token) -> bag.set(bag.get().concat(token)))); - StateTree type_generic_name = type_generic_begin.then((validator) -> - validator.validate( - (token) -> token.getType().equals(TokenType.NAME), - (bag, token) -> bag.set(token))); - StateTree type_generic_split = type_generic_name.then((validator) -> validator.validate( - (token) -> token.getValue().equals(","), - (bag, token) -> bag.set(bag.get().concat(token)))); - StateTree type_generic_end = type_generic_name.then((validator) -> validator.validate( - (token) -> token.getValue().equals(">"), - (bag, token) -> bag.set(bag.get().concat(token)))).loop(); - StateTree type_array_begin = type_.then((validator) -> validator.validate((token) -> token.getValue().equals("["))); - StateTree type_array_end = type_array_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("]"))); + StateTree type_begin = type_.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))); + StateTree type_generic = type_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); + StateTree type_generic_end = type_generic.then((validator) -> validator.validate((token) -> token.getValue().equals(">"))); + StateTree type_generic_split = type_generic.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); + type_generic_split.then(type_generic); + + type_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("?"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) + .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) + .then(type_generic_end); + + type_begin.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) + .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) + .then(type_generic_end); type_.end((a,b) -> a); - type_generic_name.then(type_array_begin); - type_generic_split.then(type_generic_name); type_generic_end.end((a,b) -> a); - type_generic_end.then(type_generic_name); - type_generic_end.then(type_generic_split); + + StateTree type_array_begin = type_.then((validator) -> validator.validate((token) -> token.getValue().equals("["))); + StateTree type_array_end = type_array_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("]"))); type_generic_end.then(type_array_begin); - type_array_end.end((a,b) -> a); type_array_end.then(type_array_begin); - type_array_end.then(type_generic_split); - type_array_end.then(type_array_end); - type_array_end.then(type_generic_end); + type_array_end.end((a,b) -> a); + StateTree clazz_container = new StateTree<>(); @@ -142,6 +143,10 @@ public class JavaParser extends Parser { StateTree value = new StateTree<>(); StateTree value_container = new StateTree<>(); + value_container.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(")"))) + .end((a,b) -> a); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("!"))).then(value_container); StateTree value_left = value_container.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); value_left.end((a,b) -> a); @@ -156,6 +161,27 @@ public class JavaParser extends Parser { 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); 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); + 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); + value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("~"))).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_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.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_instance = value.then((validator) -> validator.validate((token) -> token.getValue().equals("new"))); StateTree value_name = new StateTree(); @@ -245,9 +271,23 @@ public class JavaParser extends Parser { return false; }).end((a,b) -> a); + //ENUM VALUE + StateTree enum_value = new StateTree<>(); + StateTree enum_name = enum_value.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + enum_name.end((a,b) -> a); + StateTree enum_arg = enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))) + .then(new RedirectStateTree<>(value_container, (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(",")) || validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); + enum_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(enum_arg); + //ANNOTATION StateTree annotation = new StateTree<>(); - StateTree annotation_name = annotation.then((validator) -> validator.validate((token) -> token.getValue().equals("@"))) + StateTree annotation_name = annotation.then((validator) -> + validator.validate((token) -> token.getValue().equals("@")) && + !validator.validate((token) -> token.getValue().equals("interface"))) .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))).then(annotation_name); annotation_name.end((a,b) -> a); @@ -315,19 +355,34 @@ public class JavaParser extends Parser { operation_if.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) .multiple(function_container) - .then((validator) -> validator.validate((token) -> token.getValue().equals("}"))) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) .end((a,b) -> a); - operation.then((validator) -> validator.validate((token) -> token.getValue().equals("for"))) + StateTree operation_for = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("for"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree operation_for_init = operation_for.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + StateTree operation_foreach = operation_for_init.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(")"))); + operation_foreach.end((a,b) -> a); + operation_foreach.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) + .end((a,b) -> a); + + + 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((validator) -> validator.validate((token) -> token.getValue().equals(")"))) - .end((a,b) -> a); - 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((validator) -> validator.validate((token) -> token.getValue().equals(")"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + operation_while.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) .end((a,b) -> a); + 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(null))) @@ -371,9 +426,11 @@ public class JavaParser extends Parser { (bag, token) -> bag.set(token))); StateTree function_begin = function_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree function_end = function_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - BuilderStateTree function_start = function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a); - function_start.multiple(function_container); - function_start.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + function_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); StateTree function_throws = function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("throws"))) .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); @@ -381,10 +438,16 @@ public class JavaParser extends Parser { function_start_throws.multiple(function_container); function_start_throws.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_throws); + function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); StateTree function_arg_type = function_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); StateTree function_arg_name = function_arg_type.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + function_arg_type.then((validator) -> + validator.validate((token) -> token.getValue().equals(".")) && + validator.validate((token) -> token.getValue().equals(".")) && + validator.validate((token) -> token.getValue().equals("."))) + .then(function_arg_name); function_arg_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_arg_type); function_arg_name.then(function_end); @@ -399,7 +462,10 @@ public class JavaParser extends Parser { StateTree clazz_base = clazz.then((validator) -> validator.validate((token) -> token.getValue().equals("class"))) .then(new RedirectStateTree<>(type, (global, local) -> global.set("name", local.get()))); clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container); + .end((JavaElement, bag) -> new Class(bag)) + .multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) + .end((a,b) -> a); StateTree clazz_implement = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("implements"))); StateTree clazz_implement_name = clazz_implement.then(new RedirectStateTree<>(type, (global, local) -> { Token token = global.get("implement"); @@ -409,17 +475,66 @@ public class JavaParser extends Parser { })); clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(clazz_implement_name); clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container); + .end((JavaElement, bag) -> new Class(bag)) + .multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) + .end((a,b) -> a); StateTree clazz_extend = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local.get()))); clazz_extend.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container); + .end((JavaElement, bag) -> new Class(bag)) + .multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) + .end((a,b) -> a); clazz_extend.then(clazz_implement); StateTree clazz_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + clazz_.then(clazz); clazz_mod.then(clazz); + //INTERFACE + StateTree interfaces = new StateTree<>(); + StateTree interface_base = interfaces.then((validator) -> validator.validate((token) -> token.getValue().equals("interface"))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + interface_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + + StateTree interface_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + clazz_.then(interfaces); + interface_mod.then(interfaces); + + //ENUM + StateTree enums = new StateTree<>(); + StateTree enum_base = enums.then((validator) -> validator.validate((token) -> token.getValue().equals("enum"))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + enum_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(enum_value) + .multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + + StateTree enum_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + clazz_.then(enums); + enum_mod.then(enums); + + //ANNOTATION CLAZZ + StateTree def_annos = new StateTree<>(); + StateTree def_anno_base = def_annos.then((validator) -> + validator.validate((token) -> token.getValue().equals("@")) && + validator.validate((token) -> token.getValue().equals("interface"))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + def_anno_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + + StateTree def_anno_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + clazz_.then(def_annos); + def_anno_mod.then(def_annos); + //IMPORT StateTree importState = new StateTree<>(); importState.then((validator) -> { @@ -489,7 +604,7 @@ public class JavaParser extends Parser { } public static void main(String[] args) throws Exception{ - File file = new File("C:\\Users\\jeffc\\eclipse-workspace\\AdminSys\\src\\be\\lhoistxavier\\Main.java"); + File file = new File("C:\\Users\\jeffc\\eclipse-workspace\\adventofcode\\src\\be\\jeffcheasey88\\Main.java"); BufferedReader reader = new BufferedReader(new FileReader(file)); diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java index 810f347..d482ebe 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java @@ -100,25 +100,26 @@ public class BuilderStateTree extends StateTree{ return state; } - public > StateTree multiple(StateTree child){ + public > BuilderStateTree multiple(StateTree child){ this.multiple.add(child); - return child; + return this; } - public > StateTree multiple(Function checker){ + public > BuilderStateTree multiple(Function checker){ StateTree state = new StateTree<>(); state.checker = checker; return multiple(state); } - public > StateTree unique(StateTree child){ + public > BuilderStateTree unique(StateTree child){ this.unique.add(child); - return child; + return this; } public > StateTree unique(Function checker){ StateTree state = new StateTree<>(); state.checker = checker; - return unique(state); + unique(state); + return state; } }