From 427e3f2fc9f45cc2b68c6bb9b6a83ce211b1111e Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Sun, 16 Jul 2023 18:01:21 +0200 Subject: [PATCH] StateTree -> then in & out build --- .../parser/state/BuilderStateTree.java | 47 ++++++++++++++++++- .../peeratcode/parser/state/StateTree.java | 4 +- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java index 4d1d89d..992bc23 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/BuilderStateTree.java @@ -1,6 +1,9 @@ package be.jeffcheasey88.peeratcode.parser.state; +import java.util.ArrayList; +import java.util.List; import java.util.function.BiFunction; +import java.util.function.Function; import be.jeffcheasey88.peeratcode.parser.Bag; import be.jeffcheasey88.peeratcode.parser.TokenValidator; @@ -8,18 +11,60 @@ import be.jeffcheasey88.peeratcode.parser.TokenValidator; public class BuilderStateTree extends StateTree{ private BiFunction builder; + + private List> childs; public BuilderStateTree(BiFunction builder){ super(); this.builder = builder; + + this.childs = new ArrayList<>(); } B build(TokenValidator validator, E element){ B build = this.builder.apply(element, validator.getBag()); validator.setBag(new Bag()); - super.internalSeed(validator, build); + 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); return build; } + + BuilderStateTree 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; + } + continue; + } + if(child.checker.apply(branch)){ + BuilderStateTree builded = child.internalSeed(branch, element); + if(builded != null){ + validator.merge(branch); + return builded; + } + } + } + return null; + } + + public > StateTree thenNoChild(StateTree child){ + childs.add(child); + return child; + } + + public > StateTree thenNoChild(Function checker){ + StateTree state = new StateTree<>(); + state.checker = checker; + this.childs.add(state); + return state; + } } diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java b/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java index 8e57057..c6fcbe0 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/StateTree.java @@ -23,7 +23,7 @@ public class StateTree{ public void seed(Tokenizer tokenizer, E container){ TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0])); - while(validator.hasNext()) { + while(validator.hasNext()){ System.out.println("seed"); BuilderStateTree build = internalSeed(validator, container); System.out.println("Validate "+validator.MAX_VALIDATE+"/"+tokenizer.getTokens().size()+" tokens !"); @@ -72,7 +72,7 @@ public class StateTree{ return this; } - public StateTree end(BiFunction builder){ + public BuilderStateTree end(BiFunction builder){ BuilderStateTree builderState = new BuilderStateTree<>(builder); this.builder = builderState; return builderState;