diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index c164893..d87bb65 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -48,6 +48,7 @@ public class JavaParser extends Parser { //- Modifier //- Type //- Value + //- Operation //- Variable //- Function //- Class @@ -148,6 +149,24 @@ public class JavaParser extends Parser { return false; }).end((a,b) -> a); + //OPERATION + StateTree operation = new StateTree<>(); + StateTree operation_name = operation.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end((a,b) -> a); + StateTree operation_call = operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))); + operation_call.then(operation_name); + StateTree operation_begin = operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree operation_end = operation_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + operation_end.then(operation_call); + operation_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end((a,b) -> a); + StateTree operation_value = operation_begin.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); + operation_value.then(operation_end); + operation_value.then((validator) -> validator.validate((token) -> token.getValue().equals("."))).then(operation_value); + //VARIABLE StateTree variable = new StateTree<>(); StateTree variable_mod = variable.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); @@ -167,23 +186,32 @@ public class JavaParser extends Parser { .end((a,b) -> a); StateTree function_container = new StateTree<>(); + function_container.then(variable); + function_container.then(operation); //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))); function_mod.then(function_type); - function.then((validator) -> validator.validate((token) -> token.getValue().equals("static")) && validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a).multiple(function_container); + BuilderStateTree function_static = function.then((validator) -> validator.validate((token) -> token.getValue().equals("static")) && validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a); + function_static.multiple(function_container); + function_static.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); + 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.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a).multiple(function_container); + 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); 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.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a).multiple(function_container); + BuilderStateTree function_start_throws = function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a); + 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); diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java index 9ff88e0..9108e4f 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java @@ -14,6 +14,7 @@ public class BuilderStateTree extends StateTree{ private List> childs; private List> multiple; + private List> unique; public BuilderStateTree(BiFunction builder){ super(); @@ -21,6 +22,7 @@ public class BuilderStateTree extends StateTree{ this.childs = new ArrayList<>(); this.multiple = new ArrayList<>(); + this.unique = new ArrayList<>(); } B build(TokenValidator validator, E element){ @@ -46,6 +48,24 @@ public class BuilderStateTree extends StateTree{ } } } + + for(StateTree state : this.unique){ + TokenValidator branch = validator.branch(); + if(state.checker == null){ + if((builded = state.internalSeed(branch, build)) != null){ + validator.merge(branch); + builded.build(validator, build); + } + }else{ + if(state.checker.apply(branch)){ + builded = state.internalSeed(branch, build); + if(builded == null) break; + validator.merge(branch); + builded.build(validator, build); + } + } + } + BuilderStateTree sub_builded; for(StateTree child : this.childs){ TokenValidator branch = validator.branch(); @@ -84,4 +104,21 @@ public class BuilderStateTree extends StateTree{ this.multiple.add(child); return child; } + + public > StateTree multiple(Function checker){ + StateTree state = new StateTree<>(); + state.checker = checker; + return multiple(state); + } + + public > StateTree unique(StateTree child){ + this.unique.add(child); + return child; + } + + public > StateTree unique(Function checker){ + StateTree state = new StateTree<>(); + state.checker = checker; + return unique(state); + } }