StateTree -> Modifier & set bag after confirmed

This commit is contained in:
jeffcheasey88 2023-07-16 21:57:38 +02:00
parent a0b096745a
commit e81a509f48
2 changed files with 23 additions and 11 deletions

View file

@ -13,6 +13,7 @@ import be.jeffcheasey88.peeratcode.parser.Parser;
import be.jeffcheasey88.peeratcode.parser.Token;
import be.jeffcheasey88.peeratcode.parser.Tokenizer;
import be.jeffcheasey88.peeratcode.parser.state.BuilderStateTree;
import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree;
import be.jeffcheasey88.peeratcode.parser.state.StateTree;
public class JavaParser extends Parser<JavaFile> {
@ -37,8 +38,24 @@ public class JavaParser extends Parser<JavaFile> {
public JavaParser(){
Tokenizer tokenizer = new Tokenizer();
StateTree<JavaFile> modifier = new StateTree<JavaFile>().then((validator) -> {
boolean mod = false;
while(validator.validate(
(token) -> getModifier(token.getValue()) > 0,
(bag, token) -> {
int m = getModifier(token.getValue());
Integer current = bag.get();
bag.set(current == null ? m : current+m);
})) mod = true;
return mod;
});
StateTree<JavaFile> clazz_ = new StateTree<>();
StateTree<JavaFile> clazz = new StateTree<>();
clazz_.then(new RedirectStateTree<>(modifier, (bag) -> "modifier"));
StateTree<JavaFile> importState = new StateTree<>();
importState.then((validator) -> {
if(validator.validate(
@ -77,7 +94,7 @@ public class JavaParser extends Parser<JavaFile> {
return false;
}).<JavaElement>end((javafile, bag) -> javafile.setPackage(bag));
pack.multiple(importState);
pack.thenNoChild(clazz);
pack.thenNoChild(clazz_);
System.out.println((System.currentTimeMillis()-time)+"ms");

View file

@ -21,19 +21,14 @@ public class RedirectStateTree<E, T extends E> extends StateTree<T>{
Bag currentBag = validator.getBag();
Bag localBag = new Bag();
String g = group.apply(currentBag);
localBag.addPath(currentBag.path()+"/"+g);
// System.out.println("redirect "+localBag.path());
currentBag.set(g, localBag);
validator.setBag(localBag);
TokenValidator branch = validator.branch();
branch.setBag(localBag);
Object builded = redirect.internalSeed(branch, (E) element);
// System.out.println("redirect "+localBag.path()+" builded "+builded);
if(builded == null) return null;
currentBag.set(this.group.apply(currentBag), localBag);
branch.setBag(currentBag);
validator.merge(branch);
validator.setBag(currentBag);
return super.internalSeed(validator, element);
}