ValueChainBuilder -> Lambda
This commit is contained in:
parent
b87e25c8da
commit
eecf2e36d7
10 changed files with 190 additions and 127 deletions
|
@ -71,91 +71,4 @@ public class TokenValidator{
|
||||||
return this.bag;
|
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<Token, Boolean> 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<Token, Boolean> action, BiConsumer<Bag, Token> 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;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,12 @@ import dev.peerat.parser.TokenType;
|
||||||
import dev.peerat.parser.java.Annotation.Annotable;
|
import dev.peerat.parser.java.Annotation.Annotable;
|
||||||
import dev.peerat.parser.java.Operation.OperationContainer;
|
import dev.peerat.parser.java.Operation.OperationContainer;
|
||||||
import dev.peerat.parser.java.Variable.VariableContainer;
|
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.java.visitor.JavaVisitor;
|
||||||
import dev.peerat.parser.visitor.VisitorBag;
|
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{
|
public static interface FunctionContainer{
|
||||||
|
|
||||||
|
@ -62,6 +64,11 @@ public class Function extends Annotable implements VariableContainer, OperationC
|
||||||
this.elements.add(operation);
|
this.elements.add(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addValue(Value value) {
|
||||||
|
this.elements.add(value);
|
||||||
|
}
|
||||||
|
|
||||||
public int getModifier(){
|
public int getModifier(){
|
||||||
return this.mod;
|
return this.mod;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,7 +89,7 @@ public class JavaTokenizer extends Tokenizer{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parse(String line){
|
public void parse(String line){
|
||||||
System.out.println("tokenizer");
|
System.out.println("tokenizer "+line);
|
||||||
int lineNumber = 1;
|
int lineNumber = 1;
|
||||||
boolean longCommentary = false;
|
boolean longCommentary = false;
|
||||||
for(int i = 0; i < line.length(); i++){
|
for(int i = 0; i < line.length(); i++){
|
||||||
|
|
|
@ -20,7 +20,7 @@ public class Variable extends Annotable{
|
||||||
}
|
}
|
||||||
|
|
||||||
private int mod;
|
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 Token name;
|
||||||
private boolean elips;
|
private boolean elips;
|
||||||
private Value value;
|
private Value value;
|
||||||
|
|
|
@ -9,10 +9,12 @@ import dev.peerat.parser.java.Operation;
|
||||||
import dev.peerat.parser.java.Variable;
|
import dev.peerat.parser.java.Variable;
|
||||||
import dev.peerat.parser.java.Operation.OperationContainer;
|
import dev.peerat.parser.java.Operation.OperationContainer;
|
||||||
import dev.peerat.parser.java.Variable.VariableContainer;
|
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.java.visitor.JavaVisitor;
|
||||||
import dev.peerat.parser.visitor.VisitorBag;
|
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<JavaElement> elements;
|
private List<JavaElement> elements;
|
||||||
|
|
||||||
|
@ -30,6 +32,11 @@ public abstract class OperationBag extends Operation implements VariableContaine
|
||||||
this.elements.add(operation);
|
this.elements.add(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addValue(Value value) {
|
||||||
|
this.elements.add(value);
|
||||||
|
}
|
||||||
|
|
||||||
public List<JavaElement> getElements(){
|
public List<JavaElement> getElements(){
|
||||||
return this.elements;
|
return this.elements;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ public class FunctionContainerTree extends SyntaxTree<JavaElement> {
|
||||||
public void init() {
|
public void init() {
|
||||||
StateTree<JavaElement> variable = this.registery.getNode(VariableTree.class);
|
StateTree<JavaElement> variable = this.registery.getNode(VariableTree.class);
|
||||||
StateTree<JavaElement> operation = this.registery.getNode(OperationTree.class);
|
StateTree<JavaElement> operation = this.registery.getNode(OperationTree.class);
|
||||||
|
StateTree<JavaElement> value = this.registery.getNode(ValueTree.class);
|
||||||
|
|
||||||
StateTree<JavaElement> function_container = this.current;
|
StateTree<JavaElement> function_container = this.current;
|
||||||
function_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";")))
|
function_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";")))
|
||||||
|
@ -23,6 +24,7 @@ public class FunctionContainerTree extends SyntaxTree<JavaElement> {
|
||||||
|
|
||||||
function_container.then(variable);
|
function_container.then(variable);
|
||||||
function_container.then(operation);
|
function_container.then(operation);
|
||||||
|
function_container.then((v) -> { System.out.println("then its just a value ?"); return true;}).then(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,8 @@ 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.BiValue;
|
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.MethodCallValue;
|
||||||
import dev.peerat.parser.java.value.ModifierValue;
|
import dev.peerat.parser.java.value.ModifierValue;
|
||||||
import dev.peerat.parser.java.value.StaticValue;
|
import dev.peerat.parser.java.value.StaticValue;
|
||||||
|
@ -84,7 +86,7 @@ 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()));
|
value_name.end(ValueChainBuilder.build((builder) -> builder.buildStatic(), false));
|
||||||
value_name.then(value_operation);
|
value_name.then(value_operation);
|
||||||
|
|
||||||
unary_value.then((validator) -> {
|
unary_value.then((validator) -> {
|
||||||
|
@ -93,23 +95,23 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
}).then((validator) -> validator.validate(
|
}).then((validator) -> validator.validate(
|
||||||
(token) -> token.getType().equals(TokenType.STRING) || token.getType().equals(TokenType.CHAR),
|
(token) -> token.getType().equals(TokenType.STRING) || token.getType().equals(TokenType.CHAR),
|
||||||
(bag, token) -> bag.<ValueChainBuilder>get().constantValue(token)))
|
(bag, token) -> bag.<ValueChainBuilder>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(), 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(), false));
|
||||||
value_operation.equals("<",action("<")).equals("<","action","<<").then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation()));
|
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()));
|
value_operation.equals("+",action("+")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
|
||||||
StateTree<JavaElement> value_operation_bit_and = value_operation.equals("&",action("&"));
|
StateTree<JavaElement> value_operation_bit_and = value_operation.equals("&",action("&"));
|
||||||
value_operation_bit_and.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()));
|
value_operation_bit_and.equals("&",action("&&")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
|
||||||
StateTree<JavaElement> value_operation_bit_or = value_operation.equals("|",action("|"));
|
StateTree<JavaElement> value_operation_bit_or = value_operation.equals("|",action("|"));
|
||||||
value_operation_bit_or.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()));
|
value_operation_bit_or.equals("|",action("||")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false));
|
||||||
|
|
||||||
value.equals("!",modifier()).redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().rebase(local.get())).end(ValueChainBuilder.build((builder) -> builder.buildModifier()));
|
value.equals("!",modifier()).redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().rebase(local.get())).end(ValueChainBuilder.build((builder) -> builder.buildModifier(), false));
|
||||||
|
|
||||||
StateTree<JavaElement> left_value = value.redirect(unary_value, (global, local) -> global.<ValueChainBuilder>get().rebase(local.get()));
|
StateTree<JavaElement> left_value = value.redirect(unary_value, (global, local) -> { if(local.get() instanceof ValueChainBuilder) { global.set(local.get()); global.<ValueChainBuilder>get().extractLambda(); return;} global.<ValueChainBuilder>get().rebase(local.get());});
|
||||||
left_value.end(ValueChainBuilder.build());
|
left_value.end(ValueChainBuilder.build(true));
|
||||||
left_value.equals("?")
|
left_value.equals("?")
|
||||||
.redirect(this.current, (global, local) -> global.set("success", local.get()))
|
.redirect(this.current, (global, local) -> global.set("success", local.get()))
|
||||||
.equals(":")
|
.equals(":")
|
||||||
|
@ -123,7 +125,7 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
StateTree<JavaElement> value_array = left_value.equals("[");
|
StateTree<JavaElement> value_array = left_value.equals("[");
|
||||||
StateTree<JavaElement> value_array_value = value_array.redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().arrayAccess(local.get()));
|
StateTree<JavaElement> value_array_value = value_array.redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().arrayAccess(local.get()));
|
||||||
StateTree<JavaElement> value_array_end = value_array_value.equals("]");
|
StateTree<JavaElement> 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.then(value_array);
|
||||||
value_array_end.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot()).then(value_name);
|
value_array_end.equals(".", (bag, token) -> bag.<ValueChainBuilder>get().dot()).then(value_name);
|
||||||
|
|
||||||
|
@ -132,7 +134,7 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
StateTree<JavaElement> operation_begin = value_name.equals("(", (bag, token) -> bag.<ValueChainBuilder>get().parameter());
|
StateTree<JavaElement> operation_begin = value_name.equals("(", (bag, token) -> bag.<ValueChainBuilder>get().parameter());
|
||||||
StateTree<JavaElement> operation_end = operation_begin.equals(")", (bag, token) -> bag.<ValueChainBuilder>get().parameter());
|
StateTree<JavaElement> operation_end = operation_begin.equals(")", (bag, token) -> bag.<ValueChainBuilder>get().parameter());
|
||||||
operation_end.then(operation_call);
|
operation_end.then(operation_call);
|
||||||
operation_end.end(ValueChainBuilder.build((builder) -> builder.buildMethodCall()));
|
operation_end.end(ValueChainBuilder.build((builder) -> builder.buildMethodCall(), false));
|
||||||
StateTree<JavaElement> operation_value = operation_begin.redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().parameter(local.get()));
|
StateTree<JavaElement> operation_value = operation_begin.redirect(this.current, (global, local) -> global.<ValueChainBuilder>get().parameter(local.get()));
|
||||||
operation_value.then(operation_end);
|
operation_value.then(operation_end);
|
||||||
operation_value.equals(",")
|
operation_value.equals(",")
|
||||||
|
@ -143,13 +145,20 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
return true;
|
return true;
|
||||||
}).equals("(");
|
}).equals("(");
|
||||||
StateTree<JavaElement> value_parenthesis_close = value_parenthesis.equals(")");
|
StateTree<JavaElement> value_parenthesis_close = value_parenthesis.equals(")");
|
||||||
StateTree<JavaElement> value_inside = value_parenthesis.redirect(this.current);
|
StateTree<JavaElement> value_inside = value_parenthesis.redirect(this.current, (global, local) -> {
|
||||||
StateTree<JavaElement> value_inside_type = value_parenthesis.redirect(type);
|
if(local.get() instanceof StaticValue){
|
||||||
|
global.<ValueChainBuilder>get().lambda(new LambdaParameter(global.get("type"), local.<StaticValue>get().getToken()));
|
||||||
|
global.remove("type");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
global.set(local.get());
|
||||||
|
});
|
||||||
|
StateTree<JavaElement> value_inside_type = value_parenthesis.redirect(type, (global, local) -> global.set("type", local.get()));
|
||||||
|
|
||||||
value_inside_type.then(value_inside);
|
value_inside_type.then(value_inside);
|
||||||
StateTree<JavaElement> value_inside_splitter = value_inside.equals(",");
|
StateTree<JavaElement> 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);
|
||||||
|
value_inside_splitter.then(value_inside_type);
|
||||||
|
|
||||||
value_inside.then(value_parenthesis_close);
|
value_inside.then(value_parenthesis_close);
|
||||||
value_inside.then(value_operation);
|
value_inside.then(value_operation);
|
||||||
|
@ -158,10 +167,14 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
|
|
||||||
StateTree<JavaElement> value_lambda = value_parenthesis_close.then((validator) -> validator.validate((token) -> token.getValue().equals("-")) && validator.validate((token) -> token.getValue().equals(">")));
|
StateTree<JavaElement> value_lambda = value_parenthesis_close.then((validator) -> validator.validate((token) -> token.getValue().equals("-")) && validator.validate((token) -> token.getValue().equals(">")));
|
||||||
value_lambda.equals("{")
|
value_lambda.equals("{")
|
||||||
.<JavaElement>end().multiple(function_container)
|
.<JavaElement>end(
|
||||||
|
ValueChainBuilder.build((builder) -> builder.buildLambda(), true)
|
||||||
|
).multiple(function_container)
|
||||||
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end();
|
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end();
|
||||||
|
|
||||||
value_lambda.redirect(unary_value).end();
|
value_lambda.redirect(unary_value, (global, local) -> {
|
||||||
|
global.<ValueChainBuilder>get().buildLambda(local.get());
|
||||||
|
}).end(ValueChainBuilder.build(false));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,20 +188,20 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
|
|
||||||
private static class ValueChainBuilder{
|
private static class ValueChainBuilder{
|
||||||
|
|
||||||
static BiFunction<JavaElement, Bag, JavaElement> build(Consumer<ValueChainBuilder> builder){
|
static BiFunction<JavaElement, Bag, JavaElement> build(Consumer<ValueChainBuilder> builder, boolean returnValue){
|
||||||
return (parent, bag) -> {
|
return (parent, bag) -> {
|
||||||
ValueChainBuilder chainBuilder = bag.get();
|
ValueChainBuilder chainBuilder = bag.get();
|
||||||
builder.accept(chainBuilder);
|
builder.accept(chainBuilder);
|
||||||
chainBuilder.build(parent, bag);
|
chainBuilder.build(parent, bag);
|
||||||
return null;
|
return returnValue ? bag.get() : null;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static BiFunction<JavaElement, Bag, JavaElement> build(){
|
static BiFunction<JavaElement, Bag, JavaElement> build(boolean returnValue){
|
||||||
return (parent, bag) -> {
|
return (parent, bag) -> {
|
||||||
ValueChainBuilder chainBuilder = bag.get();
|
ValueChainBuilder chainBuilder = bag.get();
|
||||||
chainBuilder.build(parent, bag);
|
chainBuilder.build(parent, bag);
|
||||||
return null;
|
return returnValue ? bag.get() : null;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,6 +217,8 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
|
|
||||||
private List<Value> parameters;
|
private List<Value> parameters;
|
||||||
|
|
||||||
|
private List<LambdaParameter> lambda;
|
||||||
|
|
||||||
ValueChainBuilder(){
|
ValueChainBuilder(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -262,6 +277,15 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
this.base = new ArrayAccessValue(this.base, value);
|
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(){
|
public void buildModifier(){
|
||||||
if(this.base == null) return; //TODO throws exception in this case
|
if(this.base == null) return; //TODO throws exception in this case
|
||||||
this.base = new ModifierValue(this.modifier, this.base);
|
this.base = new ModifierValue(this.modifier, this.base);
|
||||||
|
@ -285,6 +309,20 @@ public class ValueTree extends SyntaxTree<JavaElement> { //TODO order tree by mo
|
||||||
this.base = new VariableAccessValue(this.base, this.current);
|
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){
|
public void build(JavaElement parent, Bag bag){
|
||||||
bag.set(base);
|
bag.set(base);
|
||||||
if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(base);
|
if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(base);
|
||||||
|
|
|
@ -10,26 +10,26 @@ import dev.peerat.parser.java.Operation;
|
||||||
import dev.peerat.parser.java.Variable;
|
import dev.peerat.parser.java.Variable;
|
||||||
import dev.peerat.parser.java.Operation.OperationContainer;
|
import dev.peerat.parser.java.Operation.OperationContainer;
|
||||||
import dev.peerat.parser.java.Variable.VariableContainer;
|
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.java.visitor.JavaVisitor;
|
||||||
import dev.peerat.parser.visitor.VisitorBag;
|
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<Token> parameters;
|
private List<LambdaParameter> parameters;
|
||||||
private List<JavaElement> operations;
|
private List<JavaElement> operations;
|
||||||
|
|
||||||
public LambdaValue(List<Token> parameters, List<JavaElement> operations){
|
public LambdaValue(List<LambdaParameter> parameters){
|
||||||
this.parameters = parameters;
|
|
||||||
this.operations = operations;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LambdaValue(List<Token> parameters, Value value){
|
|
||||||
this.parameters = parameters;
|
this.parameters = parameters;
|
||||||
this.operations = new ArrayList<>();
|
this.operations = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public LambdaValue(List<LambdaParameter> parameters, Value value){
|
||||||
|
this(parameters);
|
||||||
this.operations.add(value);
|
this.operations.add(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Token> getParameters(){
|
public List<LambdaParameter> getParameters(){
|
||||||
return this.parameters;
|
return this.parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +46,11 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo
|
||||||
public void addOperation(Operation operation) {
|
public void addOperation(Operation operation) {
|
||||||
this.operations.add(operation);
|
this.operations.add(operation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addValue(Value value){
|
||||||
|
this.operations.add(value);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Builder builder) throws Exception {
|
public void build(Builder builder) throws Exception {
|
||||||
|
@ -61,6 +66,11 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo
|
||||||
public <E extends JavaElement> void findAll(Function<JavaElement, Boolean> finder, List<E> list) {
|
public <E extends JavaElement> void findAll(Function<JavaElement, Boolean> finder, List<E> list) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return "[LambdaValue] "+parameters+"";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VisitorBag visit(JavaVisitor<?> visitor) {
|
public VisitorBag visit(JavaVisitor<?> visitor) {
|
||||||
|
@ -72,5 +82,27 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo
|
||||||
return bag;
|
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+"]";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ public class RedirectStateTree<E, T extends E> extends StateTree<T>{
|
||||||
|
|
||||||
TokenValidator branch = validator.branch();
|
TokenValidator branch = validator.branch();
|
||||||
branch.setBag(localBag);
|
branch.setBag(localBag);
|
||||||
BuilderStateTree<E, ?> builded = redirect.internalSeed(branch, (E) element);
|
BuilderStateTree<E, ?> builded = redirect.internalSeed(branch, null);
|
||||||
if(builded == null) return null;
|
if(builded == null) return null;
|
||||||
builded.build(branch, element);
|
builded.build(branch, element);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package dev.peerat.parser.java;
|
package dev.peerat.parser.java;
|
||||||
|
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import java.util.List;
|
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.tree.JavaTreeType;
|
||||||
import dev.peerat.parser.java.value.ArrayAccessValue;
|
import dev.peerat.parser.java.value.ArrayAccessValue;
|
||||||
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.MethodCallValue;
|
import dev.peerat.parser.java.value.MethodCallValue;
|
||||||
import dev.peerat.parser.java.value.ModifierValue;
|
import dev.peerat.parser.java.value.ModifierValue;
|
||||||
import dev.peerat.parser.java.value.StaticValue;
|
import dev.peerat.parser.java.value.StaticValue;
|
||||||
|
@ -209,6 +209,70 @@ public class ValueTypesTests {
|
||||||
access = assertInstance(access.base(), VariableAccessValue.class);
|
access = assertInstance(access.base(), VariableAccessValue.class);
|
||||||
assertEquals("test", access.getVariable().getValue());
|
assertEquals("test", access.getVariable().getValue());
|
||||||
assertEquals("main", assertInstance(access.base(), StaticValue.class).getToken().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);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue