ValueChainBuilder -> MethodCall, VariableAccess & ArrayAccess completed + remove debug
This commit is contained in:
parent
27ba275a76
commit
b87e25c8da
6 changed files with 39 additions and 56 deletions
|
@ -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){
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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){
|
||||
|
|
|
@ -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());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue