Initial Node & update 'multiple' system
This commit is contained in:
parent
4564f52c4c
commit
25563254b3
4 changed files with 111 additions and 63 deletions
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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++;
|
||||
|
|
Loading…
Add table
Reference in a new issue