diff --git a/src/dev/peerat/parser/java/tree/ValueTree.java b/src/dev/peerat/parser/java/tree/ValueTree.java index 72c2e40..8b9b666 100644 --- a/src/dev/peerat/parser/java/tree/ValueTree.java +++ b/src/dev/peerat/parser/java/tree/ValueTree.java @@ -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 { //TODO order tree by mo .end().multiple(class_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); - StateTree value_instance_array_init = value_instance_type.equals("{"); - StateTree 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 value_instance_array = value_instance_type.equals("["); StateTree value_instance_array_value = value_instance_array.redirect(this.current); StateTree value_instance_array_end = value_instance_array_value.equals("]"); @@ -78,6 +74,25 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo value_instance_array_end.end(); value_instance_array_end.then(value_instance_array); + StateTree value_instance_array_init = value_instance_array_end.equals("{"); + StateTree value_instance_array_init_value = value_instance_array_init.redirect(this.current, (global, local) -> { + List 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 value_instance_array_value_end = value_instance_array_init_value.equals("}"); + value_instance_array_value_end.end((parent, bag) -> { + ArrayValue result = new ArrayValue(bag.>get("array").toArray(new Value[0])); + bag.set(result); + if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(result); + return null; + }); + StateTree value_name = unary_value.then((validator) -> { validator.getBag().set(new ValueChainBuilder()); return true; @@ -86,9 +101,11 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo (bag, token) ->{ bag.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.get().rebase(new ArrayValue(bag.>get("array").toArray(new Value[0]))); bag.remove("array"); }).then(value_name); + unary_value.then((validator) -> { validator.getBag().set(new ValueChainBuilder()); return true; diff --git a/test/dev/peerat/parser/java/ValueTypesTests.java b/test/dev/peerat/parser/java/ValueTypesTests.java index 5d807a6..675c41e 100644 --- a/test/dev/peerat/parser/java/ValueTypesTests.java +++ b/test/dev/peerat/parser/java/ValueTypesTests.java @@ -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()); } }