diff --git a/src/be/jeffcheasey88/peeratcode/parser/Parser.java b/src/be/jeffcheasey88/peeratcode/parser/Parser.java index 71592c7..f3f2068 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/Parser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/Parser.java @@ -24,14 +24,18 @@ public class Parser{ this.tokenizer.reset(); this.tokenizer.parse(reader); - this.state.seed(this.tokenizer, container); + this.state.seed(new TokenValidator(tokenizer.getTokens().toArray(new Token[0])), container); } public final void parse(String line, E container) throws Exception{ this.tokenizer.reset(); this.tokenizer.parse(line); - this.state.seed(this.tokenizer, container); + this.state.seed(new TokenValidator(tokenizer.getTokens().toArray(new Token[0])), container); + } + + public final void parseStream(BufferedReader reader, E container) throws Exception{ + } //tmp diff --git a/src/be/jeffcheasey88/peeratcode/parser/StreamTokenValidator.java b/src/be/jeffcheasey88/peeratcode/parser/StreamTokenValidator.java new file mode 100644 index 0000000..f6fc43c --- /dev/null +++ b/src/be/jeffcheasey88/peeratcode/parser/StreamTokenValidator.java @@ -0,0 +1,65 @@ +package be.jeffcheasey88.peeratcode.parser; + +import java.io.BufferedReader; +import java.util.function.BiConsumer; +import java.util.function.Function; + +public class StreamTokenValidator extends TokenValidator{ + + private StreamTokenizer tokenizer; + private int validated; + private int index; + private BufferedReader reader; + + public StreamTokenValidator(StreamTokenizer tokenizer){ + super(new Token[0]); + this.tokenizer = tokenizer; + } + +// private boolean nextToken(){ +// +// } +// +// public boolean hasNext(){ +// return validated < elements.length; +// } +// +// public boolean validate(Function action){ +// if(validated >= this.elements.length) return false; +// if(!hasNext()) return false; +// if(action.apply(this.elements[validated])){ +// if(validated+1 > MAX_VALIDATE){ +// MAX_VALIDATE = validated+1; +// TOKENS = elements.length; +// } +// this.validated++; +// return true; +// } +// return false; +// } +// +// public boolean validate(Function action, BiConsumer filler){ +// if(validate(action)){ +// filler.accept(getBag(), elements[validated-1]); +// return true; +// } +// return false; +// } +// +// public TokenValidator branch(){ +// StreamTokenValidator branch = new StreamTokenValidator(reader); +// branch.elements = this.elements; +// branch.index = Math.max(0, this.validated-1); +// branch.validated = this.validated; +// branch.setBag(getBag()); +// return branch; +// } + + public void merge(TokenValidator branch){ + StreamTokenValidator validator = (StreamTokenValidator)branch; + this.index = validator.index; + this.validated = validator.validated; + setBag(branch.getBag()); + } + +} diff --git a/src/be/jeffcheasey88/peeratcode/parser/StreamTokenizer.java b/src/be/jeffcheasey88/peeratcode/parser/StreamTokenizer.java new file mode 100644 index 0000000..fce6ef6 --- /dev/null +++ b/src/be/jeffcheasey88/peeratcode/parser/StreamTokenizer.java @@ -0,0 +1,7 @@ +package be.jeffcheasey88.peeratcode.parser; + +public class StreamTokenizer extends Tokenizer{ + + + +} diff --git a/src/be/jeffcheasey88/peeratcode/parser/TokenType.java b/src/be/jeffcheasey88/peeratcode/parser/TokenType.java index f4ff02d..b779323 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/TokenType.java +++ b/src/be/jeffcheasey88/peeratcode/parser/TokenType.java @@ -5,6 +5,8 @@ public enum TokenType{ NAME, DELIMITER, SPACE, - GROUP + GROUP, + STRING, + CHAR } \ No newline at end of file diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index 16eff31..20dea82 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -29,7 +29,6 @@ public class JavaParser extends Parser { public JavaParser(){ Tokenizer tokenizer = new Tokenizer(){ - @Override public void parse(BufferedReader reader) throws Exception{ int lineNumber = 0; @@ -169,10 +168,25 @@ public class JavaParser extends Parser { StateTree value_container = new StateTree<>(); + + + + + StateTree value_list = new StateTree<>(); + StateTree value_list_element = value_list.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); + value_list_element.end((a,b) -> a); + value_list_element.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(value_list_element); + + + + + + StateTree value_instance = value.then((validator) -> validator.validate((token) -> token.getValue().equals("new"))); StateTree value_name = new StateTree(); value.then(value_name); - value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> global.set(local))) + value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> global.set(null))) .end((a,b) -> a) .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) @@ -192,7 +206,11 @@ public class JavaParser extends Parser { StateTree value_array_end = value_array_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("]"))); value_array_begin.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("inside", local))) .then(value_array_end); - value_array_end.end((a,b) -> a); + value_array_end.end((a,b) -> a) + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(value_list) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); value_array_end.then(value_call); value_array_end.then(value_array_begin); @@ -404,6 +422,7 @@ public class JavaParser extends Parser { variable_value.then(variable_split); variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); + variable_value.end((a,b) -> a); //OPERATION StateTree operation = new StateTree<>(); @@ -453,7 +472,7 @@ public class JavaParser extends Parser { StateTree operation_try = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("try"))); StateTree operation_try_base = operation_try.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); operation_try.then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + .then(new RedirectStateTree<>(variable, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .then(operation_try_base); StateTree operation_try_end = operation_try_base.end((a,b) -> a) @@ -461,13 +480,12 @@ public class JavaParser extends Parser { .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) .end((a,b) -> a); -// StateTree operation_finally = operation_try_end.then((validator) -> validator.validate((token) -> token.getValue().equals("finally"))) -// .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) -// .end((a,b) -> a) -// .multiple(function_container) -// .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) -// .end((a,b) -> a); -// + StateTree operation_finally = operation_try_end.then((validator) -> validator.validate((token) -> token.getValue().equals("finally"))); + operation_finally.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) + .end((a,b) -> a); StateTree operation_catch_named = operation_try_end.then((validator) -> validator.validate((token) -> token.getValue().equals("catch"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) @@ -481,8 +499,8 @@ public class JavaParser extends Parser { .multiple(function_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) .end((a,b) -> a); -// operation_catch.then(operation_finally); -// operation_catch.then(operation_catch); + operation_catch.then(operation_finally); + operation_catch.then(operation_catch_named); operation.then((validator) -> validator.validate((token) -> token.getValue().equals("continue"))) @@ -622,7 +640,7 @@ public class JavaParser extends Parser { StateTree function_name = function.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), - (bag, token) -> bag.set("mais ?",token))); + (bag, token) -> System.out.println("declared function "+token.getValue()))); function_type.then(function_name); 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(")"))); @@ -645,14 +663,18 @@ public class JavaParser extends Parser { function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); + StateTree function_arg_mod = function_begin.then((validator) -> validator.validate((token) -> getModifier(token.getValue()) > 0)); StateTree function_arg_type = function_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); + function_arg_mod.then(function_arg_type); StateTree function_arg_name = function_arg_type.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); function_arg_type.then((validator) -> validator.validate((token) -> token.getValue().equals(".")) && validator.validate((token) -> token.getValue().equals(".")) && validator.validate((token) -> token.getValue().equals("."))) .then(function_arg_name); - function_arg_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_arg_type); + StateTree function_arg_split = function_arg_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); + function_arg_split.then(function_arg_mod); + function_arg_split.then(function_arg_type); function_arg_name.then(function_end); @@ -665,8 +687,6 @@ public class JavaParser extends Parser { .unique((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a); - braces_container.then(clazz_container); - //CLASS StateTree clazz_ = new StateTree<>(); StateTree clazz = new StateTree<>(); diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java index 77fd960..fb071b3 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java @@ -6,9 +6,7 @@ import java.util.function.BiFunction; import java.util.function.Function; import be.jeffcheasey88.peeratcode.parser.Bag; -import be.jeffcheasey88.peeratcode.parser.Token; import be.jeffcheasey88.peeratcode.parser.TokenValidator; -import be.jeffcheasey88.peeratcode.parser.Tokenizer; public class StateTree{ @@ -21,8 +19,7 @@ public class StateTree{ this.childs = new ArrayList<>(); } - public void seed(Tokenizer tokenizer, E container){ - TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0])); + public void seed(TokenValidator validator, E container){ while(validator.hasNext()){ BuilderStateTree build = internalSeed(validator, container); if(build == null) break; diff --git a/test/GlobalCover.java b/test/GlobalCover.java index 9b96fc4..7acdf28 100644 --- a/test/GlobalCover.java +++ b/test/GlobalCover.java @@ -48,6 +48,7 @@ class GlobalCover { TokenValidator.MAX_VALIDATE = 0; TokenValidator.TOKENS = 0; count++; + if(hasWriten) break; } }