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.java.JavaElement;
|
||||
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.LambdaValue;
|
||||
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)
|
||||
.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 = value_instance_array.redirect(this.current);
|
||||
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.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) -> {
|
||||
validator.getBag().set(new ValueChainBuilder());
|
||||
return true;
|
||||
|
@ -86,9 +101,11 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
|||
(bag, 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_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) -> {
|
||||
validator.getBag().set(new ValueChainBuilder());
|
||||
return true;
|
||||
|
|
|
@ -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.ArrayValue;
|
||||
import dev.peerat.parser.java.value.BiValue;
|
||||
import dev.peerat.parser.java.value.LambdaValue;
|
||||
import dev.peerat.parser.java.value.MethodCallValue;
|
||||
|
@ -273,6 +274,57 @@ public class ValueTypesTests {
|
|||
|
||||
assertInstance(parse("(hello)"), StaticValue.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