From 9b87621a35899dae931a00a6b741948ff6574501 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 <66554203+jeffcheasey88@users.noreply.github.com> Date: Wed, 8 Nov 2023 14:49:23 +0100 Subject: [PATCH] [AST] MethodCall, new Instance, Lambda, fix left&right values --- src/dev/peerat/parser/java/JavaParser.java | 94 +++++++++--- src/dev/peerat/parser/java/Value.java | 142 ++++++++++++++++++ .../parser/java/operation/IfOperation.java | 3 +- .../java/operation/MethodCallOperation.java | 22 ++- 4 files changed, 229 insertions(+), 32 deletions(-) diff --git a/src/dev/peerat/parser/java/JavaParser.java b/src/dev/peerat/parser/java/JavaParser.java index 8175381..76346ac 100644 --- a/src/dev/peerat/parser/java/JavaParser.java +++ b/src/dev/peerat/parser/java/JavaParser.java @@ -25,10 +25,15 @@ import dev.peerat.parser.java.Annotation.AnnotableBuffer; import dev.peerat.parser.java.Function.FunctionContainer; import dev.peerat.parser.java.Operation.OperationContainer; import dev.peerat.parser.java.Value.BiValue; +import dev.peerat.parser.java.Value.InstanceValue; +import dev.peerat.parser.java.Value.LambdaValue; +import dev.peerat.parser.java.Value.MethodCallValue; import dev.peerat.parser.java.Variable.VariableContainer; +import dev.peerat.parser.java.operation.AssignOperation; import dev.peerat.parser.java.operation.BreakOperation; import dev.peerat.parser.java.operation.ContinueOperation; import dev.peerat.parser.java.operation.IfOperation; +import dev.peerat.parser.java.operation.MethodCallOperation; import dev.peerat.parser.java.operation.ReturnOperation; import dev.peerat.parser.java.operation.SynchronizedOperation; import dev.peerat.parser.java.operation.ThrowOperation; @@ -225,9 +230,11 @@ public class JavaParser extends Parser { //VALUE BiFunction value_builder = (parent, bag) -> { - System.out.println(bag); if(bag.has("right")){ + if(!(bag.get("left") instanceof Value)) bag.set("left", new Value(bag.get("left"))); + if(!(bag.get("right") instanceof Value)) bag.set("right", new Value(bag.get("right"))); + BiValue result = new BiValue( bag.get("left"), @@ -244,6 +251,7 @@ public class JavaParser extends Parser { global.set("right", local.get("left")); }; + //STRING CONCAT StateTree value = new StateTree<>(); StateTree value_container = new StateTree<>(); @@ -269,10 +277,15 @@ public class JavaParser extends Parser { return null; }); - StateTree value_instance = value.then((validator) -> validator.validate((token) -> token.getValue().equals("new"))); + StateTree value_instance = value.then((validator) -> validator.validate( + (token) -> token.getValue().equals("new"), + (bag, token) -> bag.set("newit", token))); StateTree value_name = new StateTree(); value.then(value_name); - value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> global.set(local.get()))) + value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> { + if(global.has("newit")) global.set(new InstanceValue(global.get("newit"), local.get().getToken(), local.get().getParameters())); + else global.set(local.get()); + })) .end((a,b) -> a) .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) @@ -304,9 +317,26 @@ public class JavaParser extends Parser { value_array_end.then(value_call); value_array_end.then(value_array_begin); - StateTree value_arg_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); - StateTree value_arg_end = value_arg_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - value_arg_end.end((a,b) -> a); + StateTree value_arg_begin = value_name.then((validator) -> validator.validate( + (token) -> token.getValue().equals("("), + (bag, token) -> bag.set(bag.get().concat(token)))); + StateTree value_arg_end = value_arg_begin.then((validator) -> validator.validate( + (token) -> token.getValue().equals(")"), + (bag, token) -> bag.set(bag.get().concat(token)))); + value_arg_end.end((parent,bag) -> { + Integer paramters = bag.get("args"); + List list = null; + if(paramters != null){ + list = new ArrayList<>(); + for(int i = 0; i < paramters; i++) list.add(bag.get("arg"+i).get()); + } + + MethodCallValue methodCall = new MethodCallValue(bag.get(), list); + //take arguments from bag + System.out.println("MethodCall "+bag); + bag.set(methodCall); + return null; + }); value_arg_end.then(value_call); value_arg_end.then(value_array_begin); StateTree value_generic_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))); @@ -324,7 +354,6 @@ public class JavaParser extends Parser { if(count == null) count = 0; global.set("arg"+count, local); global.set("args", (count+1)); - System.out.println("ah "+local); })); value_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) .then(value_arg); @@ -345,10 +374,16 @@ public class JavaParser extends Parser { validator.validate((token) -> token.getValue().equals("-")) && validator.validate((token) -> token.getValue().equals(">"))); value_lambda.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a).end((a,b) -> a) + .end((a,bag) -> { + bag.set(new LambdaValue(null, null)); + return a; + }) .multiple(function_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); - value_lambda.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + value_lambda.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,bag) ->{ + bag.set(new LambdaValue(null, null)); + return a; + }); value_lambda_arg.then(value_lambda); StateTree value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("left", local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); @@ -360,7 +395,6 @@ public class JavaParser extends Parser { value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))).then(value_container); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("~"))).then(value_container); StateTree value_inside = value_container.then(new RedirectStateTree<>(value, (global, local) -> { - System.out.println("captured "+local); global.set("left", local.get()); })); value_inside.then((validator) -> validator.validate((token) -> token.getValue().equals("["))) @@ -369,7 +403,8 @@ public class JavaParser extends Parser { .then(value_left); value_inside.then(value_left); value_left.end((parent, bag) -> { - if(bag.get() == null) bag.set(bag.get("left")); + if(bag.get("left") instanceof Value) bag.set(bag.get("left")); + else bag.set(new Value(bag.get("left"))); return null; }); StateTree value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))); @@ -535,7 +570,7 @@ public class JavaParser extends Parser { variable_split.then(variable_name); StateTree variable_value = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) .then(new RedirectStateTree<>(value_container, (global, local) -> { -// global.>get("vars").put(global.get("last"), local.get()); + global.>get("vars").put(global.get("last"), local.get()); })); variable_value.then(variable_split); variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) @@ -544,12 +579,25 @@ public class JavaParser extends Parser { //OPERATION StateTree operation = new StateTree<>(); - StateTree operation_name = operation.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); - operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); - operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((a,b) -> a); + StateTree operation_name = operation.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))); + operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((parent,bag) -> { + Value action = bag.get(); + if(action instanceof BiValue){ + BiValue assign = (BiValue)action; + AssignOperation op = new AssignOperation(assign.left(), assign.right()); + if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); + } + if(action instanceof MethodCallValue){ + MethodCallValue call = (MethodCallValue)action; + MethodCallOperation op = new MethodCallOperation((Value)null, call.getToken(), call.getParameters()); + if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); + } + return null; + }); +// operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) +// .then(new RedirectStateTree<>(value_container, (global, local) -> global.set("newer", local.get()))) +// .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) +// .end((parent, bag) -> parent); StateTree operation_call = operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))); operation_call.then(operation_name); StateTree operation_begin = operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); @@ -657,6 +705,7 @@ public class JavaParser extends Parser { .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .end((parent,bag) -> { + System.out.println("if "+bag); IfOperation op = new IfOperation(bag.get()); if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); return op; @@ -1122,12 +1171,11 @@ public class JavaParser extends Parser { JavaFile jFile = new JavaFile(); parser.parse(reader, jFile); - System.out.println(); + List values = new ArrayList<>(); + jFile.findAll((e) -> e instanceof Value, values); + System.out.println("Find "+values.size()+" values"); + for(Value v : values) System.out.println(v); - jFile.find((e) -> { - System.out.println(e); - return false; - }); System.out.println((System.currentTimeMillis()-time)+"ms"); diff --git a/src/dev/peerat/parser/java/Value.java b/src/dev/peerat/parser/java/Value.java index 62620bb..9fb9f7c 100644 --- a/src/dev/peerat/parser/java/Value.java +++ b/src/dev/peerat/parser/java/Value.java @@ -150,4 +150,146 @@ public class Value extends JavaElement{ } } + public static class MethodCallValue extends Value{ + + private Token token; + private List parameters; + + public MethodCallValue(Token token, List parameters){ + this.token = token; + this.parameters = parameters; + } + + public Token getToken(){ + return token; + } + + public List getParameters(){ + return this.parameters; + } + + @Override + public String toString(){ + return token.getValue()+((parameters == null ? "":parameters)); + } + + @Override + public void build(Builder builder) throws Exception{ + builder.append(token); + } + + @Override + public E find(Function finder){ + if(parameters != null){ + for(Value value : parameters){ + if(finder.apply(value)) return (E) value; + } + } + return null; + } + + @Override + public void findAll(Function finder, List list){ + if(parameters != null){ + for(Value value : parameters){ + if(finder.apply(value)) list.add((E) value); + value.findAll(finder, list); + } + } + } + } + + public static class InstanceValue extends Value{ + + private Token newer; + private Token token; + private List parameters; + + public InstanceValue(Token newer, Token token, List parameters){ + this.newer = newer; + this.token = token; + this.parameters = parameters; + } + + public Token getNewer(){ + return this.newer; + } + + public Token getToken(){ + return token; + } + + public List getParameters(){ + return this.parameters; + } + + @Override + public String toString(){ + return newer.getValue()+" "+token.getValue()+((parameters == null ? "":parameters)); + } + + @Override + public void build(Builder builder) throws Exception{ + builder.append(newer); + builder.append(token); + } + + @Override + public E find(Function finder){ + if(parameters != null){ + for(Value value : parameters){ + if(finder.apply(value)) return (E) value; + } + } + return null; + } + + @Override + public void findAll(Function finder, List list){ + if(parameters != null){ + for(Value value : parameters){ + if(finder.apply(value)) list.add((E) value); + value.findAll(finder, list); + } + } + } + } + + //TO FILL + public static class LambdaValue extends Value{ + + private List parameters; + private List operations; + + public LambdaValue(List parameters, List operations){ + this.parameters = parameters; + this.operations = operations; + } + + public List getParameters(){ + return this.parameters; + } + + public List getOperations(){ + return this.operations; + } + + @Override + public String toString(){ + return "() -> {}"; + } + + @Override + public void build(Builder builder) throws Exception{ + } + + @Override + public E find(Function finder){ + return null; + } + + @Override + public void findAll(Function finder, List list){ + } + } } diff --git a/src/dev/peerat/parser/java/operation/IfOperation.java b/src/dev/peerat/parser/java/operation/IfOperation.java index f11bd00..7f0f4c3 100644 --- a/src/dev/peerat/parser/java/operation/IfOperation.java +++ b/src/dev/peerat/parser/java/operation/IfOperation.java @@ -12,6 +12,7 @@ public class IfOperation extends OperationBag{ public IfOperation(Value condition){ super(); + this.condition = condition; } public Value getCondition(){ @@ -28,6 +29,6 @@ public class IfOperation extends OperationBag{ public void findAll(Function finder, List list){ if(finder.apply(condition)) list.add((E)condition); condition.findAll(finder, list); - super.find(finder); + super.findAll(finder, list); } } diff --git a/src/dev/peerat/parser/java/operation/MethodCallOperation.java b/src/dev/peerat/parser/java/operation/MethodCallOperation.java index ef4390e..0049d4f 100644 --- a/src/dev/peerat/parser/java/operation/MethodCallOperation.java +++ b/src/dev/peerat/parser/java/operation/MethodCallOperation.java @@ -46,25 +46,31 @@ public class MethodCallOperation extends Operation{ @Override public E find(Function finder) { - if(finder.apply(start)) return (E)start; + if(start != null && finder.apply(start)) return (E)start; if(previous != null) if(finder.apply(previous)) return (E) previous; - for(Value param : this.parameters){ - if(finder.apply(param)) return (E)param; + if(this.parameters != null){ + for(Value param : this.parameters){ + if(finder.apply(param)) return (E)param; + } } return null; } @Override public void findAll(Function finder, List list){ - if(finder.apply(start)) list.add((E)start); - start.findAll(finder, list); + if(start != null){ + if(finder.apply(start)) list.add((E)start); + start.findAll(finder, list); + } if(previous != null){ if(finder.apply(previous)) list.add((E) previous); previous.findAll(finder, list); } - for(Value param : this.parameters){ - if(finder.apply(param)) list.add((E)param); - param.findAll(finder, list); + if(this.parameters != null){ + for(Value param : this.parameters){ + if(finder.apply(param)) list.add((E)param); + param.findAll(finder, list); + } } } }