ValueChainBuilder -> ArrayValue
This commit is contained in:
parent
eecf2e36d7
commit
7ea0ba8878
2 changed files with 75 additions and 6 deletions
|
@ -12,6 +12,7 @@ import dev.peerat.parser.Token;
|
||||||
import dev.peerat.parser.TokenType;
|
import dev.peerat.parser.TokenType;
|
||||||
import dev.peerat.parser.java.JavaElement;
|
import dev.peerat.parser.java.JavaElement;
|
||||||
import dev.peerat.parser.java.value.ArrayAccessValue;
|
import dev.peerat.parser.java.value.ArrayAccessValue;
|
||||||
|
import dev.peerat.parser.java.value.ArrayValue;
|
||||||
import dev.peerat.parser.java.value.BiValue;
|
import dev.peerat.parser.java.value.BiValue;
|
||||||
import dev.peerat.parser.java.value.LambdaValue;
|
import dev.peerat.parser.java.value.LambdaValue;
|
||||||
import dev.peerat.parser.java.value.LambdaValue.LambdaParameter;
|
import dev.peerat.parser.java.value.LambdaValue.LambdaParameter;
|
||||||
|
@ -66,11 +67,6 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
.<JavaElement>end().multiple(class_container)
|
.<JavaElement>end().multiple(class_container)
|
||||||
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end();
|
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end();
|
||||||
|
|
||||||
StateTree<JavaElement> value_instance_array_init = value_instance_type.equals("{");
|
|
||||||
StateTree<JavaElement> value_instance_array_init_value = value_instance_array_init.redirect(this.current);
|
|
||||||
value_instance_array_init_value.equals(",").then(value_instance_array_init_value);
|
|
||||||
value_instance_array_init_value.equals("}").end();
|
|
||||||
|
|
||||||
StateTree<JavaElement> value_instance_array = value_instance_type.equals("[");
|
StateTree<JavaElement> value_instance_array = value_instance_type.equals("[");
|
||||||
StateTree<JavaElement> value_instance_array_value = value_instance_array.redirect(this.current);
|
StateTree<JavaElement> value_instance_array_value = value_instance_array.redirect(this.current);
|
||||||
StateTree<JavaElement> value_instance_array_end = value_instance_array_value.equals("]");
|
StateTree<JavaElement> value_instance_array_end = value_instance_array_value.equals("]");
|
||||||
|
@ -78,6 +74,25 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
value_instance_array_end.end();
|
value_instance_array_end.end();
|
||||||
value_instance_array_end.then(value_instance_array);
|
value_instance_array_end.then(value_instance_array);
|
||||||
|
|
||||||
|
StateTree<JavaElement> value_instance_array_init = value_instance_array_end.equals("{");
|
||||||
|
StateTree<JavaElement> value_instance_array_init_value = value_instance_array_init.redirect(this.current, (global, local) -> {
|
||||||
|
List<Value> list = global.get("array");
|
||||||
|
if(list == null){
|
||||||
|
list = new ArrayList<>();
|
||||||
|
global.set("array", list);
|
||||||
|
}
|
||||||
|
list.add(local.get());
|
||||||
|
});
|
||||||
|
value.equals("{").then(value_instance_array_init_value);
|
||||||
|
value_instance_array_init_value.equals(",").then(value_instance_array_init_value);
|
||||||
|
StateTree<JavaElement> value_instance_array_value_end = value_instance_array_init_value.equals("}");
|
||||||
|
value_instance_array_value_end.end((parent, bag) -> {
|
||||||
|
ArrayValue result = new ArrayValue(bag.<List<Value>>get("array").toArray(new Value[0]));
|
||||||
|
bag.set(result);
|
||||||
|
if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(result);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
StateTree<JavaElement> value_name = unary_value.then((validator) -> {
|
StateTree<JavaElement> value_name = unary_value.then((validator) -> {
|
||||||
validator.getBag().set(new ValueChainBuilder());
|
validator.getBag().set(new ValueChainBuilder());
|
||||||
return true;
|
return true;
|
||||||
|
@ -86,9 +101,11 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
(bag, token) ->{
|
(bag, token) ->{
|
||||||
bag.<ValueChainBuilder>get().nameValue(token);
|
bag.<ValueChainBuilder>get().nameValue(token);
|
||||||
}));
|
}));
|
||||||
value_name.end(ValueChainBuilder.build((builder) -> builder.buildStatic(), false));
|
value_name.end(ValueChainBuilder.build((builder) -> builder.dot(), false));
|
||||||
value_name.then(value_operation);
|
value_name.then(value_operation);
|
||||||
|
|
||||||
|
value_instance_array_value_end.equals(".", (bag, token) -> { bag.<ValueChainBuilder>get().rebase(new ArrayValue(bag.<List<Value>>get("array").toArray(new Value[0]))); bag.remove("array"); }).then(value_name);
|
||||||
|
|
||||||
unary_value.then((validator) -> {
|
unary_value.then((validator) -> {
|
||||||
validator.getBag().set(new ValueChainBuilder());
|
validator.getBag().set(new ValueChainBuilder());
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -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.ArrayAccessValue;
|
||||||
|
import dev.peerat.parser.java.value.ArrayValue;
|
||||||
import dev.peerat.parser.java.value.BiValue;
|
import dev.peerat.parser.java.value.BiValue;
|
||||||
import dev.peerat.parser.java.value.LambdaValue;
|
import dev.peerat.parser.java.value.LambdaValue;
|
||||||
import dev.peerat.parser.java.value.MethodCallValue;
|
import dev.peerat.parser.java.value.MethodCallValue;
|
||||||
|
@ -273,6 +274,57 @@ public class ValueTypesTests {
|
||||||
|
|
||||||
assertInstance(parse("(hello)"), StaticValue.class);
|
assertInstance(parse("(hello)"), StaticValue.class);
|
||||||
assertInstance(parse("(8+8)"), BiValue.class);
|
assertInstance(parse("(8+8)"), BiValue.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onVariableAccessValue() throws Exception{
|
||||||
|
VariableAccessValue v;
|
||||||
|
v = assertInstance(parse("this.test"), VariableAccessValue.class);
|
||||||
|
assertEquals("this", assertInstance(v.base(), StaticValue.class).getToken().getValue());
|
||||||
|
assertEquals("test", v.getVariable().getValue());
|
||||||
|
|
||||||
|
v = assertInstance(parse("array[0].length"), VariableAccessValue.class);
|
||||||
|
assertInstance(v.base(), ArrayAccessValue.class);
|
||||||
|
assertEquals("length", v.getVariable().getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onArrayAccessValue() throws Exception{
|
||||||
|
ArrayAccessValue v;
|
||||||
|
v = assertInstance(parse("array[0]"), ArrayAccessValue.class);
|
||||||
|
assertEquals("0", assertInstance(v.getAccessor(), StaticValue.class).getToken().getValue());
|
||||||
|
assertEquals("array", assertInstance(v.base(), StaticValue.class).getToken().getValue());
|
||||||
|
v = assertInstance(parse("array[0][1]"), ArrayAccessValue.class);
|
||||||
|
assertEquals("1", assertInstance(v.getAccessor(), StaticValue.class).getToken().getValue());
|
||||||
|
v = assertInstance(v.base(), ArrayAccessValue.class);
|
||||||
|
assertEquals("0", assertInstance(v.getAccessor(), StaticValue.class).getToken().getValue());
|
||||||
|
assertEquals("array", assertInstance(v.base(), StaticValue.class).getToken().getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onArrayValue() throws Exception{
|
||||||
|
ArrayValue v;
|
||||||
|
v = assertInstance(parse("{0,1,2,3,4,5,6,7,8,9}"), ArrayValue.class);
|
||||||
|
assertEquals(10, v.getValues().length);
|
||||||
|
for(int i = 0; i < 10; i++){
|
||||||
|
assertEquals(""+i, assertInstance(v.getValues()[i], StaticValue.class).getToken().getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
v = assertInstance(parse("{a,b,c,d,{1,2,3,4},f,g,{1}}"), ArrayValue.class);
|
||||||
|
assertEquals(8, v.getValues().length);
|
||||||
|
for(int i = 0; i < 4; i++){
|
||||||
|
assertEquals(""+(char)('a'+i), assertInstance(v.getValues()[i], StaticValue.class).getToken().getValue());
|
||||||
|
}
|
||||||
|
ArrayValue av = assertInstance(v.getValues()[4], ArrayValue.class);
|
||||||
|
assertEquals(4, av.getValues().length);
|
||||||
|
for(int i = 1; i < 5; i++){
|
||||||
|
assertEquals(""+i, assertInstance(av.getValues()[i-1], StaticValue.class).getToken().getValue());
|
||||||
|
}
|
||||||
|
for(int i = 0; i < 2; i++){
|
||||||
|
assertEquals(""+(char)('f'+i), assertInstance(v.getValues()[i+5], StaticValue.class).getToken().getValue());
|
||||||
|
}
|
||||||
|
av = assertInstance(v.getValues()[7], ArrayValue.class);
|
||||||
|
assertEquals(1, av.getValues().length);
|
||||||
|
assertEquals("1", assertInstance(av.getValues()[0], StaticValue.class).getToken().getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue