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.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<JavaFile> {
public class JavaParser extends Parser<JavaElement> {
public static long time;
@ -31,8 +32,8 @@ public class JavaParser extends Parser<JavaFile> {
time = System.currentTimeMillis();
Parser<JavaFile> parser = new JavaParser();
JavaFile jFile = new JavaFile();
Parser<JavaElement> 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<JavaFile> {
//- Package
//MODIFIER
StateTree<JavaFile> modifier = new StateTree<JavaFile>();
StateTree<JavaElement> modifier = new StateTree<JavaElement>();
modifier.then((validator) -> {
boolean mod = false;
while(validator.validate(
@ -68,22 +69,22 @@ public class JavaParser extends Parser<JavaFile> {
}).end((a,b) -> a);
//TYPE
StateTree<JavaFile> type = new StateTree<JavaFile>();
StateTree<JavaFile> type_ = type.then((validator) ->
StateTree<JavaElement> type = new StateTree<JavaElement>();
StateTree<JavaElement> type_ = type.then((validator) ->
validator.validate(
(token) -> token.getType().equals(TokenType.NAME),
(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("<"),
(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(
(token) -> token.getType().equals(TokenType.NAME),
(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(","),
(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(">"),
(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);
//VALUE
StateTree<JavaFile> value = new StateTree<>();
StateTree<JavaFile> value_name = value.then((validator) -> validator.validate(
StateTree<JavaElement> value = new StateTree<>();
StateTree<JavaElement> 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<JavaFile> {
bag.set(current);
}));
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);
StateTree<JavaFile> 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_begin = value_name.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.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");
if(count == null) count = 0;
global.set("arg"+count, local);
@ -148,61 +149,64 @@ public class JavaParser extends Parser<JavaFile> {
}).end((a,b) -> a);
//VARIABLE
StateTree<JavaFile> variable = new StateTree<>();
StateTree<JavaFile> 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 = new StateTree<>();
StateTree<JavaElement> variable_mod = variable.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local)));
StateTree<JavaElement> variable_type = variable.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local)));
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),
(bag, token) -> bag.set(token)));
variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";")))
.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);
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)));
variable_value.then(variable_split);
variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";")))
.end((a,b) -> a);
StateTree<JavaElement> function_container = new StateTree<>();
//FUNCTION
StateTree<JavaFile> function = new StateTree<>();
StateTree<JavaFile> 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 = new StateTree<>();
StateTree<JavaElement> function_mod = function.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local)));
StateTree<JavaElement> 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<JavaFile> 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<JavaElement> function_name = function_type.then((validator) -> validator.validate(
(token) -> token.getType().equals(TokenType.NAME),
(bag, token) -> bag.set(token)));
StateTree<JavaFile> 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(")")));
function_end.end((a,b) -> a);
StateTree<JavaElement> function_begin = function_name.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
StateTree<JavaElement> 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<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)));
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<JavaFile> 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_type = function_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(null)));
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(function_end);
StateTree<JavaFile> clazz_container = new StateTree<>();
StateTree<JavaElement> clazz_container = new StateTree<>();
clazz_container.then(variable);
clazz_container.then(function);
//CLASS
StateTree<JavaFile> clazz_ = new StateTree<>();
StateTree<JavaFile> clazz = new StateTree<>();
StateTree<JavaElement> 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())));
clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{")))
.end((javafile, bag) -> new Class(bag)).multiple(clazz_container);
StateTree<JavaFile> 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) -> {
.<JavaElement>end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container);
StateTree<JavaElement> clazz_implement = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("implements")));
StateTree<JavaElement> 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<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("{")))
.end((javafile, bag) -> new Class(bag)).multiple(clazz_container);
StateTree<JavaFile> clazz_extend = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends")))
.<JavaElement>end((JavaElement, bag) -> new Class(bag)).multiple(clazz_container);
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)));
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);
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);
//IMPORT
StateTree<JavaFile> importState = new StateTree<>();
StateTree<JavaElement> importState = new StateTree<>();
importState.then((validator) -> {
if(validator.validate(
(token) -> token.getValue().equals("import"),
@ -240,13 +244,13 @@ public class JavaParser extends Parser<JavaFile> {
return validator.validate((token) -> token.getValue().equals(";"));
}
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
BuilderStateTree<JavaFile, JavaElement> pack = main.then((validator) -> {
StateTree<JavaElement> 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<JavaFile> {
(token) -> !token.getValue().equals(";"),
(bag, token) -> bag.<List<Token>>get().add(token))
);
return validator.validate((token) -> token.getValue().equals(";"));
}
return false;
}).<JavaElement>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");

View file

@ -13,7 +13,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
private BiFunction<E, Bag, B> builder;
private List<StateTree<E>> childs;
private List<StateTree<E>> multiple;
private List<StateTree<B>> multiple;
public BuilderStateTree(BiFunction<E, Bag, B> builder){
super();
@ -30,24 +30,23 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
BuilderStateTree<B, ?> builded = super.internalSeed(validator, build);
if(builded != null) builded.build(validator, build);
BuilderStateTree<E, ?> sub_builded;
for(StateTree<E> state : this.multiple){
for(StateTree<B> 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<E, ?> sub_builded;
for(StateTree<E> child : this.childs){
TokenValidator branch = validator.branch();
if(child.checker == null){
@ -81,7 +80,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
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);
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());
validated += TokenValidator.MAX_VALIDATE;
tokens += TokenValidator.TOKENS;
System.out.println(file+" "+validated+" / "+tokens);
TokenValidator.MAX_VALIDATE = 0;
TokenValidator.TOKENS = 0;
count++;