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

View file

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

View file

@ -40,14 +40,12 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
// VALUE
StateTree<JavaElement> value = this.current.then((validator) -> {
validator.getBag().set(new ValueChainBuilder());
System.out.println("HELLO JAVA "+validator.getBag());
return true;
});
StateTree<JavaElement> unary_value = new StateTree<>();
StateTree<JavaElement> value_operation = new StateTree<>();
StateTree<JavaElement> redirectRight = new RedirectStateTree<>(this.current, (global, local) -> {
System.out.println("redirectRight g="+global+" ,l="+local);
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()));
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.equals("?")
.redirect(this.current, (global, local) -> global.set("success", local.get()))
.equals(":")
.redirect(this.current, (global, local) -> global.set("fail", local.get()))
.end((parent, bag) -> {
System.out.println("tri value "+bag);
bag.set(new TriValue(bag.<ValueChainBuilder>get().base, bag.get("success"), bag.get("fail")));
if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(bag.get());
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){
return (parent, bag) -> {
System.out.println("build chain "+bag);
ValueChainBuilder chainBuilder = bag.get();
builder.accept(chainBuilder);
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(){
return (parent, bag) -> {
System.out.println("build chain "+bag);
ValueChainBuilder chainBuilder = bag.get();
chainBuilder.build(parent, bag);
return null;
@ -247,7 +242,6 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
buildVariableAccess();
this.current = null;
}
System.out.println("dot "+this);
}
public void parameter(Value value){
@ -262,11 +256,9 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
buildMethodCall();
this.current = null;
this.parameters = null;
System.out.println("parameter "+this);
}
public void arrayAccess(Value value){
System.out.println("ARRAY ACCESS "+this);
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 BiConsumer<Bag, Bag> group;
private StackTraceElement calling;
public RedirectStateTree(StateTree<E> redirect, BiConsumer<Bag, Bag> group){
super();
this.redirect = redirect;
this.group = group;
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
int current = 0;
while((current < trace.length) && (!(trace[++current].getClassName().contains("Value"))));
this.calling = trace[current];
// StackTraceElement[] trace = Thread.currentThread().getStackTrace();
// int current = 0;
// while((current < trace.length) && (!(trace[++current].getClassName().contains("Value"))));
//
// this.calling = trace[current];
}
@Override
BuilderStateTree<T, ?> internalSeed(TokenValidator validator, T element){
System.out.println("[redirect into] "+calling);
Bag currentBag = validator.getBag();
Bag localBag = new Bag();
@ -36,8 +33,6 @@ public class RedirectStateTree<E, T extends E> extends StateTree<T>{
if(builded == null) return null;
builded.build(branch, element);
System.out.println("[redirect done] "+calling);
this.group.accept(currentBag, localBag);
branch.setBag(currentBag);
validator.merge(branch);

View file

@ -17,21 +17,11 @@ public class StateTree<E>{
Function<TokenValidator, Boolean> checker;
private BuilderStateTree<E, ?> builder;
private StackTraceElement origin;
//TODO checker in constructeur ?
public StateTree(){
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){
while(validator.hasNext()){
BuilderStateTree<E, ?> build = internalSeed(validator, container);
@ -41,12 +31,9 @@ public class StateTree<E>{
}
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
System.out.println("internalSeed "+origin);
for(StateTree<E> child : this.childs){
System.out.println("internalSeed "+origin+" child: "+child.origin);
TokenValidator branch = validator.branch();
if(child.checker == null){
System.out.println("checker null");
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
if(builded != null){
validator.merge(branch);
@ -54,9 +41,7 @@ public class StateTree<E>{
}
continue;
}
System.out.println("try checker");
if(child.checker.apply(branch)){
System.out.println("pass");
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
if(builded != null){
validator.merge(branch);
@ -77,7 +62,6 @@ public class StateTree<E>{
StateTree<E> state = new StateTree<>();
state.checker = checker;
this.childs.add(state);
state.origin();
return state;
}
@ -114,10 +98,7 @@ public class StateTree<E>{
}
public StateTree<E> redirect(StateTree<E> target){
return then(new RedirectStateTree<>(target, (global, local) -> {
System.out.println("\nMERGE:\n\t"+global+"\n\t"+local+"\n");
global.set(local.get());
}));
return then(new RedirectStateTree<>(target, (global, local) -> global.set(local.get())));
}
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.java.tree.JavaTreeType;
import dev.peerat.parser.java.value.ArrayAccessValue;
import dev.peerat.parser.java.value.BiValue;
import dev.peerat.parser.java.value.MethodCallValue;
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.Value;
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.visitor.VisitorBag;
@ -188,6 +190,25 @@ public class ValueTypesTests {
assertEquals("test", v.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());
}
}