ValueChainBuilder -> MethodCall, VariableAccess & ArrayAccess completed + remove debug

This commit is contained in:
jeffcheasey88 2025-04-09 18:02:31 +02:00
parent 27ba275a76
commit b87e25c8da
6 changed files with 39 additions and 56 deletions

View file

@ -11,36 +11,33 @@ public class Bag{
private Object value; private Object value;
private String path = ""; // private String path = "";
public Bag(){ public Bag(){
System.out.println("new empty bag "+hashCode()+" -> "+Thread.currentThread().getStackTrace()[2]);
this.map = new HashMap<>(); this.map = new HashMap<>();
path = Thread.currentThread().getStackTrace()[2].toString(); // path = Thread.currentThread().getStackTrace()[2].toString();
} }
public Bag(Bag bag){ public Bag(Bag bag){
System.out.println("bag "+hashCode()+" copy of "+bag.hashCode());
this.map = new HashMap<>(bag.map); this.map = new HashMap<>(bag.map);
this.value = bag.value; this.value = bag.value;
this.path = bag.path; // this.path = bag.path;
} }
public <E> E get(){ public <E> E get(){
return (E) this.value; return (E) this.value;
} }
public void addPath(String s){ // public void addPath(String s){
path+=s; // path+=s;
} // }
//
public String path(){ // public String path(){
return this.path; // return this.path;
} // }
public void set(Object value){ public void set(Object value){
this.value = value; this.value = value;
System.out.println("edit Bag "+this+" -> "+Thread.currentThread().getStackTrace()[2]);
} }
public <E> E get(String key){ public <E> E get(String key){

View file

@ -29,9 +29,7 @@ public class TokenValidator{
public boolean validate(Function<Token, Boolean> action){ public boolean validate(Function<Token, Boolean> action){
if(validated >= this.elements.length) return false; if(validated >= this.elements.length) return false;
System.out.println("[validate try] "+this.elements[validated]);
if(action.apply(this.elements[validated])){ if(action.apply(this.elements[validated])){
System.out.println("validate confirmed! "+this.elements[validated]);
if(validated+1 > MAX_VALIDATE){ if(validated+1 > MAX_VALIDATE){
MAX_VALIDATE = validated+1; MAX_VALIDATE = validated+1;
TOKENS = elements.length; TOKENS = elements.length;
@ -40,7 +38,6 @@ public class TokenValidator{
return true; return true;
} }
System.out.println("valide rejected ! "+this.elements[validated]);
return false; return false;
} }

View file

@ -40,14 +40,12 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
// VALUE // VALUE
StateTree<JavaElement> value = this.current.then((validator) -> { StateTree<JavaElement> value = this.current.then((validator) -> {
validator.getBag().set(new ValueChainBuilder()); validator.getBag().set(new ValueChainBuilder());
System.out.println("HELLO JAVA "+validator.getBag());
return true; return true;
}); });
StateTree<JavaElement> unary_value = new StateTree<>(); StateTree<JavaElement> unary_value = new StateTree<>();
StateTree<JavaElement> value_operation = new StateTree<>(); StateTree<JavaElement> value_operation = new StateTree<>();
StateTree<JavaElement> redirectRight = new RedirectStateTree<>(this.current, (global, local) -> { StateTree<JavaElement> redirectRight = new RedirectStateTree<>(this.current, (global, local) -> {
System.out.println("redirectRight g="+global+" ,l="+local);
global.<ValueChainBuilder>get().right(local.get()); global.<ValueChainBuilder>get().right(local.get());
}); });
@ -110,14 +108,13 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
value.equals("!",modifier()).redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().rebase(local.get())).end(ValueChainBuilder.build((builder) -> builder.buildModifier())); value.equals("!",modifier()).redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().rebase(local.get())).end(ValueChainBuilder.build((builder) -> builder.buildModifier()));
StateTree<JavaElement> left_value = value.then((t) -> {System.out.println("what "+t.getBag()); return true;}).redirect(unary_value, (global, local) -> { System.out.println("merge "+global+" <-> "+local); global.<ValueChainBuilder>get().rebase(local.get());}); StateTree<JavaElement> left_value = value.redirect(unary_value, (global, local) -> global.<ValueChainBuilder>get().rebase(local.get()));
left_value.end(ValueChainBuilder.build()); left_value.end(ValueChainBuilder.build());
left_value.equals("?") left_value.equals("?")
.redirect(this.current, (global, local) -> global.set("success", local.get())) .redirect(this.current, (global, local) -> global.set("success", local.get()))
.equals(":") .equals(":")
.redirect(this.current, (global, local) -> global.set("fail", local.get())) .redirect(this.current, (global, local) -> global.set("fail", local.get()))
.end((parent, bag) -> { .end((parent, bag) -> {
System.out.println("tri value "+bag);
bag.set(new TriValue(bag.<ValueChainBuilder>get().base, bag.get("success"), bag.get("fail"))); bag.set(new TriValue(bag.<ValueChainBuilder>get().base, bag.get("success"), bag.get("fail")));
if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(bag.get()); if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(bag.get());
return null; return null;
@ -180,7 +177,6 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
static BiFunction<JavaElement, Bag, JavaElement> build(Consumer<ValueChainBuilder> builder){ static BiFunction<JavaElement, Bag, JavaElement> build(Consumer<ValueChainBuilder> builder){
return (parent, bag) -> { return (parent, bag) -> {
System.out.println("build chain "+bag);
ValueChainBuilder chainBuilder = bag.get(); ValueChainBuilder chainBuilder = bag.get();
builder.accept(chainBuilder); builder.accept(chainBuilder);
chainBuilder.build(parent, bag); chainBuilder.build(parent, bag);
@ -190,7 +186,6 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
static BiFunction<JavaElement, Bag, JavaElement> build(){ static BiFunction<JavaElement, Bag, JavaElement> build(){
return (parent, bag) -> { return (parent, bag) -> {
System.out.println("build chain "+bag);
ValueChainBuilder chainBuilder = bag.get(); ValueChainBuilder chainBuilder = bag.get();
chainBuilder.build(parent, bag); chainBuilder.build(parent, bag);
return null; return null;
@ -247,7 +242,6 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
buildVariableAccess(); buildVariableAccess();
this.current = null; this.current = null;
} }
System.out.println("dot "+this);
} }
public void parameter(Value value){ public void parameter(Value value){
@ -262,11 +256,9 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
buildMethodCall(); buildMethodCall();
this.current = null; this.current = null;
this.parameters = null; this.parameters = null;
System.out.println("parameter "+this);
} }
public void arrayAccess(Value value){ public void arrayAccess(Value value){
System.out.println("ARRAY ACCESS "+this);
this.base = new ArrayAccessValue(this.base, value); this.base = new ArrayAccessValue(this.base, value);
} }

View file

@ -10,23 +10,20 @@ public class RedirectStateTree<E, T extends E> extends StateTree<T>{
private StateTree<E> redirect; private StateTree<E> redirect;
private BiConsumer<Bag, Bag> group; private BiConsumer<Bag, Bag> group;
private StackTraceElement calling;
public RedirectStateTree(StateTree<E> redirect, BiConsumer<Bag, Bag> group){ public RedirectStateTree(StateTree<E> redirect, BiConsumer<Bag, Bag> group){
super(); super();
this.redirect = redirect; this.redirect = redirect;
this.group = group; this.group = group;
StackTraceElement[] trace = Thread.currentThread().getStackTrace(); // StackTraceElement[] trace = Thread.currentThread().getStackTrace();
int current = 0; // int current = 0;
while((current < trace.length) && (!(trace[++current].getClassName().contains("Value")))); // while((current < trace.length) && (!(trace[++current].getClassName().contains("Value"))));
//
this.calling = trace[current]; // this.calling = trace[current];
} }
@Override @Override
BuilderStateTree<T, ?> internalSeed(TokenValidator validator, T element){ BuilderStateTree<T, ?> internalSeed(TokenValidator validator, T element){
System.out.println("[redirect into] "+calling);
Bag currentBag = validator.getBag(); Bag currentBag = validator.getBag();
Bag localBag = new Bag(); Bag localBag = new Bag();
@ -36,8 +33,6 @@ public class RedirectStateTree<E, T extends E> extends StateTree<T>{
if(builded == null) return null; if(builded == null) return null;
builded.build(branch, element); builded.build(branch, element);
System.out.println("[redirect done] "+calling);
this.group.accept(currentBag, localBag); this.group.accept(currentBag, localBag);
branch.setBag(currentBag); branch.setBag(currentBag);
validator.merge(branch); validator.merge(branch);

View file

@ -17,21 +17,11 @@ public class StateTree<E>{
Function<TokenValidator, Boolean> checker; Function<TokenValidator, Boolean> checker;
private BuilderStateTree<E, ?> builder; private BuilderStateTree<E, ?> builder;
private StackTraceElement origin;
//TODO checker in constructeur ? //TODO checker in constructeur ?
public StateTree(){ public StateTree(){
this.childs = new ArrayList<>(); this.childs = new ArrayList<>();
} }
private void origin(){
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
int current = 0;
while((current < trace.length) && (!(trace[++current].getClassName().contains("Value"))));
this.origin = trace[current];
}
public void seed(TokenValidator validator, E container){ public void seed(TokenValidator validator, E container){
while(validator.hasNext()){ while(validator.hasNext()){
BuilderStateTree<E, ?> build = internalSeed(validator, container); BuilderStateTree<E, ?> build = internalSeed(validator, container);
@ -41,12 +31,9 @@ public class StateTree<E>{
} }
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){ BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
System.out.println("internalSeed "+origin);
for(StateTree<E> child : this.childs){ for(StateTree<E> child : this.childs){
System.out.println("internalSeed "+origin+" child: "+child.origin);
TokenValidator branch = validator.branch(); TokenValidator branch = validator.branch();
if(child.checker == null){ if(child.checker == null){
System.out.println("checker null");
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element); BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
if(builded != null){ if(builded != null){
validator.merge(branch); validator.merge(branch);
@ -54,9 +41,7 @@ public class StateTree<E>{
} }
continue; continue;
} }
System.out.println("try checker");
if(child.checker.apply(branch)){ if(child.checker.apply(branch)){
System.out.println("pass");
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element); BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
if(builded != null){ if(builded != null){
validator.merge(branch); validator.merge(branch);
@ -77,7 +62,6 @@ public class StateTree<E>{
StateTree<E> state = new StateTree<>(); StateTree<E> state = new StateTree<>();
state.checker = checker; state.checker = checker;
this.childs.add(state); this.childs.add(state);
state.origin();
return state; return state;
} }
@ -114,10 +98,7 @@ public class StateTree<E>{
} }
public StateTree<E> redirect(StateTree<E> target){ public StateTree<E> redirect(StateTree<E> target){
return then(new RedirectStateTree<>(target, (global, local) -> { return then(new RedirectStateTree<>(target, (global, local) -> global.set(local.get())));
System.out.println("\nMERGE:\n\t"+global+"\n\t"+local+"\n");
global.set(local.get());
}));
} }
public StateTree<E> redirect(StateTree<E> target, BiConsumer<Bag, Bag> group){ public StateTree<E> redirect(StateTree<E> target, BiConsumer<Bag, Bag> group){

View file

@ -14,6 +14,7 @@ import org.junit.jupiter.api.TestInstance.Lifecycle;
import dev.peerat.parser.Parser; import dev.peerat.parser.Parser;
import dev.peerat.parser.java.tree.JavaTreeType; import dev.peerat.parser.java.tree.JavaTreeType;
import dev.peerat.parser.java.value.ArrayAccessValue;
import dev.peerat.parser.java.value.BiValue; import dev.peerat.parser.java.value.BiValue;
import dev.peerat.parser.java.value.MethodCallValue; import dev.peerat.parser.java.value.MethodCallValue;
import dev.peerat.parser.java.value.ModifierValue; import dev.peerat.parser.java.value.ModifierValue;
@ -21,6 +22,7 @@ import dev.peerat.parser.java.value.StaticValue;
import dev.peerat.parser.java.value.TriValue; import dev.peerat.parser.java.value.TriValue;
import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.value.Value;
import dev.peerat.parser.java.value.Value.ValueContainer; import dev.peerat.parser.java.value.Value.ValueContainer;
import dev.peerat.parser.java.value.VariableAccessValue;
import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.java.visitor.JavaVisitor;
import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.visitor.VisitorBag;
@ -188,6 +190,25 @@ public class ValueTypesTests {
assertEquals("test", v.getToken().getValue()); assertEquals("test", v.getToken().getValue());
assertEquals("JavaParserTest", assertInstance(v.base(), StaticValue.class).getToken().getValue()); assertEquals("JavaParserTest", assertInstance(v.base(), StaticValue.class).getToken().getValue());
v = assertInstance(parse("main.test.here.localvar.run(6)[0].validate(7)"), MethodCallValue.class); v = assertInstance(parse("main.test.here.localvar.run(6)[0].validate(7)"), MethodCallValue.class); //main.test.here.localvar.run(6)[0].validate(7)
assertEquals("validate", v.getToken().getValue());
assertEquals(1, v.getParameters().size());
StaticValue param = assertInstance(v.getParameters().get(0), StaticValue.class);
assertEquals("7", param.getToken().getValue());
ArrayAccessValue array = assertInstance(v.base(), ArrayAccessValue.class); //main.test.here.localvar.run(6)[0]
param = assertInstance(array.getAccessor(), StaticValue.class);
assertEquals("0", param.getToken().getValue());
v = assertInstance(array.base(), MethodCallValue.class); //main.test.here.localvar.run(6)
assertEquals("run", v.getToken().getValue());
param = assertInstance(v.getParameters().get(0), StaticValue.class);
assertEquals("6", param.getToken().getValue());
VariableAccessValue access = assertInstance(v.base(), VariableAccessValue.class);
assertEquals("localvar", access.getVariable().getValue());
access = assertInstance(access.base(), VariableAccessValue.class);
assertEquals("here", access.getVariable().getValue());
access = assertInstance(access.base(), VariableAccessValue.class);
assertEquals("test", access.getVariable().getValue());
assertEquals("main", assertInstance(access.base(), StaticValue.class).getToken().getValue());
} }
} }