diff --git a/src/be/jeffcheasey88/peeratcode/parser/TokenValidator.java b/src/be/jeffcheasey88/peeratcode/parser/TokenValidator.java index 73e318c..b7792f2 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/TokenValidator.java +++ b/src/be/jeffcheasey88/peeratcode/parser/TokenValidator.java @@ -55,6 +55,7 @@ public class TokenValidator{ public void merge(TokenValidator branch){ this.index = branch.index; this.validated = branch.validated; + this.bag = branch.bag; } public void setBag(Bag bag){ diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index d45ed10..744aa27 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -74,7 +74,7 @@ public class JavaParser extends Parser { } return false; }).end((javafile, bag) -> javafile.setPackage(bag)) - .thenNoChild(importState); + .multiple(importState); System.out.println((System.currentTimeMillis()-time)+"ms"); diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java index 992bc23..d33b9b8 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java @@ -13,6 +13,7 @@ public class BuilderStateTree extends StateTree{ private BiFunction builder; private List> childs; + private StateTree multiple; public BuilderStateTree(BiFunction builder){ super(); @@ -28,20 +29,20 @@ public class BuilderStateTree extends StateTree{ BuilderStateTree builded = super.internalSeed(validator, build); if(builded != null) builded.build(validator, build); - BuilderStateTree buildedNoChilds = internalSeedNoChilds(validator, element); - if(buildedNoChilds != null) buildedNoChilds.build(validator, element); + internalSeedNoChilds(validator, element); return build; } - BuilderStateTree internalSeedNoChilds(TokenValidator validator, E element){ + void internalSeedNoChilds(TokenValidator validator, E element){ for(StateTree child : this.childs){ TokenValidator branch = validator.branch(); if(child.checker == null){ BuilderStateTree builded = child.internalSeed(branch, element); if(builded != null){ validator.merge(branch); - return builded; + builded.build(validator, element); + return; } continue; } @@ -49,11 +50,30 @@ public class BuilderStateTree extends StateTree{ BuilderStateTree builded = child.internalSeed(branch, element); if(builded != null){ validator.merge(branch); - return builded; + builded.build(validator, element); + return; + } + } + } + + if(multiple != null){ + TokenValidator branch = validator.branch(); + if(multiple.checker == null){ + BuilderStateTree builded; + while((builded = multiple.internalSeed(branch, element)) != null){ + validator.merge(branch); + builded.build(validator, element); + } + return; + } + while(multiple.checker.apply(branch)){ + BuilderStateTree builded = multiple.internalSeed(branch, element); + if(builded != null){ + validator.merge(branch); + builded.build(validator, element); } } } - return null; } public > StateTree thenNoChild(StateTree child){ @@ -67,4 +87,9 @@ public class BuilderStateTree extends StateTree{ this.childs.add(state); return state; } + + public > StateTree multiple(StateTree child){ + this.multiple = child; + return child; + } } diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java index c6fcbe0..d9fb928 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java @@ -24,7 +24,6 @@ public class StateTree{ public void seed(Tokenizer tokenizer, E container){ TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0])); while(validator.hasNext()){ - System.out.println("seed"); BuilderStateTree build = internalSeed(validator, container); System.out.println("Validate "+validator.MAX_VALIDATE+"/"+tokenizer.getTokens().size()+" tokens !"); if(build == null) break;