Initial Node & update 'multiple' system

This commit is contained in:
jeffcheasey88 2023-07-19 15:35:03 +02:00
parent 4564f52c4c
commit 25563254b3
4 changed files with 111 additions and 63 deletions

View file

@ -14,10 +14,11 @@ import be.jeffcheasey88.peeratcode.parser.Token;
import be.jeffcheasey88.peeratcode.parser.TokenType; import be.jeffcheasey88.peeratcode.parser.TokenType;
import be.jeffcheasey88.peeratcode.parser.Tokenizer; import be.jeffcheasey88.peeratcode.parser.Tokenizer;
import be.jeffcheasey88.peeratcode.parser.state.BuilderStateTree; 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.RedirectStateTree;
import be.jeffcheasey88.peeratcode.parser.state.StateTree; import be.jeffcheasey88.peeratcode.parser.state.StateTree;
public class JavaParser extends Parser<JavaFile> { public class JavaParser extends Parser<JavaElement> {
public static long time; public static long time;
@ -31,8 +32,8 @@ public class JavaParser extends Parser<JavaFile> {
time = System.currentTimeMillis(); time = System.currentTimeMillis();
Parser<JavaFile> parser = new JavaParser(); Parser<JavaElement> parser = new JavaParser();
JavaFile jFile = new JavaFile(); JavaElement jFile = new JavaElement();
parser.parse(reader, jFile); parser.parse(reader, jFile);
System.out.println((System.currentTimeMillis()-time)+"ms"); System.out.println((System.currentTimeMillis()-time)+"ms");
@ -54,7 +55,7 @@ public class JavaParser extends Parser<JavaFile> {
//- Package //- Package
//MODIFIER //MODIFIER
StateTree<JavaFile> modifier = new StateTree<JavaFile>(); StateTree<JavaElement> modifier = new StateTree<JavaElement>();
modifier.then((validator) -> { modifier.then((validator) -> {
boolean mod = false; boolean mod = false;
while(validator.validate( while(validator.validate(
@ -68,22 +69,22 @@ public class JavaParser extends Parser<JavaFile> {
}).end((a,b) -> a); }).end((a,b) -> a);
//TYPE //TYPE
StateTree<JavaFile> type = new StateTree<JavaFile>(); StateTree<JavaElement> type = new StateTree<JavaElement>();
StateTree<JavaFile> type_ = type.then((validator) -> StateTree<JavaElement> type_ = type.then((validator) ->
validator.validate( validator.validate(
(token) -> token.getType().equals(TokenType.NAME), (token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> bag.set(token))); (bag, token) -> bag.set(token)));
StateTree<JavaFile> type_generic_begin = type_.then((validator) -> validator.validate( StateTree<JavaElement> type_generic_begin = type_.then((validator) -> validator.validate(
(token) -> token.getValue().equals("<"), (token) -> token.getValue().equals("<"),
(bag, token) -> bag.set(bag.<Token>get().concat(token)))); (bag, token) -> bag.set(bag.<Token>get().concat(token))));
StateTree<JavaFile> type_generic_name = type_generic_begin.then((validator) -> StateTree<JavaElement> type_generic_name = type_generic_begin.then((validator) ->
validator.validate( validator.validate(
(token) -> token.getType().equals(TokenType.NAME), (token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> bag.set(token))); (bag, token) -> bag.set(token)));
StateTree<JavaFile> type_generic_split = type_generic_name.then((validator) -> validator.validate( StateTree<JavaElement> type_generic_split = type_generic_name.then((validator) -> validator.validate(
(token) -> token.getValue().equals(","), (token) -> token.getValue().equals(","),
(bag, token) -> bag.set(bag.<Token>get().concat(token)))); (bag, token) -> bag.set(bag.<Token>get().concat(token))));
StateTree<JavaFile> type_generic_end = type_generic_name.then((validator) -> validator.validate( StateTree<JavaElement> type_generic_end = type_generic_name.then((validator) -> validator.validate(
(token) -> token.getValue().equals(">"), (token) -> token.getValue().equals(">"),
(bag, token) -> bag.set(bag.<Token>get().concat(token)))).loop(); (bag, token) -> bag.set(bag.<Token>get().concat(token)))).loop();
@ -95,8 +96,8 @@ public class JavaParser extends Parser<JavaFile> {
type_generic_end.end((a,b) -> a); type_generic_end.end((a,b) -> a);
//VALUE //VALUE
StateTree<JavaFile> value = new StateTree<>(); StateTree<JavaElement> value = new StateTree<>();
StateTree<JavaFile> value_name = value.then((validator) -> validator.validate( StateTree<JavaElement> value_name = value.then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.NAME), (token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> { (bag, token) -> {
Token current = bag.get(); Token current = bag.get();
@ -105,13 +106,13 @@ public class JavaParser extends Parser<JavaFile> {
bag.set(current); bag.set(current);
})); }));
value_name.end((a,b) -> a); value_name.end((a,b) -> a);
StateTree<JavaFile> value_call = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))); StateTree<JavaElement> value_call = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals(".")));
value_call.then(value_name); value_call.then(value_name);
StateTree<JavaFile> value_arg_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree<JavaElement> value_arg_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
StateTree<JavaFile> value_arg_end = value_arg_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); StateTree<JavaElement> value_arg_end = value_arg_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")")));
value_arg_end.end((a,b) -> a); value_arg_end.end((a,b) -> a);
value_arg_end.then(value_call); value_arg_end.then(value_call);
StateTree<JavaFile> value_arg = value_arg_begin.then(new RedirectStateTree<>(value, (global, local) -> { StateTree<JavaElement> value_arg = value_arg_begin.then(new RedirectStateTree<>(value, (global, local) -> {
Integer count = global.get("args"); Integer count = global.get("args");
if(count == null) count = 0; if(count == null) count = 0;
global.set("arg"+count, local); global.set("arg"+count, local);
@ -148,61 +149,64 @@ public class JavaParser extends Parser<JavaFile> {
}).end((a,b) -> a); }).end((a,b) -> a);
//VARIABLE //VARIABLE
StateTree<JavaFile> variable = new StateTree<>(); StateTree<JavaElement> variable = new StateTree<>();
StateTree<JavaFile> variable_mod = variable.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); StateTree<JavaElement> variable_mod = variable.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local)));
StateTree<JavaFile> variable_type = variable.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local))); StateTree<JavaElement> variable_type = variable.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local)));
variable_mod.then(variable_type); variable_mod.then(variable_type);
StateTree<JavaFile> variable_name = variable_type.then((validator) -> validator.validate( StateTree<JavaElement> variable_name = variable_type.then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.NAME), (token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> bag.set(token))); (bag, token) -> bag.set(token)));
variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";")))
.end((a,b) -> new Variable(b)); .end((a,b) -> new Variable(b));
StateTree<JavaFile> variable_split = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); StateTree<JavaElement> variable_split = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(",")));
variable_split.then(variable_name); variable_split.then(variable_name);
StateTree<JavaFile> variable_value = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) StateTree<JavaElement> variable_value = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals("=")))
.then(new RedirectStateTree<>(value, (global, local) -> global.set("value", local))); .then(new RedirectStateTree<>(value, (global, local) -> global.set("value", local)));
variable_value.then(variable_split); variable_value.then(variable_split);
variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";")))
.end((a,b) -> a); .end((a,b) -> a);
StateTree<JavaElement> function_container = new StateTree<>();
//FUNCTION //FUNCTION
StateTree<JavaFile> function = new StateTree<>(); StateTree<JavaElement> function = new StateTree<>();
StateTree<JavaFile> function_mod = function.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); StateTree<JavaElement> function_mod = function.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local)));
StateTree<JavaFile> function_type = function.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local))); StateTree<JavaElement> function_type = function.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local)));
function_mod.then(function_type); function_mod.then(function_type);
function.then((validator) -> validator.validate((token) -> token.getValue().equals("static"))).end((a,b) -> a); function.then((validator) -> validator.validate((token) -> token.getValue().equals("static")) && validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a).multiple(function_container);
StateTree<JavaFile> function_name = function_type.then((validator) -> validator.validate( StateTree<JavaElement> function_name = function_type.then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.NAME), (token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> bag.set(token))); (bag, token) -> bag.set(token)));
StateTree<JavaFile> function_begin = function_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree<JavaElement> function_begin = function_name.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
StateTree<JavaFile> function_end = function_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); StateTree<JavaElement> function_end = function_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")")));
function_end.end((a,b) -> a); function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a).multiple(function_container);
StateTree<JavaFile> function_throws = function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("throws"))) StateTree<JavaElement> function_throws = function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("throws")))
.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); .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); function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_throws);
StateTree<JavaFile> function_arg_type = function_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); StateTree<JavaElement> function_arg_type = function_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(null)));
StateTree<JavaFile> function_arg_name = function_arg_type.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); StateTree<JavaElement> 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((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_arg_type);
function_arg_name.then(function_end); function_arg_name.then(function_end);
StateTree<JavaFile> clazz_container = new StateTree<>();
StateTree<JavaElement> clazz_container = new StateTree<>();
clazz_container.then(variable); clazz_container.then(variable);
clazz_container.then(function); clazz_container.then(function);
//CLASS //CLASS
StateTree<JavaFile> clazz_ = new StateTree<>(); StateTree<JavaElement> clazz_ = new StateTree<>();
StateTree<JavaFile> clazz = new StateTree<>(); StateTree<JavaElement> clazz = new StateTree<>();
StateTree<JavaFile> clazz_base = clazz.then((validator) -> validator.validate((token) -> token.getValue().equals("class"))) StateTree<JavaElement> clazz_base = clazz.then((validator) -> validator.validate((token) -> token.getValue().equals("class")))
.then(new RedirectStateTree<>(type, (global, local) -> global.set("name", local.get()))); .then(new RedirectStateTree<>(type, (global, local) -> global.set("name", local.get())));
clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{")))
.end((javafile, bag) -> new Class(bag)).multiple(clazz_container); .<JavaElement>end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container);
StateTree<JavaFile> clazz_implement = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("implements"))); StateTree<JavaElement> clazz_implement = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("implements")));
StateTree<JavaFile> clazz_implement_name = clazz_implement.then(new RedirectStateTree<>(type, (global, local) -> { StateTree<JavaElement> clazz_implement_name = clazz_implement.then(new RedirectStateTree<>(type, (global, local) -> {
Token token = global.get("implement"); Token token = global.get("implement");
if(token == null) token = local.get(); if(token == null) token = local.get();
else token = token.concat(local.get()); else token = token.concat(local.get());
@ -210,19 +214,19 @@ public class JavaParser extends Parser<JavaFile> {
})); }));
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(","))).then(clazz_implement_name);
clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{")))
.end((javafile, bag) -> new Class(bag)).multiple(clazz_container); .<JavaElement>end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container);
StateTree<JavaFile> clazz_extend = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) StateTree<JavaElement> clazz_extend = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends")))
.then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local))); .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local)));
clazz_extend.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) clazz_extend.then((validator) -> validator.validate((token) -> token.getValue().equals("{")))
.end((javafile, bag) -> new Class(bag)).multiple(clazz_container); .<JavaElement>end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container);
clazz_extend.then(clazz_implement); clazz_extend.then(clazz_implement);
StateTree<JavaFile> clazz_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); StateTree<JavaElement> clazz_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local)));
clazz_mod.then(clazz); clazz_mod.then(clazz);
//IMPORT //IMPORT
StateTree<JavaFile> importState = new StateTree<>(); StateTree<JavaElement> importState = new StateTree<>();
importState.then((validator) -> { importState.then((validator) -> {
if(validator.validate( if(validator.validate(
(token) -> token.getValue().equals("import"), (token) -> token.getValue().equals("import"),
@ -240,13 +244,13 @@ public class JavaParser extends Parser<JavaFile> {
return validator.validate((token) -> token.getValue().equals(";")); return validator.validate((token) -> token.getValue().equals(";"));
} }
return false; return false;
}).<JavaElement>end((javafile, bag) -> javafile.addImport(bag)); }).<JavaElement>end((javafile, bag) -> javafile);
StateTree<JavaFile> main = new StateTree<>(); InitialStateTree<JavaElement> main = new InitialStateTree<>();
//PACKAGE //PACKAGE
BuilderStateTree<JavaFile, JavaElement> pack = main.then((validator) -> { StateTree<JavaElement> pack = main.then((validator) -> {
if(validator.validate( if(validator.validate(
(token) -> token.getValue().equals("package"), (token) -> token.getValue().equals("package"),
(bag, token) -> bag.set(new LinkedList<>()))){ (bag, token) -> bag.set(new LinkedList<>()))){
@ -255,13 +259,13 @@ public class JavaParser extends Parser<JavaFile> {
(token) -> !token.getValue().equals(";"), (token) -> !token.getValue().equals(";"),
(bag, token) -> bag.<List<Token>>get().add(token)) (bag, token) -> bag.<List<Token>>get().add(token))
); );
return validator.validate((token) -> token.getValue().equals(";")); return validator.validate((token) -> token.getValue().equals(";"));
} }
return false; return false;
}).<JavaElement>end((javafile, bag) -> javafile.setPackage(bag)); }).end((javafile, bag) -> javafile);
pack.multiple(importState); main.multiple(pack);
pack.multiple(clazz_); main.multiple(importState);
main.multiple(clazz_);
System.out.println((System.currentTimeMillis()-time)+"ms"); System.out.println((System.currentTimeMillis()-time)+"ms");

View file

@ -13,7 +13,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
private BiFunction<E, Bag, B> builder; private BiFunction<E, Bag, B> builder;
private List<StateTree<E>> childs; private List<StateTree<E>> childs;
private List<StateTree<E>> multiple; private List<StateTree<B>> multiple;
public BuilderStateTree(BiFunction<E, Bag, B> builder){ public BuilderStateTree(BiFunction<E, Bag, B> builder){
super(); super();
@ -30,24 +30,23 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
BuilderStateTree<B, ?> builded = super.internalSeed(validator, build); BuilderStateTree<B, ?> builded = super.internalSeed(validator, build);
if(builded != null) builded.build(validator, build); if(builded != null) builded.build(validator, build);
BuilderStateTree<E, ?> sub_builded; for(StateTree<B> state : this.multiple){
for(StateTree<E> state : this.multiple){
TokenValidator branch = validator.branch(); TokenValidator branch = validator.branch();
if(state.checker == null){ if(state.checker == null){
while((sub_builded = state.internalSeed(branch, element)) != null){ while((builded = state.internalSeed(branch, build)) != null){
validator.merge(branch); validator.merge(branch);
sub_builded.build(validator, element); builded.build(validator, build);
} }
}else{ }else{
while(state.checker.apply(branch)){ while(state.checker.apply(branch)){
sub_builded = state.internalSeed(branch, element); builded = state.internalSeed(branch, build);
if(sub_builded == null) break; if(builded == null) break;
validator.merge(branch); validator.merge(branch);
sub_builded.build(validator, element); builded.build(validator, build);
} }
} }
} }
BuilderStateTree<E, ?> sub_builded;
for(StateTree<E> child : this.childs){ for(StateTree<E> child : this.childs){
TokenValidator branch = validator.branch(); TokenValidator branch = validator.branch();
if(child.checker == null){ if(child.checker == null){
@ -81,7 +80,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
return state; return state;
} }
public <T extends StateTree<E>> StateTree<E> multiple(StateTree<E> child){ public <T extends StateTree<B>> StateTree<B> multiple(StateTree<B> child){
this.multiple.add(child); this.multiple.add(child);
return child; return child;
} }

View file

@ -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<E> extends StateTree<E>{
private List<StateTree<E>> multiple;
public InitialStateTree(){
super();
this.multiple = new ArrayList<>();
}
@Override
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
BuilderStateTree<E, ?> builded;
for(StateTree<E> 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 <T extends StateTree<E>> StateTree<E> multiple(StateTree<E> child){
this.multiple.add(child);
return child;
}
}

View file

@ -32,6 +32,7 @@ class GlobalCover {
parser.parse(new BufferedReader(new FileReader(file)), new JavaFile()); parser.parse(new BufferedReader(new FileReader(file)), new JavaFile());
validated += TokenValidator.MAX_VALIDATE; validated += TokenValidator.MAX_VALIDATE;
tokens += TokenValidator.TOKENS; tokens += TokenValidator.TOKENS;
System.out.println(file+" "+validated+" / "+tokens);
TokenValidator.MAX_VALIDATE = 0; TokenValidator.MAX_VALIDATE = 0;
TokenValidator.TOKENS = 0; TokenValidator.TOKENS = 0;
count++; count++;