From 25563254b387afb8a26b45cc1e2b45f25daefc90 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Wed, 19 Jul 2023 15:35:03 +0200 Subject: [PATCH] Initial Node & update 'multiple' system --- .../peeratcode/parser/java/JavaParser.java | 110 +++++++++--------- .../parser/state/BuilderStateTree.java | 19 ++- .../parser/state/InitialStateTree.java | 44 +++++++ test/GlobalCover.java | 1 + 4 files changed, 111 insertions(+), 63 deletions(-) create mode 100644 src/be/jeffcheasey88/peeratcode/parser/state/InitialStateTree.java diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index 0ac8a2c..c164893 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -14,10 +14,11 @@ import be.jeffcheasey88.peeratcode.parser.Token; import be.jeffcheasey88.peeratcode.parser.TokenType; import be.jeffcheasey88.peeratcode.parser.Tokenizer; import be.jeffcheasey88.peeratcode.parser.state.BuilderStateTree; +import be.jeffcheasey88.peeratcode.parser.state.InitialStateTree; import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree; import be.jeffcheasey88.peeratcode.parser.state.StateTree; -public class JavaParser extends Parser { +public class JavaParser extends Parser { public static long time; @@ -31,8 +32,8 @@ public class JavaParser extends Parser { time = System.currentTimeMillis(); - Parser parser = new JavaParser(); - JavaFile jFile = new JavaFile(); + Parser parser = new JavaParser(); + JavaElement jFile = new JavaElement(); parser.parse(reader, jFile); System.out.println((System.currentTimeMillis()-time)+"ms"); @@ -54,7 +55,7 @@ public class JavaParser extends Parser { //- Package //MODIFIER - StateTree modifier = new StateTree(); + StateTree modifier = new StateTree(); modifier.then((validator) -> { boolean mod = false; while(validator.validate( @@ -68,22 +69,22 @@ public class JavaParser extends Parser { }).end((a,b) -> a); //TYPE - StateTree type = new StateTree(); - StateTree type_ = type.then((validator) -> + StateTree type = new StateTree(); + StateTree type_ = type.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set(token))); - StateTree type_generic_begin = type_.then((validator) -> validator.validate( + 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) -> + 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( + 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( + StateTree type_generic_end = type_generic_name.then((validator) -> validator.validate( (token) -> token.getValue().equals(">"), (bag, token) -> bag.set(bag.get().concat(token)))).loop(); @@ -95,8 +96,8 @@ public class JavaParser extends Parser { type_generic_end.end((a,b) -> a); //VALUE - StateTree value = new StateTree<>(); - StateTree value_name = value.then((validator) -> validator.validate( + StateTree value = new StateTree<>(); + StateTree value_name = value.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> { Token current = bag.get(); @@ -105,13 +106,13 @@ public class JavaParser extends Parser { bag.set(current); })); value_name.end((a,b) -> a); - StateTree value_call = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))); + StateTree value_call = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))); value_call.then(value_name); - 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(")"))); + 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_arg = value_arg_begin.then(new RedirectStateTree<>(value, (global, local) -> { + 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); @@ -148,61 +149,64 @@ public class JavaParser extends Parser { }).end((a,b) -> a); //VARIABLE - StateTree variable = new StateTree<>(); - StateTree variable_mod = variable.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); - StateTree variable_type = variable.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local))); + StateTree variable = new StateTree<>(); + StateTree variable_mod = variable.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + StateTree variable_type = variable.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local))); variable_mod.then(variable_type); - StateTree variable_name = variable_type.then((validator) -> validator.validate( + StateTree variable_name = variable_type.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set(token))); variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> new Variable(b)); - StateTree variable_split = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); + 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("="))) + StateTree variable_value = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) .then(new RedirectStateTree<>(value, (global, local) -> global.set("value", local))); variable_value.then(variable_split); variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); + StateTree function_container = new StateTree<>(); + //FUNCTION - StateTree function = new StateTree<>(); - StateTree function_mod = function.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); - StateTree function_type = function.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local))); + StateTree function = new StateTree<>(); + StateTree function_mod = function.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + StateTree function_type = function.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local))); function_mod.then(function_type); - function.then((validator) -> validator.validate((token) -> token.getValue().equals("static"))).end((a,b) -> a); - StateTree function_name = function_type.then((validator) -> validator.validate( + function.then((validator) -> validator.validate((token) -> token.getValue().equals("static")) && validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a).multiple(function_container); + StateTree function_name = function_type.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (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(")"))); - function_end.end((a,b) -> a); + 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(")"))); + function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a).multiple(function_container); - StateTree function_throws = function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("throws"))) + StateTree function_throws = function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("throws"))) .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); - function_throws.end((a,b) -> a); + function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a).multiple(function_container); function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_throws); - 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))); + 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_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_arg_type); function_arg_name.then(function_end); - StateTree clazz_container = new StateTree<>(); + + StateTree clazz_container = new StateTree<>(); clazz_container.then(variable); clazz_container.then(function); //CLASS - StateTree clazz_ = new StateTree<>(); - StateTree clazz = new StateTree<>(); + StateTree clazz_ = new StateTree<>(); + StateTree clazz = new StateTree<>(); - StateTree clazz_base = clazz.then((validator) -> validator.validate((token) -> token.getValue().equals("class"))) + 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((javafile, bag) -> new Class(bag)).multiple(clazz_container); - 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) -> { + .end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container); + 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"); if(token == null) token = local.get(); else token = token.concat(local.get()); @@ -210,19 +214,19 @@ 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((javafile, bag) -> new Class(bag)).multiple(clazz_container); - StateTree clazz_extend = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) + .end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container); + StateTree clazz_extend = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local))); clazz_extend.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((javafile, bag) -> new Class(bag)).multiple(clazz_container); + .end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container); clazz_extend.then(clazz_implement); - StateTree clazz_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + StateTree clazz_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); clazz_mod.then(clazz); //IMPORT - StateTree importState = new StateTree<>(); + StateTree importState = new StateTree<>(); importState.then((validator) -> { if(validator.validate( (token) -> token.getValue().equals("import"), @@ -240,13 +244,13 @@ public class JavaParser extends Parser { return validator.validate((token) -> token.getValue().equals(";")); } return false; - }).end((javafile, bag) -> javafile.addImport(bag)); + }).end((javafile, bag) -> javafile); - StateTree main = new StateTree<>(); + InitialStateTree main = new InitialStateTree<>(); //PACKAGE - BuilderStateTree pack = main.then((validator) -> { + StateTree pack = main.then((validator) -> { if(validator.validate( (token) -> token.getValue().equals("package"), (bag, token) -> bag.set(new LinkedList<>()))){ @@ -255,13 +259,13 @@ public class JavaParser extends Parser { (token) -> !token.getValue().equals(";"), (bag, token) -> bag.>get().add(token)) ); - return validator.validate((token) -> token.getValue().equals(";")); } return false; - }).end((javafile, bag) -> javafile.setPackage(bag)); - pack.multiple(importState); - pack.multiple(clazz_); + }).end((javafile, bag) -> javafile); + main.multiple(pack); + main.multiple(importState); + main.multiple(clazz_); System.out.println((System.currentTimeMillis()-time)+"ms"); diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java index 7853380..9ff88e0 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java @@ -13,7 +13,7 @@ public class BuilderStateTree extends StateTree{ private BiFunction builder; private List> childs; - private List> multiple; + private List> multiple; public BuilderStateTree(BiFunction builder){ super(); @@ -30,24 +30,23 @@ public class BuilderStateTree extends StateTree{ BuilderStateTree builded = super.internalSeed(validator, build); if(builded != null) builded.build(validator, build); - BuilderStateTree sub_builded; - - for(StateTree state : this.multiple){ + for(StateTree state : this.multiple){ TokenValidator branch = validator.branch(); if(state.checker == null){ - while((sub_builded = state.internalSeed(branch, element)) != null){ + while((builded = state.internalSeed(branch, build)) != null){ validator.merge(branch); - sub_builded.build(validator, element); + builded.build(validator, build); } }else{ while(state.checker.apply(branch)){ - sub_builded = state.internalSeed(branch, element); - if(sub_builded == null) break; + builded = state.internalSeed(branch, build); + if(builded == null) break; validator.merge(branch); - sub_builded.build(validator, element); + builded.build(validator, build); } } } + BuilderStateTree sub_builded; for(StateTree child : this.childs){ TokenValidator branch = validator.branch(); if(child.checker == null){ @@ -81,7 +80,7 @@ public class BuilderStateTree extends StateTree{ return state; } - public > StateTree multiple(StateTree child){ + public > StateTree multiple(StateTree child){ this.multiple.add(child); return child; } diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/InitialStateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/InitialStateTree.java new file mode 100644 index 0000000..b427335 --- /dev/null +++ b/src/be/jeffcheasey88/peeratcode/parser/state/InitialStateTree.java @@ -0,0 +1,44 @@ +package be.jeffcheasey88.peeratcode.parser.state; + +import java.util.ArrayList; +import java.util.List; + +import be.jeffcheasey88.peeratcode.parser.TokenValidator; + +public class InitialStateTree extends StateTree{ + + private List> multiple; + + public InitialStateTree(){ + super(); + + this.multiple = new ArrayList<>(); + } + + @Override + BuilderStateTree internalSeed(TokenValidator validator, E element){ + BuilderStateTree builded; + for(StateTree state : this.multiple){ + TokenValidator branch = validator.branch(); + if(state.checker == null){ + while((builded = state.internalSeed(branch, element)) != null){ + validator.merge(branch); + builded.build(validator, element); + } + }else{ + while(state.checker.apply(branch)){ + builded = state.internalSeed(branch, element); + if(builded == null) break; + validator.merge(branch); + builded.build(validator, element); + } + } + } + return super.internalSeed(validator, element); + } + + public > StateTree multiple(StateTree child){ + this.multiple.add(child); + return child; + } +} diff --git a/test/GlobalCover.java b/test/GlobalCover.java index 241742c..67dacc5 100644 --- a/test/GlobalCover.java +++ b/test/GlobalCover.java @@ -32,6 +32,7 @@ class GlobalCover { parser.parse(new BufferedReader(new FileReader(file)), new JavaFile()); validated += TokenValidator.MAX_VALIDATE; tokens += TokenValidator.TOKENS; + System.out.println(file+" "+validated+" / "+tokens); TokenValidator.MAX_VALIDATE = 0; TokenValidator.TOKENS = 0; count++;