ValueChainBuilder -> ArrayValue

This commit is contained in:
jeffcheasey88 2025-04-17 16:05:53 +02:00
parent eecf2e36d7
commit 7ea0ba8878
2 changed files with 75 additions and 6 deletions

View file

@ -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;

View file

@ -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());
} }
} }