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 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){
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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){
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue