diff --git a/src/dev/peerat/parser/TokenValidator.java b/src/dev/peerat/parser/TokenValidator.java index 93319a1..c770aaf 100644 --- a/src/dev/peerat/parser/TokenValidator.java +++ b/src/dev/peerat/parser/TokenValidator.java @@ -71,91 +71,4 @@ public class TokenValidator{ return this.bag; } -// private Token[] elements; -// private int index; -// private int validated; -// -// private Bag bag; -// -// public TokenValidator(Token[] tokens){ -// this.elements = tokens; -// this.validated = -1; -// this.bag = new Bag(); -// } -// -// @Override -// public boolean hasNext(){ -// return index < elements.length; -// } -// -// @Override -// public Token next(){ -// return elements[index++]; -// } -// -// public boolean validate(Function action){ -// if(index >= this.elements.length) return false; -// if(action.apply(this.elements[index])){ -// System.out.println("validate "+elements[index]); -// this.validated = index; -// next(); -// return true; -// } -// return false; -// } -// -// public boolean validate(Function action, BiConsumer filler){ -// if(validate(action)){ -// filler.accept(bag, elements[index-1]); -// return true; -// } -// return false; -// } -// -// public void rollbackValidate(){ -// this.index = validated+1; -// } -// -// public TokenValidator pullValidated(){ -// Token[] validated = new Token[this.validated+1]; -// System.arraycopy(this.elements, 0, validated, 0, validated.length); -// TokenValidator tk = new TokenValidator(validated); -// tk.bag = bag; -// return tk; -// } -// -// public void pushValidated(){ -// Token[] validated = new Token[this.elements.length-(this.validated+1)]; -// System.arraycopy(this.elements, this.validated+1, validated, 0, validated.length); -// this.elements = validated; -// this.index = 0; -// this.validated = -1; -// } -// -// public TokenValidator branch(){ -// pushValidated(); -// TokenValidator branch = new TokenValidator(this.elements); -// branch.bag = this.bag; -// return branch; -// } -// -// public void merge(TokenValidator branch){ -// branch.pushValidated(); -// this.elements = branch.elements; -// this.index = 0; -// this.validated = -1; -// } -// -// public Token[] toArray(){ -// return this.elements; -// } -// -// public void setBag(Bag bag){ -// this.bag = bag; -// } -// -// public Bag getBag(){ -// return this.bag; -// } -// } diff --git a/src/dev/peerat/parser/java/Function.java b/src/dev/peerat/parser/java/Function.java index 03d247a..5c2b821 100644 --- a/src/dev/peerat/parser/java/Function.java +++ b/src/dev/peerat/parser/java/Function.java @@ -9,10 +9,12 @@ import dev.peerat.parser.TokenType; import dev.peerat.parser.java.Annotation.Annotable; import dev.peerat.parser.java.Operation.OperationContainer; import dev.peerat.parser.java.Variable.VariableContainer; +import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.java.value.Value.ValueContainer; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public class Function extends Annotable implements VariableContainer, OperationContainer{ +public class Function extends Annotable implements VariableContainer, OperationContainer, ValueContainer{ public static interface FunctionContainer{ @@ -62,6 +64,11 @@ public class Function extends Annotable implements VariableContainer, OperationC this.elements.add(operation); } + @Override + public void addValue(Value value) { + this.elements.add(value); + } + public int getModifier(){ return this.mod; } diff --git a/src/dev/peerat/parser/java/JavaTokenizer.java b/src/dev/peerat/parser/java/JavaTokenizer.java index 0231fec..f841ed8 100644 --- a/src/dev/peerat/parser/java/JavaTokenizer.java +++ b/src/dev/peerat/parser/java/JavaTokenizer.java @@ -89,7 +89,7 @@ public class JavaTokenizer extends Tokenizer{ @Override public void parse(String line){ - System.out.println("tokenizer"); + System.out.println("tokenizer "+line); int lineNumber = 1; boolean longCommentary = false; for(int i = 0; i < line.length(); i++){ diff --git a/src/dev/peerat/parser/java/Variable.java b/src/dev/peerat/parser/java/Variable.java index 8a08df4..fa3485f 100644 --- a/src/dev/peerat/parser/java/Variable.java +++ b/src/dev/peerat/parser/java/Variable.java @@ -20,7 +20,7 @@ public class Variable extends Annotable{ } private int mod; - private Token type; + private Token type; //TODO change to an independant objet ? to split package, name and generic private Token name; private boolean elips; private Value value; diff --git a/src/dev/peerat/parser/java/operation/OperationBag.java b/src/dev/peerat/parser/java/operation/OperationBag.java index 67453c0..dfc24cb 100644 --- a/src/dev/peerat/parser/java/operation/OperationBag.java +++ b/src/dev/peerat/parser/java/operation/OperationBag.java @@ -9,10 +9,12 @@ import dev.peerat.parser.java.Operation; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.Operation.OperationContainer; import dev.peerat.parser.java.Variable.VariableContainer; +import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.java.value.Value.ValueContainer; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public abstract class OperationBag extends Operation implements VariableContainer, OperationContainer{ +public abstract class OperationBag extends Operation implements VariableContainer, OperationContainer, ValueContainer{ private List elements; @@ -30,6 +32,11 @@ public abstract class OperationBag extends Operation implements VariableContaine this.elements.add(operation); } + @Override + public void addValue(Value value) { + this.elements.add(value); + } + public List getElements(){ return this.elements; } diff --git a/src/dev/peerat/parser/java/tree/FunctionContainerTree.java b/src/dev/peerat/parser/java/tree/FunctionContainerTree.java index 2fb8b0f..2ea63e1 100644 --- a/src/dev/peerat/parser/java/tree/FunctionContainerTree.java +++ b/src/dev/peerat/parser/java/tree/FunctionContainerTree.java @@ -16,6 +16,7 @@ public class FunctionContainerTree extends SyntaxTree { public void init() { StateTree variable = this.registery.getNode(VariableTree.class); StateTree operation = this.registery.getNode(OperationTree.class); + StateTree value = this.registery.getNode(ValueTree.class); StateTree function_container = this.current; function_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) @@ -23,6 +24,7 @@ public class FunctionContainerTree extends SyntaxTree { function_container.then(variable); function_container.then(operation); + function_container.then((v) -> { System.out.println("then its just a value ?"); return true;}).then(value); } } diff --git a/src/dev/peerat/parser/java/tree/ValueTree.java b/src/dev/peerat/parser/java/tree/ValueTree.java index c5cdf50..72c2e40 100644 --- a/src/dev/peerat/parser/java/tree/ValueTree.java +++ b/src/dev/peerat/parser/java/tree/ValueTree.java @@ -13,6 +13,8 @@ import dev.peerat.parser.TokenType; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.ArrayAccessValue; import dev.peerat.parser.java.value.BiValue; +import dev.peerat.parser.java.value.LambdaValue; +import dev.peerat.parser.java.value.LambdaValue.LambdaParameter; import dev.peerat.parser.java.value.MethodCallValue; import dev.peerat.parser.java.value.ModifierValue; import dev.peerat.parser.java.value.StaticValue; @@ -84,7 +86,7 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo (bag, token) ->{ bag.get().nameValue(token); })); - value_name.end(ValueChainBuilder.build((builder) -> builder.buildStatic())); + value_name.end(ValueChainBuilder.build((builder) -> builder.buildStatic(), false)); value_name.then(value_operation); unary_value.then((validator) -> { @@ -93,23 +95,23 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo }).then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.STRING) || token.getType().equals(TokenType.CHAR), (bag, token) -> bag.get().constantValue(token))) - .end(ValueChainBuilder.build((builder) -> builder.buildStatic())); + .end(ValueChainBuilder.build((builder) -> builder.buildStatic(), false)); - value_operation.equals(">", action(">")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation())); - value_operation.equals("<",action("<")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation())); - value_operation.equals("<",action("<")).equals("<","action","<<").then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation())); - value_operation.equals("+",action("+")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation())); + value_operation.equals(">", action(">")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + value_operation.equals("<",action("<")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + value_operation.equals("<",action("<")).equals("<","action","<<").then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + value_operation.equals("+",action("+")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); StateTree value_operation_bit_and = value_operation.equals("&",action("&")); - value_operation_bit_and.then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation())); - value_operation_bit_and.equals("&",action("&&")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation())); + value_operation_bit_and.then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + value_operation_bit_and.equals("&",action("&&")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); StateTree value_operation_bit_or = value_operation.equals("|",action("|")); - value_operation_bit_or.then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation())); - value_operation_bit_or.equals("|",action("||")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation())); + value_operation_bit_or.then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + value_operation_bit_or.equals("|",action("||")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); - value.equals("!",modifier()).redirect(this.current, (global, local) -> global.get().rebase(local.get())).end(ValueChainBuilder.build((builder) -> builder.buildModifier())); + value.equals("!",modifier()).redirect(this.current, (global, local) -> global.get().rebase(local.get())).end(ValueChainBuilder.build((builder) -> builder.buildModifier(), false)); - StateTree left_value = value.redirect(unary_value, (global, local) -> global.get().rebase(local.get())); - left_value.end(ValueChainBuilder.build()); + StateTree left_value = value.redirect(unary_value, (global, local) -> { if(local.get() instanceof ValueChainBuilder) { global.set(local.get()); global.get().extractLambda(); return;} global.get().rebase(local.get());}); + left_value.end(ValueChainBuilder.build(true)); left_value.equals("?") .redirect(this.current, (global, local) -> global.set("success", local.get())) .equals(":") @@ -123,7 +125,7 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo StateTree value_array = left_value.equals("["); StateTree value_array_value = value_array.redirect(this.current, (global, local) -> global.get().arrayAccess(local.get())); StateTree value_array_end = value_array_value.equals("]"); - value_array_end.end(ValueChainBuilder.build()); + value_array_end.end(ValueChainBuilder.build(false)); value_array_end.then(value_array); value_array_end.equals(".", (bag, token) -> bag.get().dot()).then(value_name); @@ -132,7 +134,7 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo StateTree operation_begin = value_name.equals("(", (bag, token) -> bag.get().parameter()); StateTree operation_end = operation_begin.equals(")", (bag, token) -> bag.get().parameter()); operation_end.then(operation_call); - operation_end.end(ValueChainBuilder.build((builder) -> builder.buildMethodCall())); + operation_end.end(ValueChainBuilder.build((builder) -> builder.buildMethodCall(), false)); StateTree operation_value = operation_begin.redirect(this.current, (global, local) -> global.get().parameter(local.get())); operation_value.then(operation_end); operation_value.equals(",") @@ -143,13 +145,20 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo return true; }).equals("("); StateTree value_parenthesis_close = value_parenthesis.equals(")"); - StateTree value_inside = value_parenthesis.redirect(this.current); - StateTree value_inside_type = value_parenthesis.redirect(type); + StateTree value_inside = value_parenthesis.redirect(this.current, (global, local) -> { + if(local.get() instanceof StaticValue){ + global.get().lambda(new LambdaParameter(global.get("type"), local.get().getToken())); + global.remove("type"); + return; + } + global.set(local.get()); + }); + StateTree value_inside_type = value_parenthesis.redirect(type, (global, local) -> global.set("type", local.get())); value_inside_type.then(value_inside); StateTree value_inside_splitter = value_inside.equals(","); - value_inside_splitter.then(value_inside_type); value_inside_splitter.then(value_inside); + value_inside_splitter.then(value_inside_type); value_inside.then(value_parenthesis_close); value_inside.then(value_operation); @@ -158,10 +167,14 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo StateTree value_lambda = value_parenthesis_close.then((validator) -> validator.validate((token) -> token.getValue().equals("-")) && validator.validate((token) -> token.getValue().equals(">"))); value_lambda.equals("{") - .end().multiple(function_container) + .end( + ValueChainBuilder.build((builder) -> builder.buildLambda(), true) + ).multiple(function_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); - value_lambda.redirect(unary_value).end(); + value_lambda.redirect(unary_value, (global, local) -> { + global.get().buildLambda(local.get()); + }).end(ValueChainBuilder.build(false)); } @@ -175,20 +188,20 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo private static class ValueChainBuilder{ - static BiFunction build(Consumer builder){ + static BiFunction build(Consumer builder, boolean returnValue){ return (parent, bag) -> { ValueChainBuilder chainBuilder = bag.get(); builder.accept(chainBuilder); chainBuilder.build(parent, bag); - return null; + return returnValue ? bag.get() : null; }; } - static BiFunction build(){ + static BiFunction build(boolean returnValue){ return (parent, bag) -> { ValueChainBuilder chainBuilder = bag.get(); chainBuilder.build(parent, bag); - return null; + return returnValue ? bag.get() : null; }; } @@ -204,6 +217,8 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo private List parameters; + private List lambda; + ValueChainBuilder(){ } @@ -262,6 +277,15 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo this.base = new ArrayAccessValue(this.base, value); } + public void lambda(LambdaParameter value){ + if(this.lambda == null) this.lambda = new ArrayList<>(); + else{ + LambdaParameter last = this.lambda.get(this.lambda.size()-1); + if(last.getName().equals(value.getType())) this.lambda.remove(this.lambda.size()-1); + } + this.lambda.add(value); + } + public void buildModifier(){ if(this.base == null) return; //TODO throws exception in this case this.base = new ModifierValue(this.modifier, this.base); @@ -285,6 +309,20 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo this.base = new VariableAccessValue(this.base, this.current); } + public void buildLambda(){ + this.base = new LambdaValue(this.lambda == null ? new ArrayList<>() : this.lambda); + this.lambda = null; + } + + public void buildLambda(Value value){ + this.base = new LambdaValue(this.lambda == null ? new ArrayList<>() : this.lambda, value); + this.lambda = null; + } + + public void extractLambda(){ + this.base = new StaticValue(this.lambda.get(0).getName()); + } + public void build(JavaElement parent, Bag bag){ bag.set(base); if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(base); diff --git a/src/dev/peerat/parser/java/value/LambdaValue.java b/src/dev/peerat/parser/java/value/LambdaValue.java index ee8b576..16dd8c0 100644 --- a/src/dev/peerat/parser/java/value/LambdaValue.java +++ b/src/dev/peerat/parser/java/value/LambdaValue.java @@ -10,26 +10,26 @@ import dev.peerat.parser.java.Operation; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.Operation.OperationContainer; import dev.peerat.parser.java.Variable.VariableContainer; +import dev.peerat.parser.java.value.Value.ValueContainer; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public class LambdaValue extends Value implements OperationContainer, VariableContainer{ +public class LambdaValue extends Value implements OperationContainer, VariableContainer, ValueContainer{ - private List parameters; + private List parameters; private List operations; - public LambdaValue(List parameters, List operations){ - this.parameters = parameters; - this.operations = operations; - } - - public LambdaValue(List parameters, Value value){ + public LambdaValue(List parameters){ this.parameters = parameters; this.operations = new ArrayList<>(); + } + + public LambdaValue(List parameters, Value value){ + this(parameters); this.operations.add(value); } - public List getParameters(){ + public List getParameters(){ return this.parameters; } @@ -46,6 +46,11 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo public void addOperation(Operation operation) { this.operations.add(operation); } + + @Override + public void addValue(Value value){ + this.operations.add(value); + } @Override public void build(Builder builder) throws Exception { @@ -61,6 +66,11 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo public void findAll(Function finder, List list) { } + + @Override + public String toString(){ + return "[LambdaValue] "+parameters+""; + } @Override public VisitorBag visit(JavaVisitor visitor) { @@ -72,5 +82,27 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo return bag; } - + public static class LambdaParameter{ + + private Token type; + private Token name; + + public LambdaParameter(Token type, Token name){ + this.type = type; + this.name = name; + } + + public Token getType(){ + return this.type; + } + + public Token getName(){ + return this.name; + } + + @Override + public String toString(){ + return "LambdaValue[type="+type+",name="+name+"]"; + } + } } diff --git a/src/dev/peerat/parser/state/RedirectStateTree.java b/src/dev/peerat/parser/state/RedirectStateTree.java index 2239ae1..a7f6308 100644 --- a/src/dev/peerat/parser/state/RedirectStateTree.java +++ b/src/dev/peerat/parser/state/RedirectStateTree.java @@ -29,7 +29,7 @@ public class RedirectStateTree extends StateTree{ TokenValidator branch = validator.branch(); branch.setBag(localBag); - BuilderStateTree builded = redirect.internalSeed(branch, (E) element); + BuilderStateTree builded = redirect.internalSeed(branch, null); if(builded == null) return null; builded.build(branch, element); diff --git a/test/dev/peerat/parser/java/ValueTypesTests.java b/test/dev/peerat/parser/java/ValueTypesTests.java index d9399ee..5d807a6 100644 --- a/test/dev/peerat/parser/java/ValueTypesTests.java +++ b/test/dev/peerat/parser/java/ValueTypesTests.java @@ -1,7 +1,6 @@ package dev.peerat.parser.java; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; @@ -16,6 +15,7 @@ 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.BiValue; +import dev.peerat.parser.java.value.LambdaValue; import dev.peerat.parser.java.value.MethodCallValue; import dev.peerat.parser.java.value.ModifierValue; import dev.peerat.parser.java.value.StaticValue; @@ -209,6 +209,70 @@ public class ValueTypesTests { access = assertInstance(access.base(), VariableAccessValue.class); assertEquals("test", access.getVariable().getValue()); assertEquals("main", assertInstance(access.base(), StaticValue.class).getToken().getValue()); + } + + @Test + public void onLambdaValue() throws Exception{ + LambdaValue lv = assertInstance(parse("() -> {}"), LambdaValue.class); + assertEquals(0, lv.getParameters().size()+lv.getOperations().size()); + + lv = assertInstance(parse("(a) -> {}"), LambdaValue.class); + assertEquals(1, lv.getParameters().size()); + assertNull(lv.getParameters().get(0).getType()); + assertEquals("a", lv.getParameters().get(0).getName().getValue()); + assertEquals(0, lv.getOperations().size()); + lv = assertInstance(parse("(a,b) -> {}"), LambdaValue.class); + assertEquals(2, lv.getParameters().size()); + assertNull(lv.getParameters().get(0).getType()); + assertEquals("a", lv.getParameters().get(0).getName().getValue()); + assertNull(lv.getParameters().get(1).getType()); + assertEquals("b", lv.getParameters().get(1).getName().getValue()); + assertEquals(0, lv.getOperations().size()); + lv = assertInstance(parse("(int a,b) -> {}"), LambdaValue.class); + assertEquals("int", lv.getParameters().get(0).getType().getValue()); + assertEquals("a", lv.getParameters().get(0).getName().getValue()); + assertNull(lv.getParameters().get(1).getType()); + assertEquals("b", lv.getParameters().get(1).getName().getValue()); + assertEquals(0, lv.getOperations().size()); + lv = assertInstance(parse("(int a, String b) -> {}"), LambdaValue.class); + assertEquals("int", lv.getParameters().get(0).getType().getValue()); + assertEquals("a", lv.getParameters().get(0).getName().getValue()); + assertEquals("String", lv.getParameters().get(1).getType().getValue()); + assertEquals("b", lv.getParameters().get(1).getName().getValue()); + assertEquals(0, lv.getOperations().size()); + lv = assertInstance(parse("(int a, String b) -> true"), LambdaValue.class); + assertEquals("int", lv.getParameters().get(0).getType().getValue()); + assertEquals("a", lv.getParameters().get(0).getName().getValue()); + assertEquals("String", lv.getParameters().get(1).getType().getValue()); + assertEquals("b", lv.getParameters().get(1).getName().getValue()); + assertEquals(1, lv.getOperations().size()); + assertEquals("true", assertInstance(lv.getOperations().get(0), StaticValue.class).getToken().getValue()); + lv = assertInstance(parse("(int a, String b) -> { test(); }"), LambdaValue.class); + assertEquals("int", lv.getParameters().get(0).getType().getValue()); + assertEquals("a", lv.getParameters().get(0).getName().getValue()); + assertEquals("String", lv.getParameters().get(1).getType().getValue()); + assertEquals("b", lv.getParameters().get(1).getName().getValue()); + assertEquals(1, lv.getOperations().size()); + assertEquals("test", assertInstance(lv.getOperations().get(0), MethodCallValue.class).getToken().getValue()); + lv = assertInstance(parse("(int a, String b) -> test()"), LambdaValue.class); + assertEquals("int", lv.getParameters().get(0).getType().getValue()); + assertEquals("a", lv.getParameters().get(0).getName().getValue()); + assertEquals("String", lv.getParameters().get(1).getType().getValue()); + assertEquals("b", lv.getParameters().get(1).getName().getValue()); + assertEquals(1, lv.getOperations().size()); + assertEquals("test", assertInstance(lv.getOperations().get(0), MethodCallValue.class).getToken().getValue()); + + lv = assertInstance(parse("(int a, String b) -> {test(); testu();}"), LambdaValue.class); + assertEquals("int", lv.getParameters().get(0).getType().getValue()); + assertEquals("a", lv.getParameters().get(0).getName().getValue()); + assertEquals("String", lv.getParameters().get(1).getType().getValue()); + assertEquals("b", lv.getParameters().get(1).getName().getValue()); + assertEquals(2, lv.getOperations().size()); + assertEquals("test", assertInstance(lv.getOperations().get(0), MethodCallValue.class).getToken().getValue()); + assertEquals("testu", assertInstance(lv.getOperations().get(1), MethodCallValue.class).getToken().getValue()); + + assertInstance(parse("(hello)"), StaticValue.class); + assertInstance(parse("(8+8)"), BiValue.class); } }