diff --git a/src/dev/peerat/parser/Bag.java b/src/dev/peerat/parser/Bag.java index f813c4d..fd36a6d 100644 --- a/src/dev/peerat/parser/Bag.java +++ b/src/dev/peerat/parser/Bag.java @@ -38,7 +38,7 @@ public class Bag{ public void set(Object value){ this.value = value; - System.out.println("edit Bag "+this); +// System.out.println("edit Bag "+this); } public E get(String key){ @@ -55,7 +55,7 @@ public class Bag{ public void set(String key, Object value){ this.map.put(key, value); - System.out.println("edit Bag "+this); +// System.out.println("edit Bag "+this); } @Override diff --git a/src/dev/peerat/parser/TokenValidator.java b/src/dev/peerat/parser/TokenValidator.java index 65f3a1d..2eff8ef 100644 --- a/src/dev/peerat/parser/TokenValidator.java +++ b/src/dev/peerat/parser/TokenValidator.java @@ -36,10 +36,10 @@ public class TokenValidator{ } this.validated++; - StackTraceElement[] trace = Thread.currentThread().getStackTrace(); - int current = 0; - while((current < trace.length) && (!(trace[++current].getClassName().endsWith("JavaParser")))); - System.out.println("[validate] "+trace[current]); +// StackTraceElement[] trace = Thread.currentThread().getStackTrace(); +// int current = 0; +// while((current < trace.length) && (!(trace[++current].getClassName().endsWith("JavaParser")))); +// System.out.println("[validate] "+trace[current]); return true; } diff --git a/src/dev/peerat/parser/TreeStreamable.java b/src/dev/peerat/parser/TreeStreamable.java deleted file mode 100644 index 271e5b7..0000000 --- a/src/dev/peerat/parser/TreeStreamable.java +++ /dev/null @@ -1,3 +0,0 @@ -package dev.peerat.parser; - -public interface TreeStreamable{} \ No newline at end of file diff --git a/src/dev/peerat/parser/java/Class.java b/src/dev/peerat/parser/java/Class.java index 8cf8dfe..a6246d2 100644 --- a/src/dev/peerat/parser/java/Class.java +++ b/src/dev/peerat/parser/java/Class.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.function.Predicate; import dev.peerat.parser.Token; -import dev.peerat.parser.TreeStreamable; +import dev.peerat.parser.StreamableTree; import dev.peerat.parser.java.Function.FunctionStreamable; import dev.peerat.parser.java.Variable.VariableStreamable; @@ -112,7 +112,7 @@ public class Class extends ClassBase{ return new ClassStreamable(); } - public class ClassStreamable implements TreeStreamable{ + public class ClassStreamable implements StreamableTree{ public ClassStreamable(){} diff --git a/src/dev/peerat/parser/java/ClassBase.java b/src/dev/peerat/parser/java/ClassBase.java index 73a3774..2d053cc 100644 --- a/src/dev/peerat/parser/java/ClassBase.java +++ b/src/dev/peerat/parser/java/ClassBase.java @@ -8,11 +8,6 @@ import dev.peerat.parser.java.Annotation.AnnotableBuffer; import dev.peerat.parser.java.Function.FunctionContainer; import dev.peerat.parser.java.Variable.VariableContainer; -interface ClassContainer{ - - void addClass(ClassBase clazz); - -} public abstract class ClassBase extends Annotable implements AnnotableBuffer, ClassContainer, FunctionContainer, VariableContainer{ @@ -33,5 +28,4 @@ public abstract class ClassBase extends Annotable implements AnnotableBuffer, Cl this.annotationBuffer = null; return list; } - } diff --git a/src/dev/peerat/parser/java/ClassContainer.java b/src/dev/peerat/parser/java/ClassContainer.java new file mode 100644 index 0000000..8662945 --- /dev/null +++ b/src/dev/peerat/parser/java/ClassContainer.java @@ -0,0 +1,7 @@ +package dev.peerat.parser.java; + +public interface ClassContainer{ + + void addClass(ClassBase clazz); + +} \ No newline at end of file diff --git a/src/dev/peerat/parser/java/Function.java b/src/dev/peerat/parser/java/Function.java index 2cadde8..420397e 100644 --- a/src/dev/peerat/parser/java/Function.java +++ b/src/dev/peerat/parser/java/Function.java @@ -7,7 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.TokenType; -import dev.peerat.parser.TreeStreamable; +import dev.peerat.parser.StreamableTree; import dev.peerat.parser.java.Annotation.Annotable; import dev.peerat.parser.java.Operation.OperationContainer; import dev.peerat.parser.java.Variable.VariableContainer; @@ -165,7 +165,7 @@ public class Function extends Annotable implements VariableContainer, OperationC return new FunctionStreamable(); } - public class FunctionStreamable implements TreeStreamable{ + public class FunctionStreamable implements StreamableTree{ public FunctionStreamable(){} diff --git a/src/dev/peerat/parser/java/JavaElement.java b/src/dev/peerat/parser/java/JavaElement.java index 6e297f5..f05ff6b 100644 --- a/src/dev/peerat/parser/java/JavaElement.java +++ b/src/dev/peerat/parser/java/JavaElement.java @@ -3,7 +3,6 @@ package dev.peerat.parser.java; import java.util.List; import java.util.function.Function; -import dev.peerat.parser.Bag; import dev.peerat.parser.ElementBuilder; public abstract class JavaElement implements ElementBuilder{ diff --git a/src/dev/peerat/parser/java/JavaParser.java b/src/dev/peerat/parser/java/JavaParser.java index f7bcfbe..39c15d0 100644 --- a/src/dev/peerat/parser/java/JavaParser.java +++ b/src/dev/peerat/parser/java/JavaParser.java @@ -1,1089 +1,239 @@ package dev.peerat.parser.java; -import java.io.BufferedReader; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; - -import dev.peerat.parser.Bag; import dev.peerat.parser.Parser; import dev.peerat.parser.Token; -import dev.peerat.parser.TokenType; -import dev.peerat.parser.Tokenizer; -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.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.ForOperation; -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; -import dev.peerat.parser.java.operation.WhileOperation; -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.value.StaticValue; -import dev.peerat.parser.java.value.Value; -import dev.peerat.parser.state.BuilderStateTree; +import dev.peerat.parser.java.tree.AnnotationClassTree; +import dev.peerat.parser.java.tree.AnnotationTree; +import dev.peerat.parser.java.tree.ClassBaseTree; +import dev.peerat.parser.java.tree.ClassContainerTree; +import dev.peerat.parser.java.tree.ClassTree; +import dev.peerat.parser.java.tree.EnumValueTree; +import dev.peerat.parser.java.tree.FunctionContainerTree; +import dev.peerat.parser.java.tree.FunctionTree; +import dev.peerat.parser.java.tree.GenericTree; +import dev.peerat.parser.java.tree.InterfaceTree; +import dev.peerat.parser.java.tree.JavaTreeType; +import dev.peerat.parser.java.tree.ModifierTree; +import dev.peerat.parser.java.tree.OperationTree; +import dev.peerat.parser.java.tree.TypeTree; +import dev.peerat.parser.java.tree.ValueTree; +import dev.peerat.parser.java.tree.VariableTree; import dev.peerat.parser.state.InitialStateTree; -import dev.peerat.parser.state.RedirectStateTree; import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; -public class JavaParser extends Parser { +public class JavaParser extends Parser{ - public static long time; +// public static void main(String[] args) throws Exception{ +// Timing main = Timing.of(); +// +// Parser parser = new JavaParser(); +// BufferedReader reader = new BufferedReader(new FileReader(new File("/tmp/example.txt"))); +// +// Timing parse = Timing.of(); +// JavaFile container = new JavaFile(); +// parser.parse(reader, container); +// parse.takeTiming("[Parsing] %dms"); +// System.out.println(TokenValidator.MAX_VALIDATE+" / "+TokenValidator.TOKENS+" ("+((TokenValidator.MAX_VALIDATE/(double)TokenValidator.TOKENS)*100.0)+"%)"); +// +// reader.close(); +// +// main.takeTiming("End with %dms"); +// +// File out = new File("/tmp/dataObserve.txt"); +// BufferedWriter writer = new BufferedWriter(new FileWriter(out)); +// writer.write(TokenValidator.MAX_VALIDATE+" "+TokenValidator.TOKENS); +// writer.flush(); +// writer.close(); +// } - static { - time = System.currentTimeMillis(); + static class Timing{ + + public static Timing of(){ + return new Timing(); + } + + private long time; + + Timing(){ + this.time = System.currentTimeMillis(); + } + + void takeTiming(String text){ + long result = System.currentTimeMillis()-time; + System.out.printf(text+"\n", result); + } } + public JavaParser(){ - Tokenizer tokenizer = new Tokenizer(){ - @Override - public void parse(BufferedReader reader) throws Exception{ - System.out.println("tokenizer"); - int lineNumber = 0; - String line; - boolean longCommentary = false; - while((line = reader.readLine()) != null){ - lineNumber++; - - for(int i = 0; i < line.length(); i++){ - char c = line.charAt(i); - if(longCommentary){ - if(c == '*' && (i < line.length()-1 && line.charAt(i+1) == '/')){ - longCommentary = false; - i++; - } -// System.out.print(c); - continue; - } - Token token; - if(isNameValid(c)){ - String value = ""; - int j = i; - for(; j < line.length(); j++){ - c = line.charAt(j); - if(isNameValid(c)) value+=c; - else break; - } - token = new Token(lineNumber, i+1, value, TokenType.NAME); - i = j-1; - }else if(Character.isWhitespace(c)) continue; - else{ - if(c == '"'){ - String value = "\""; - int j = i+1; - for(; j < line.length(); j++){ - c = line.charAt(j); - if(c == '"'){ - value+=c; - j++; - break; - }else if(c == '\\'){ - value+=c+line.charAt(++j); - }else{ - value+=c; - } - } - token = new Token(lineNumber, i+1, value, TokenType.STRING); - i = j-1; - System.out.println(token); - }else if(c == '\''){ - String value = "'"; - int j = i+1; - for(; j < line.length(); j++){ - c = line.charAt(j); - if(c == '\''){ - value+=c; - j++; - break; - }else if(c == '\\'){ - value+=c+line.charAt(++j); - }else{ - value+=c; - } - } - token = new Token(lineNumber, i+1, value, TokenType.CHAR); - i = j-1; - System.out.println(token); - }else{ - if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '/')) break; - if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '*')){ - longCommentary = true; - continue; - } - token = new Token(lineNumber, i+1, ""+c, TokenType.DELIMITER); - } - } - getTokens().add(token); - } - } - } - - @Override - public void parse(String line){ - System.out.println("tokenizer"); - int lineNumber = 1; - boolean longCommentary = false; - for(int i = 0; i < line.length(); i++){ - char c = line.charAt(i); - if(longCommentary){ - if(c == '*' && (i < line.length()-1 && line.charAt(i+1) == '/')){ - longCommentary = false; - i++; - } -// System.out.print(c); - continue; - } - Token token; - if(isNameValid(c)){ - String value = ""; - int j = i; - for(; j < line.length(); j++){ - c = line.charAt(j); - if(isNameValid(c)) value+=c; - else break; - } - token = new Token(lineNumber, i+1, value, TokenType.NAME); - i = j-1; - }else if(Character.isWhitespace(c)) continue; - else{ - if(c == '"'){ - String value = "\""; - int j = i+1; - for(; j < line.length(); j++){ - c = line.charAt(j); - if(c == '"'){ - value+=c; - j++; - break; - }else if(c == '\\'){ - value+=c+line.charAt(++j); - }else{ - value+=c; - } - } - token = new Token(lineNumber, i+1, value, TokenType.STRING); - i = j-1; - System.out.println(token); - }else if(c == '\''){ - String value = "'"; - int j = i+1; - for(; j < line.length(); j++){ - c = line.charAt(j); - if(c == '\''){ - value+=c; - j++; - break; - }else if(c == '\\'){ - value+=c+line.charAt(++j); - }else{ - value+=c; - } - } - token = new Token(lineNumber, i+1, value, TokenType.CHAR); - i = j-1; - System.out.println(token); - }else{ - if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '/')) break; - if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '*')){ - longCommentary = true; - continue; - } - token = new Token(lineNumber, i+1, ""+c, TokenType.DELIMITER); - } - } - getTokens().add(token); - } - } - - private boolean isNameValid(char c) { - return Character.isAlphabetic(c) || Character.isDigit(c) || c == '_' || c == '$'; - } - }; - - - //SUMMARY - //- Modifier - //- Type - //- Value - //- Enum Value - //- Annotation - //- Variable - //- Operation - //- Function - //- Class - //- Interface - //- Enum - //- Annotation Clazz - //- Import - //- Package - - //MODIFIER - StateTree modifier = new StateTree(); - modifier.then((validator) -> { - boolean mod = false; - while(validator.validate( - (token) -> getModifier(token.getValue()) > 0, - (bag, token) -> { - int m = getModifier(token.getValue()); - Integer current = bag.get(); - bag.set(current == null ? m : current+m); - })) mod = true; - return mod; - }).end(); - - //TYPE - BiConsumer concat = (bag, token) -> { - Token value = bag.get(); - if(value == null) bag.set(token); - else bag.set(value.concat(token)); - }; - - StateTree type = new StateTree(); - StateTree type_ = type.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME),concat)); -// type_.then((validator) -> validator.validate((token) -> token.getValue().equals("."), concat)) //only dot? -// .then(type_); - StateTree gen = new StateTree<>(); - type_.then(gen); - StateTree type_begin = gen.then((validator) -> validator.validate((token) -> token.getValue().equals("<"), concat)); - StateTree type_generic = type_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(global.get().concat(local.get())))); - StateTree type_generic_end = type_generic.then((validator) -> validator.validate((token) -> token.getValue().equals(">"), concat)); - StateTree type_generic_split = type_generic.then((validator) -> validator.validate((token) -> token.getValue().equals(","), concat)); - type_generic_split.then(type_generic); - - type_begin.then(type_generic_end); //remove ? - - StateTree type_generic_unknow = type_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("?"), concat)); - type_generic_unknow.then(type_generic_end); - type_generic_split.then(type_generic_unknow); - type_generic_unknow.then(type_generic_split); - StateTree type_generic_unknow_extends = type_generic_unknow.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"), concat)) - .then(new RedirectStateTree<>(type, (global, local) -> global.set(global.get().concat(local.get())))); - type_generic_unknow_extends.then(type_generic_end); - type_generic_unknow_extends.then(type_generic_split); - StateTree type_generic_unknow_super = type_generic_unknow.then((validator) -> validator.validate((token) -> token.getValue().equals("super"), concat)) - .then(new RedirectStateTree<>(type, (global, local) -> global.set(global.get().concat(local.get())))); - type_generic_unknow_super.then(type_generic_end); - type_generic_unknow_super.then(type_generic_split); - - StateTree type_generic_named_extends = type_generic.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"), concat)) - .then(new RedirectStateTree<>(type, (global, local) -> global.set(global.get().concat(local.get())))); - type_generic_named_extends.then(type_generic_end); - type_generic_named_extends.then(type_generic_split); - StateTree type_generic_named_super = type_generic.then((validator) -> validator.validate((token) -> token.getValue().equals("super"), concat)) - .then(new RedirectStateTree<>(type, (global, local) -> global.set(global.get().concat(local.get())))); - type_generic_named_super.then(type_generic_end); - type_generic_named_super.then(type_generic_split); - - StateTree type_array_begin = type_.then((validator) -> validator.validate((token) -> token.getValue().equals("["))); - StateTree type_array_end = type_array_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("]"))); - type_array_end.then(type_array_begin); - type_array_end.end(); - - type_.end(); - type_generic_end.end(); - - - StateTree clazz_container = new StateTree<>(); - clazz_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); - StateTree braces_container = new StateTree<>(); - - StateTree function_container = new StateTree<>(); - function_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); - - - //VALUE - StateTree value = new StateTree<>(); - StateTree value_operation = new StateTree<>(); - - StateTree value_name = value.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set("current", token))); - value_name.end((parent, bag) -> { - bag.set(new StaticValue(bag.get("current"))); - return null; - }); - value_name.then(value_operation); - - value_operation.then((validator) -> validator.validate((token) -> token.getValue().equals(">"), (bag, token) -> bag.set("action", ">"))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set("right", local.get()))) - .end((parent, bag) -> { - if(bag.has("current")){ - bag.set(new BiValue(new StaticValue(bag.get("current")), bag.get("action"), bag.get("right"))); - }else { - bag.set(new BiValue(bag.get(), bag.get("action"), bag.get("right"))); - } - System.out.println("value_op "+bag); - return null; - }); - - value_operation.then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&&"))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set("right", local.get()))) - .end((parent, bag) -> { - if(bag.has("current")){ - bag.set(new BiValue(new StaticValue(bag.get("current")), bag.get("action"), bag.get("right"))); - }else { - bag.set(new BiValue(bag.get(), bag.get("action"), bag.get("right"))); - } - System.out.println("value_op "+bag); - return null; - }); - - value_operation.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "=="))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set("right", local.get()))) - .end((parent, bag) -> { - if(bag.has("current")){ - bag.set(new BiValue(new StaticValue(bag.get("current")), bag.get("action"), bag.get("right"))); - }else { - bag.set(new BiValue(bag.get(), bag.get("action"), bag.get("right"))); - } - System.out.println("value_op "+bag); - return null; - }); - - StateTree value_parenthesis = value.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); - StateTree value_parenthesis_close = value_parenthesis.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - StateTree value_inside = value_parenthesis.then(new RedirectStateTree<>(value, (global, local) -> { - global.set(local.get()); - System.out.println("valide_inside "+global); - })); - value_inside.then(value_parenthesis_close); - value_inside.then(value_operation); - value_parenthesis_close.end(); - value_parenthesis_close.then(value_operation); - - - //ENUM VALUE - StateTree enum_value = new StateTree<>(); - StateTree enum_name = enum_value.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); - enum_name.end((a,b) -> a); - enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); - enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(enum_name); - StateTree enum_arg = enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); - StateTree enum_end = enum_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - enum_end.end((a,b) -> a); - enum_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); - enum_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) - .then(enum_arg); - enum_end.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(enum_name); - - //ANNOTATION - StateTree annotation = new StateTree<>(); - StateTree annotation_name = annotation.then((validator) -> - validator.validate((token) -> token.getValue().equals("@")) && - !validator.validate((token) -> token.getValue().equals("interface"))) - .then((validator) -> validator.validate( - (token) -> token.getType().equals(TokenType.NAME), - (bag, token) -> { - Token name = bag.get("name"); - if(name == null) bag.set("name", token); - else bag.set("name", name.concat(token)); - })); - annotation_name.then((validator) -> validator.validate( - (token) -> token.getValue().equals("."), - (bag, token) -> { - Token name = bag.get("name"); - if(name == null) bag.set("name", token); - else bag.set("name", name.concat(token)); - })) - .then(annotation_name); - annotation_name.end((parent, bag) -> { - Annotation result = new Annotation(bag.get("name")); - bag.set(result); - if(parent instanceof AnnotableBuffer) ((AnnotableBuffer)parent).addAnnotationBuffer(result); - return null; - }); - StateTree annotation_begin = annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); - StateTree annotation_end = annotation_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - annotation_end.end((parent, bag) -> { - Annotation result = new Annotation(bag.get("name"), bag.get("values")); - bag.set(result); - if(parent instanceof AnnotableBuffer) ((AnnotableBuffer)parent).addAnnotationBuffer(result); - return null; - }); - StateTree annotation_var = annotation_begin.then((validator) -> validator.validate( - (token) -> token.getType().equals(TokenType.NAME), - (bag, token) -> bag.set("index", token))); - StateTree annotation_value = annotation_var.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) - .then(new RedirectStateTree<>(value, (global, local) -> { - Map map = global.get("values"); - if(map == null){ - map = new LinkedHashMap<>(); - global.set("values", map); - } - map.put(global.get("index"), local.get()); - })); - annotation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(annotation_var); - annotation_value.then(annotation_end); - annotation_begin.then(new RedirectStateTree<>(value, (global, local) -> { - Map map = global.get("values"); - if(map == null){ - map = new LinkedHashMap<>(); - global.set("values", map); - } - map.put(null, local.get()); - })).then(annotation_end); - - //VARIABLE - BiFunction variable_builder = (parent, bag) -> { - Integer mod = bag.get("mod"); - Token vtype = bag.get("type"); - Map map = bag.get("vars"); - for(Entry vars : map.entrySet()){ - List annotations = null; - if(parent instanceof AnnotableBuffer) annotations = (((AnnotableBuffer)parent).getAnnotationBuffer()); - Variable result = new Variable(annotations, mod == null ? 0 : mod, vtype, vars.getKey(), false, vars.getValue()); - bag.set(result); - if(parent instanceof VariableContainer) ((VariableContainer)parent).addVariable(result); - } - return null; - }; - - InitialStateTree variable = new InitialStateTree<>(); - variable.multiple(annotation); - StateTree variable_mod = variable.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("mod", local.get()))); - StateTree variable_type = variable.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local.get()))); - variable_mod.then(variable_type); - StateTree variable_name = variable_type.then((validator) -> validator.validate( - (token) -> token.getType().equals(TokenType.NAME), - (bag, token) -> { - Map map = bag.get("vars"); - if(map == null){ - map = new LinkedHashMap<>(); - bag.set("vars", map); - } - bag.set("last", token); - map.put(token, null); - })); - variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end(variable_builder); - StateTree variable_split = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); - variable_split.then(variable_name); - StateTree variable_value = variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) - .then(new RedirectStateTree<>(value, (global, local) -> { - global.>get("vars").put(global.get("last"), local.get()); - })); - variable_value.then(variable_split); - variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end(variable_builder); - variable_value.end(variable_builder); - - //OPERATION - StateTree operation = new StateTree<>(); -// operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) -// .then(new RedirectStateTree<>(value, (global, local) -> global.set("newer", local.get()))) -// .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) -// .end((parent, bag) -> parent); - - StateTree operation_return = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("return"))); - operation_return.then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((parent,bag) -> { - ReturnOperation op = new ReturnOperation(bag.get()); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return null; - }); - - operation_return.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((parent,bag) -> { - ReturnOperation op = new ReturnOperation(bag.get()); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return null; - }); - - operation.then((validator) -> validator.validate((token) -> token.getValue().equals("throw"))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((parent,bag) -> { - ThrowOperation op = new ThrowOperation(bag.get()); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return null; - }); - - operation.then((validator) -> validator.validate((token) -> token.getValue().equals("do"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - - StateTree operation_else = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("else"))) - .end((a,b) -> a); - operation_else.then(operation); - operation_else.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - - StateTree operation_try = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("try"))); - StateTree operation_try_base = operation_try.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); - operation_try.then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(variable, (global, local) -> global.set(null))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) - .then(operation_try_base); - StateTree operation_try_end = operation_try_base.end((a,b) -> a) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - - StateTree operation_finally = operation_try_end.then((validator) -> validator.validate((token) -> token.getValue().equals("finally"))); - operation_finally.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - - StateTree operation_catch_named = operation_try_end.then((validator) -> validator.validate((token) -> token.getValue().equals("catch"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); - operation_catch_named.then((validator) -> validator.validate((token) -> token.getValue().equals("|"))) - .then(operation_catch_named); - StateTree operation_catch = operation_catch_named.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - operation_catch.then(operation_finally); - operation_catch.then(operation_catch_named); - - operation.then((validator) -> validator.validate((token) -> token.getValue().equals("continue"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((parent,bag) -> { - ContinueOperation op = new ContinueOperation(); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return null; - }); - - operation.then((validator) -> validator.validate((token) -> token.getValue().equals("break"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((parent,bag) -> { - System.out.println("break"); - BreakOperation op = new BreakOperation(); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return null; - }); - - StateTree operation_if = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("if"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then((v) -> { - System.out.println("inside IF"); - return true; - }) - .then(new RedirectStateTree<>(value, (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; - }); - operation_if.then(operation); - operation_if.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - - StateTree switch_cases = new StateTree<>(); - StateTree switch_case_begin = switch_cases.then((validator) -> validator.validate((token) -> token.getValue().equals("case"))); - StateTree switch_case = switch_case_begin.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(":"))); - switch_case.then(switch_case_begin); - switch_case.end((a,b) -> a) - .multiple(function_container); - - switch_cases.then((validator) -> validator.validate((token) -> token.getValue().equals("default"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(":"))) - .end((a,b) -> a) - .multiple(function_container); - - - operation.then((validator) -> validator.validate((token) -> token.getValue().equals("switch"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(")")) - && validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) - .multiple(switch_cases) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - - StateTree operation_for = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("for"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("("))); - - StateTree operation_for_first_part = operation_for.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))); - - - StateTree operation_for_modifier = operation_for.then((validator) -> validator.validate((token) -> getModifier(token.getValue()) > 0)); - operation_for_modifier.then(operation_for_modifier); - - StateTree operation_for_type = operation_for.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); - operation_for_modifier.then(operation_for_type); - - StateTree operation_for_assign = operation_for.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); - operation_for_modifier.then(operation_for_assign); - operation_for_type.then(operation_for_assign); - - StateTree operation_for_assign_end = operation_for_assign.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); - - operation_for_assign.then(operation_for_assign); - operation_for_assign.then(operation_for_first_part); - - - operation_for_assign_end.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) - .then(operation_for_assign); - operation_for_assign_end.then(operation_for_first_part); - - - StateTree operation_for_second_part = operation_for_first_part.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))); + this(JavaTreeType.ALL); + } - operation_for_first_part.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) - .then(operation_for_second_part); + public JavaParser(JavaTreeType level){ - StateTree operation_for_end = operation_for_second_part.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - operation_for_end.end((parent,bag) -> { - ForOperation op = new ForOperation(null, null, null, null); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - System.out.println("FOOOR"); - return op; - }).then(operation); - - operation_for_end.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((parent,bag) -> { - ForOperation op = new ForOperation(null, null, null, null); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return op; - }) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); + Timing tRegistery = Timing.of(); - operation_for_assign.then((validator) -> validator.validate((token) -> token.getValue().equals(":"))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) - .then(operation_for_end); + SyntaxTreeRegistery registery = new SyntaxTreeRegistery<>(); + registery.register(new ModifierTree(registery)); + registery.register(new TypeTree(registery)); + registery.register(new GenericTree(registery)); + registery.register(new ValueTree(registery)); + registery.register(new EnumValueTree(registery)); + registery.register(new AnnotationTree(registery)); + registery.register(new VariableTree(registery)); + registery.register(new ClassContainerTree(registery)); + registery.register(new FunctionContainerTree(registery)); + registery.register(new OperationTree(registery)); + registery.register(new FunctionTree(registery)); + registery.register(new ClassBaseTree(registery)); + registery.register(new ClassTree(registery)); + registery.register(new InterfaceTree(registery)); + registery.register(new AnnotationClassTree(registery)); - StateTree operation_for_update = operation_for_second_part.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); - operation_for_update.then(operation_for_end); - operation_for_update.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) - .then(operation_for_update); + registery.init(); - StateTree operation_while = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("while"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - operation_while.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((parent,bag) -> { - WhileOperation op = new WhileOperation(null); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return op; - }) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); + tRegistery.takeTiming("[Registery] %dms"); + Timing load = Timing.of(); - operation_while.end((parent,bag) -> { - WhileOperation op = new WhileOperation(null); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return op; - }).then(operation); + StateTree main; - operation.then((validator) -> validator.validate((token) -> token.getValue().equals("synchronized"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((parent,bag) -> { - SynchronizedOperation op = new SynchronizedOperation(bag.get()); - if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); - return op; - }) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); + if(level == JavaTreeType.ALL){ + InitialStateTree base = new InitialStateTree<>(); + main = base; + + StateTree pack = main.then((validator) -> { + if(validator.validate( + (token) -> token.getValue().equals("package"))){ + + while(validator.validate( + (token) -> !token.getValue().equals(";"), + (bag, token) -> { + Token current = bag.get(); + if(current == null) bag.set(token); + else bag.set(current.concat(token)); + }) + ); + return validator.validate((token) -> token.getValue().equals(";")); + } + return false; + }).end((parent, bag) -> { + ((JavaFile)parent).setPackage(bag); + return parent; + }); + + StateTree importState = new StateTree<>(); + importState.then((validator) -> { + if(validator.validate( + (token) -> token.getValue().equals("import"))){ + + validator.validate( + (token) -> token.getValue().equals("static"), + (bag, token) -> bag.set("static", null)); + + while(validator.validate( + (token) -> !token.getValue().equals(";"), + (bag, token) -> { + Token current = bag.get(); + if(current == null) bag.set(token); + else bag.set(current.concat(token)); + }) + ); + + return validator.validate((token) -> token.getValue().equals(";")); + } + return false; + }).end((parent, bag) -> { + ((JavaFile)parent).addImport(new Import(bag.has("static"), bag.get())); + return parent; + }); + +// base.multiple(pack); + base.multiple(importState); + base.multiple(registery.getNode(AnnotationTree.class)); + base.multiple(registery.getNode(ClassBaseTree.class)); + }else{ + main = registery.getNode(level.getType()); + } - StateTree operation_name = operation.then(new RedirectStateTree<>(value, (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; - }); - - 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("("))); - StateTree operation_end = operation_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - operation_end.then(operation_call); - operation_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((a,b) -> a); - StateTree operation_value = operation_begin.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); - operation_value.then(operation_end); - operation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(operation_value); - - function_container.then(variable); - function_container.then(operation); - - //FUNCTION - BiFunction function_builder = (parent, bag) -> { - buildVariable(bag); - Integer mod = bag.get("mod"); - List annotations = null; - if(parent instanceof AnnotableBuffer) annotations = (((AnnotableBuffer)parent).getAnnotationBuffer()); - Function function = new Function(annotations, mod == null ? 0 : mod, bag.get("generic"), bag.get("type"), bag.get("name"), bag.get("param"), bag.get("throws")); - if(parent instanceof FunctionContainer) ((FunctionContainer)parent).addFunction(function); - return function; - }; - - InitialStateTree function = new InitialStateTree<>(); - function.multiple(annotation); - BuilderStateTree function_static = function.then((validator) -> validator.validate((token) -> token.getValue().equals("static")) && validator.validate((token) -> token.getValue().equals("{"))).end((parent, bag) -> { - Function build = new Function((((AnnotableBuffer)parent).getAnnotationBuffer()), Modifier.STATIC, null, null); - if(parent instanceof FunctionContainer) ((FunctionContainer)parent).addFunction(build); - return build; - }); - function_static.multiple(function_container); - function_static.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); - StateTree function_mod = function.then(new RedirectStateTree<>(modifier, (global, local) -> { - Integer mod = global.get("mod"); - if(mod == null) global.set("mod", local.get()); - else global.set("mod", mod+local.get()); - })); - StateTree function_generic = function.then(new RedirectStateTree<>(gen, (global, local) -> global.set("generic", local.get()))); - StateTree function_type = function.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local.get()))); - function_mod.then(function_mod); - function_mod.then(function_generic); - function_mod.then(function_type); - function_generic.then(function_type); - - StateTree function_name = function.then((validator) -> validator.validate( - (token) -> token.getType().equals(TokenType.NAME), - (bag, token) -> bag.set("name", token))); - function_type.then(function_name); - function_mod.then(function_name); - StateTree function_begin = function_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); - StateTree function_end = function_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); - function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end(function_builder) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); - function_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end(); - function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("default"))) - .then(new RedirectStateTree<>(value, (global, local) -> System.out.println("TODO DEFAULT IN FUNCTION"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end(function_builder); - - StateTree function_throws = function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("throws"))) - .then(new RedirectStateTree<>(type, (global, local) -> { - List throwables = global.get("throws"); - if(throwables == null){ - throwables = new ArrayList<>(); - global.set("throws", throwables); - } - throwables.add(local.get()); - })); - BuilderStateTree function_start_throws = function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end(function_builder); - function_start_throws.multiple(function_container); - function_start_throws.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); - function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_throws); - function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end(function_builder); +// //SUMMARY +// //- Import +// //- Package +// +// +//// clazz_container.then(function); +//// clazz_container.then(variable); +//// +//// clazz_container.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) +//// .end((a,b) -> a) +//// .multiple(function_container) +//// .unique((validator) -> validator.validate((token) -> token.getValue().equals("{"))) +//// .end((a,b) -> a); +// +// //IMPORT +// StateTree importState = new StateTree<>(); +// importState.then((validator) -> { +// if(validator.validate( +// (token) -> token.getValue().equals("import"))){ +// +// validator.validate( +// (token) -> token.getValue().equals("static"), +// (bag, token) -> bag.set("static", null)); +// +// while(validator.validate( +// (token) -> !token.getValue().equals(";"), +// (bag, token) -> { +// Token current = bag.get(); +// if(current == null) bag.set(token); +// else bag.set(current.concat(token)); +// }) +// ); +// +// return validator.validate((token) -> token.getValue().equals(";")); +// } +// return false; +// }).end((parent, bag) -> { +// ((JavaFile)parent).addImport(new Import(bag.has("static"), bag.get())); +// return parent; +// }); +// +// +// InitialStateTree main = new InitialStateTree<>(); +// +// //PACKAGE +// StateTree pack = main.then((validator) -> { +// if(validator.validate( +// (token) -> token.getValue().equals("package"))){ +// +// while(validator.validate( +// (token) -> !token.getValue().equals(";"), +// (bag, token) -> { +// Token current = bag.get(); +// if(current == null) bag.set(token); +// else bag.set(current.concat(token)); +// }) +// ); +// return validator.validate((token) -> token.getValue().equals(";")); +// } +// return false; +// }).end((parent, bag) -> { +// ((JavaFile)parent).setPackage(bag); +// return parent; +// }); +// main.multiple(pack); +// main.multiple(importState); +//// main.multiple(annotation); +//// main.multiple(clazz_); - StateTree function_arg_mod = function_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("final"), (bag, token) -> bag.set("arg_mod", true))); - StateTree function_arg_type = function_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set("arg_type", local.get()))); - function_arg_mod.then(function_arg_type); - StateTree function_arg_type_array_begin = function_arg_type.then((validator) -> validator.validate((token) -> token.getValue().equals("["), (bag, token) -> bag.set("arg_type", bag.get("arg_type").concat(token)))); - StateTree function_arg_type_array_end = function_arg_type_array_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("]"), (bag, token) -> bag.set("arg_type", bag.get("arg_type").concat(token)))); - function_arg_type_array_end.then(function_arg_type_array_begin); - StateTree function_arg_name = function_arg_type.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set("arg_name", token))); - function_arg_type_array_end.then(function_arg_name); - function_arg_type.then((validator) -> - validator.validate((token) -> token.getValue().equals(".")) && - validator.validate((token) -> token.getValue().equals(".")) && - validator.validate((token) -> token.getValue().equals("."), (bag, token) -> bag.set("arg_elips", true))) - .then(function_arg_name); - StateTree function_arg_split = function_arg_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","), (bag, token) -> { - buildVariable(bag); - })); - function_arg_split.then(function_arg_mod); - function_arg_split.then(function_arg_type); - function_arg_name.then(function_end); +// System.out.println((System.currentTimeMillis()-time)+"ms"); - - clazz_container.then(function); - clazz_container.then(variable); - - clazz_container.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) - .multiple(function_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a); - - //CLASS - StateTree clazz_ = new StateTree<>(); - StateTree clazz = new StateTree<>(); - - clazz_container.then(clazz_); - - StateTree clazz_base = clazz.then((validator) -> validator.validate((token) -> token.getValue().equals("class"))) - .then(new RedirectStateTree<>(type, (global, local) -> global.set("name", local.get()))); - clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((parent, bag) -> { - Class current = new Class((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name")); - if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); - return current; - }) - .multiple(clazz_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - StateTree clazz_implement = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("implements"))); - StateTree clazz_implement_name = clazz_implement.then(new RedirectStateTree<>(type, (global, local) -> { - Token token = global.get("implement"); - if(token == null) global.set("implement", local.get()); - else global.set("implement", token.concat(local.get())); - })); - clazz_implement_name.then((validator) -> validator.validate( - (token) -> token.getValue().equals(","), - (bag, token) -> bag.set("implement", bag.get("implement").concat(token)))).then(clazz_implement_name); - clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((parent, bag) -> { - Class current = new Class((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name"), bag.get("extend"), bag.get("implement")); - if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); - return current; - }) - .multiple(clazz_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - StateTree clazz_extend = clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) - .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local.get()))); - clazz_extend.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((parent, bag) -> { - Class current = new Class((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name"), bag.get("extend"), bag.get("implement")); - if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); - return current; - }) - .multiple(clazz_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) - .end((a,b) -> a); - clazz_extend.then(clazz_implement); - - - StateTree clazz_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); - clazz_.then(clazz); - clazz_mod.then(clazz); - - //INTERFACE - StateTree interfaces = new StateTree<>(); - StateTree interface_base = interfaces.then((validator) -> validator.validate((token) -> token.getValue().equals("interface"))) - .then((validator) -> validator.validate( - (token) -> token.getType().equals(TokenType.NAME), - (bag, token) -> bag.set("name", token))); - StateTree interface_start = interface_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); - interface_start.end((parent,bag) -> { - Interface current = new Interface((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name"), bag.get("extend")); - if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); - return current; - }) - .multiple(clazz_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); - - interface_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) - .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local.get()))) - .then(interface_start); - - StateTree interface_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); - clazz_.then(interfaces); - interface_mod.then(interfaces); - - InitialStateTree mult_clazz_container = new InitialStateTree<>(); - mult_clazz_container.multiple(clazz_container); - mult_clazz_container.end((a,b) -> a); - - //ENUM - StateTree enums = new StateTree<>(); - StateTree enum_base = enums.then((validator) -> validator.validate((token) -> token.getValue().equals("enum"))) - .then((validator) -> validator.validate( - (token) -> token.getType().equals(TokenType.NAME), - (bag,token) -> bag.set("name", token))); - - StateTree enum_start = enum_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); - enum_start.end((parent,bag) -> { - Enumeration current = new Enumeration((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name"), bag.get("implement")); - if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); - return current; - }) - .unique(enum_value) - .unique(mult_clazz_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); - - StateTree enum_implement = enum_base.then((validator) -> validator.validate((token) -> token.getValue().equals("implements"))); - StateTree enum_implement_name = enum_implement.then(new RedirectStateTree<>(type, (global, local) -> { - Token token = global.get("implement"); - if(token == null) token = local.get(); - else token = token.concat(local.get()); - global.set("implement", token); - })); - enum_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(enum_implement_name); - enum_implement_name.then(enum_start); - StateTree enum_extend = enum_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) - .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local.get()))); - enum_extend.then(enum_start); - enum_extend.then(enum_implement); - - StateTree enum_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); - clazz_.then(enums); - enum_mod.then(enums); - - //ANNOTATION CLAZZ - StateTree def_annos = new StateTree<>(); - StateTree def_anno_base = def_annos.then((validator) -> - validator.validate((token) -> token.getValue().equals("@")) && - validator.validate((token) -> token.getValue().equals("interface"))) - .then((validator) -> validator.validate( - (token) -> token.getType().equals(TokenType.NAME), - (bag, token) -> bag.set("name", token))); - def_anno_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((parent,bag) -> { - AnnotationClass current = new AnnotationClass((((AnnotableBuffer)parent).getAnnotationBuffer()), bag.get("name")); - if(parent instanceof ClassContainer) ((ClassContainer)parent).addClass(current); - return current; - }) - .multiple(clazz_container) - .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); - - StateTree def_anno_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); - clazz_.then(def_annos); - def_anno_mod.then(def_annos); - - //IMPORT - StateTree importState = new StateTree<>(); - importState.then((validator) -> { - if(validator.validate( - (token) -> token.getValue().equals("import"))){ - - validator.validate( - (token) -> token.getValue().equals("static"), - (bag, token) -> bag.set("static", null)); - - while(validator.validate( - (token) -> !token.getValue().equals(";"), - (bag, token) -> { - Token current = bag.get(); - if(current == null) bag.set(token); - else bag.set(current.concat(token)); - }) - ); - - return validator.validate((token) -> token.getValue().equals(";")); - } - return false; - }).end((parent, bag) -> { - ((JavaFile)parent).addImport(new Import(bag.has("static"), bag.get())); - return parent; - }); - - - InitialStateTree main = new InitialStateTree<>(); - - //PACKAGE - StateTree pack = main.then((validator) -> { - if(validator.validate( - (token) -> token.getValue().equals("package"))){ - - while(validator.validate( - (token) -> !token.getValue().equals(";"), - (bag, token) -> { - Token current = bag.get(); - if(current == null) bag.set(token); - else bag.set(current.concat(token)); - }) - ); - return validator.validate((token) -> token.getValue().equals(";")); - } - return false; - }).end((parent, bag) -> { - ((JavaFile)parent).setPackage(bag); - return parent; - }); - main.multiple(pack); - main.multiple(importState); - main.multiple(annotation); - main.multiple(clazz_); - - - System.out.println((System.currentTimeMillis()-time)+"ms"); - - setTokenizer(tokenizer); + setTokenizer(new JavaTokenizer()); setStateTree(main); - System.out.println("init"); + load.takeTiming("[load] %dms"); } - //TAKE ANNOTATIONS ??????? - private static void buildVariable(Bag bag){ - if(!bag.has("arg_name")) return; - - List parameters = bag.get("param"); - if(parameters == null){ - parameters = new ArrayList<>(); - bag.set("param", parameters); - } - - Integer mod = bag.get("arg_mod"); - - Variable variable = new Variable(null, mod == null ? 0 : mod, bag.get("arg_type"), bag.get("arg_name"), bag.get("arg_elips") == Boolean.TRUE); - bag.remove("arg_name"); - bag.remove("arg_mod"); - bag.remove("arg_type"); - bag.remove("arg_name"); - bag.remove("arg_elips"); - - parameters.add(variable); - } - - public static int getModifier(String modifier){ - switch(modifier){ - case "public": return Modifier.PUBLIC; - case "private": return Modifier.PRIVATE; - case "protected": return Modifier.PROTECTED; - case "static": return Modifier.STATIC; - case "final": return Modifier.FINAL; - case "synchronized": return Modifier.SYNCHRONIZED; - case "volatile": return Modifier.VOLATILE; - case "transient": return Modifier.TRANSIENT; - case "native": return Modifier.NATIVE; - case "abstract": return Modifier.ABSTRACT; - case "strictfp": return Modifier.STRICT; - case "default": return Modifier.STRICT; - default: break; - } - return 0; - } /* diff --git a/src/dev/peerat/parser/java/JavaTokenizer.java b/src/dev/peerat/parser/java/JavaTokenizer.java new file mode 100644 index 0000000..0231fec --- /dev/null +++ b/src/dev/peerat/parser/java/JavaTokenizer.java @@ -0,0 +1,171 @@ +package dev.peerat.parser.java; + +import java.io.BufferedReader; + +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.Tokenizer; + +public class JavaTokenizer extends Tokenizer{ + + @Override + public void parse(BufferedReader reader) throws Exception{ + int lineNumber = 0; + String line; + boolean longCommentary = false; + while((line = reader.readLine()) != null){ + lineNumber++; + + for(int i = 0; i < line.length(); i++){ + char c = line.charAt(i); + if(longCommentary){ + if(c == '*' && (i < line.length()-1 && line.charAt(i+1) == '/')){ + longCommentary = false; + i++; + } +// System.out.print(c); + continue; + } + Token token; + if(isNameValid(c)){ + String value = ""; + int j = i; + for(; j < line.length(); j++){ + c = line.charAt(j); + if(isNameValid(c)) value+=c; + else break; + } + token = new Token(lineNumber, i+1, value, TokenType.NAME); + i = j-1; + }else if(Character.isWhitespace(c)) continue; + else{ + if(c == '"'){ + String value = "\""; + int j = i+1; + for(; j < line.length(); j++){ + c = line.charAt(j); + if(c == '"'){ + value+=c; + j++; + break; + }else if(c == '\\'){ + value+=c+line.charAt(++j); + }else{ + value+=c; + } + } + token = new Token(lineNumber, i+1, value, TokenType.STRING); + i = j-1; + }else if(c == '\''){ + String value = "'"; + int j = i+1; + for(; j < line.length(); j++){ + c = line.charAt(j); + if(c == '\''){ + value+=c; + j++; + break; + }else if(c == '\\'){ + value+=c+line.charAt(++j); + }else{ + value+=c; + } + } + token = new Token(lineNumber, i+1, value, TokenType.CHAR); + i = j-1; + }else{ + if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '/')) break; + if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '*')){ + longCommentary = true; + continue; + } + token = new Token(lineNumber, i+1, ""+c, TokenType.DELIMITER); + } + } + getTokens().add(token); + } + } + } + + @Override + public void parse(String line){ + System.out.println("tokenizer"); + int lineNumber = 1; + boolean longCommentary = false; + for(int i = 0; i < line.length(); i++){ + char c = line.charAt(i); + if(longCommentary){ + if(c == '*' && (i < line.length()-1 && line.charAt(i+1) == '/')){ + longCommentary = false; + i++; + } +// System.out.print(c); + continue; + } + Token token; + if(isNameValid(c)){ + String value = ""; + int j = i; + for(; j < line.length(); j++){ + c = line.charAt(j); + if(isNameValid(c)) value+=c; + else break; + } + token = new Token(lineNumber, i+1, value, TokenType.NAME); + i = j-1; + }else if(Character.isWhitespace(c)) continue; + else{ + if(c == '"'){ + String value = "\""; + int j = i+1; + for(; j < line.length(); j++){ + c = line.charAt(j); + if(c == '"'){ + value+=c; + j++; + break; + }else if(c == '\\'){ + value+=c+line.charAt(++j); + }else{ + value+=c; + } + } + token = new Token(lineNumber, i+1, value, TokenType.STRING); + i = j-1; + System.out.println(token); + }else if(c == '\''){ + String value = "'"; + int j = i+1; + for(; j < line.length(); j++){ + c = line.charAt(j); + if(c == '\''){ + value+=c; + j++; + break; + }else if(c == '\\'){ + value+=c+line.charAt(++j); + }else{ + value+=c; + } + } + token = new Token(lineNumber, i+1, value, TokenType.CHAR); + i = j-1; + System.out.println(token); + }else{ + if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '/')) break; + if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '*')){ + longCommentary = true; + continue; + } + token = new Token(lineNumber, i+1, ""+c, TokenType.DELIMITER); + } + } + getTokens().add(token); + } + } + + private boolean isNameValid(char c) { + return Character.isAlphabetic(c) || Character.isDigit(c) || c == '_' || c == '$'; + } + +} diff --git a/src/dev/peerat/parser/java/Operation.java b/src/dev/peerat/parser/java/Operation.java index 1d9d947..f49496a 100644 --- a/src/dev/peerat/parser/java/Operation.java +++ b/src/dev/peerat/parser/java/Operation.java @@ -2,7 +2,7 @@ package dev.peerat.parser.java; import java.util.function.Predicate; -import dev.peerat.parser.TreeStreamable; +import dev.peerat.parser.StreamableTree; import dev.peerat.parser.java.Variable.VariableStreamable; import dev.peerat.parser.java.operation.AssignOperation; import dev.peerat.parser.java.operation.BreakOperation; @@ -14,7 +14,6 @@ import dev.peerat.parser.java.operation.FinallyOperation; import dev.peerat.parser.java.operation.ForOperation; import dev.peerat.parser.java.operation.ForeachOperation; 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.SwitchOperation; import dev.peerat.parser.java.operation.SynchronizedOperation; @@ -47,7 +46,7 @@ public abstract class Operation extends JavaElement{ return new OperationStreamable(); } - public class OperationStreamable implements TreeStreamable{ + public class OperationStreamable implements StreamableTree{ public OperationStreamable(){} @@ -62,7 +61,6 @@ public abstract class Operation extends JavaElement{ public OperationStreamable foreachOperationFilter(Predicate filter){ return null; } public OperationStreamable forOperationFilter(Predicate filter){ return null; } public OperationStreamable ifOperationFilter(Predicate filter){ return null; } - public OperationStreamable methodCallOperationFilter(Predicate filter){ return null; } public OperationStreamable returnOperationFilter(Predicate filter){ return null; } public OperationStreamable switchOperationFilter(Predicate filter){ return null; } public OperationStreamable synchronizedOperationFilter(Predicate filter){ return null; } diff --git a/src/dev/peerat/parser/java/Variable.java b/src/dev/peerat/parser/java/Variable.java index 0f8186e..b6368b6 100644 --- a/src/dev/peerat/parser/java/Variable.java +++ b/src/dev/peerat/parser/java/Variable.java @@ -7,7 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.TokenType; -import dev.peerat.parser.TreeStreamable; +import dev.peerat.parser.StreamableTree; import dev.peerat.parser.java.Annotation.Annotable; import dev.peerat.parser.java.value.ArrayValue; import dev.peerat.parser.java.value.BiValue; @@ -115,7 +115,7 @@ public class Variable extends Annotable{ return new VariableStreamable(); } - public class VariableStreamable implements TreeStreamable{ + public class VariableStreamable implements StreamableTree{ public VariableStreamable(){} diff --git a/src/dev/peerat/parser/java/operation/MethodCallOperation.java b/src/dev/peerat/parser/java/operation/MethodCallOperation.java deleted file mode 100644 index d10b1b2..0000000 --- a/src/dev/peerat/parser/java/operation/MethodCallOperation.java +++ /dev/null @@ -1,76 +0,0 @@ -package dev.peerat.parser.java.operation; - -import java.util.List; -import java.util.function.Function; - -import dev.peerat.parser.Token; -import dev.peerat.parser.java.JavaElement; -import dev.peerat.parser.java.Operation; -import dev.peerat.parser.java.value.Value; - -public class MethodCallOperation extends Operation{ - - private Value start; - private MethodCallOperation previous; - private Token path; - private List parameters; - - public MethodCallOperation(Value start, Token path, List parameters){ - this.start = start; - this.path = path; - this.parameters = parameters; - } - - public MethodCallOperation(MethodCallOperation previous, Token path, List parameters){ - this((Value)null, path, parameters); - this.previous = previous; - } - - public MethodCallOperation getPrevious(){ - return this.previous; - } - - public Token getPath(){ - return path; - } - - public List getParameters(){ - return this.parameters; - } - - @Override - public void build(Builder builder) throws Exception{ - if(previous != null) previous.build(builder); - //todo - } - - @Override - public E find(Function finder) { - if(start != null && finder.apply(start)) return (E)start; - if(previous != null) if(finder.apply(previous)) return (E) previous; - 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(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); - } - if(this.parameters != null){ - for(Value param : this.parameters){ - if(finder.apply(param)) list.add((E)param); - param.findAll(finder, list); - } - } - } -} diff --git a/src/dev/peerat/parser/java/tree/AnnotationClassTree.java b/src/dev/peerat/parser/java/tree/AnnotationClassTree.java new file mode 100644 index 0000000..07b2745 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/AnnotationClassTree.java @@ -0,0 +1,44 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.Annotation.AnnotableBuffer; +import dev.peerat.parser.java.AnnotationClass; +import dev.peerat.parser.java.ClassContainer; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class AnnotationClassTree extends SyntaxTree { + + public AnnotationClassTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree clazz_container = registery.getNode(ClassContainerTree.class); + ClassBaseTree clazz_ = registery.getTree(ClassBaseTree.class); + // ANNOTATION CLAZZ + StateTree def_annos = this.current; + StateTree def_anno_base = def_annos + .then((validator) -> validator.validate((token) -> token.getValue().equals("@")) + && validator.validate((token) -> token.getValue().equals("interface"))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("name", token))); + def_anno_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((parent, bag) -> { + AnnotationClass current = new AnnotationClass((((AnnotableBuffer) parent).getAnnotationBuffer()), + bag.get("name")); + if (parent instanceof ClassContainer) + ((ClassContainer) parent).addClass(current); + return current; + }).multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + clazz_.getNode().then(def_annos); + clazz_.getModifierNode().then(def_annos); + } + +} diff --git a/src/dev/peerat/parser/java/tree/AnnotationTree.java b/src/dev/peerat/parser/java/tree/AnnotationTree.java new file mode 100644 index 0000000..20f3921 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/AnnotationTree.java @@ -0,0 +1,91 @@ +package dev.peerat.parser.java.tree; + +import java.util.LinkedHashMap; +import java.util.Map; + +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.Annotation; +import dev.peerat.parser.java.Annotation.AnnotableBuffer; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class AnnotationTree extends SyntaxTree { + + public AnnotationTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree value = registery.getNode(ValueTree.class); + // ANNOTATION + StateTree annotation = this.current; + StateTree annotation_name = annotation + .then((validator) -> validator.validate((token) -> token.getValue().equals("@")) + && !validator.validate((token) -> token.getValue().equals("interface"))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> { + Token name = bag.get("name"); + if (name == null) + bag.set("name", token); + else + bag.set("name", name.concat(token)); + })); + annotation_name + .then((validator) -> validator.validate((token) -> token.getValue().equals("."), (bag, token) -> { + Token name = bag.get("name"); + if (name == null) + bag.set("name", token); + else + bag.set("name", name.concat(token)); + })).then(annotation_name); + annotation_name.end((parent, bag) -> { + Annotation result = new Annotation(bag.get("name")); + bag.set(result); + if (parent instanceof AnnotableBuffer) + ((AnnotableBuffer) parent).addAnnotationBuffer(result); + return null; + }); + StateTree annotation_begin = annotation_name + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree annotation_end = annotation_begin + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + annotation_end.end((parent, bag) -> { + Annotation result = new Annotation(bag.get("name"), bag.get("values")); + bag.set(result); + if (parent instanceof AnnotableBuffer) + ((AnnotableBuffer) parent).addAnnotationBuffer(result); + return null; + }); + StateTree annotation_var = annotation_begin.then((validator) -> validator + .validate((token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set("index", token))); + StateTree annotation_value = annotation_var + .then((validator) -> validator.validate((token) -> token.getValue().equals("="))) + .then(new RedirectStateTree<>(value, (global, local) -> { + Map map = global.get("values"); + if (map == null) { + map = new LinkedHashMap<>(); + global.set("values", map); + } + map.put(global.get("index"), local.get()); + })); + annotation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(annotation_var); + annotation_value.then(annotation_end); + annotation_begin.then(new RedirectStateTree<>(value, (global, local) -> { + Map map = global.get("values"); + if (map == null) { + map = new LinkedHashMap<>(); + global.set("values", map); + } + map.put(null, local.get()); + })).then(annotation_end); + } + +} diff --git a/src/dev/peerat/parser/java/tree/ClassBaseTree.java b/src/dev/peerat/parser/java/tree/ClassBaseTree.java new file mode 100644 index 0000000..dfe837e --- /dev/null +++ b/src/dev/peerat/parser/java/tree/ClassBaseTree.java @@ -0,0 +1,30 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class ClassBaseTree extends SyntaxTree { + + private StateTree modifierState; + + public ClassBaseTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree modifier = registery.getNode(ModifierTree.class); + + StateTree clazz_ = this.current; + this.modifierState = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + } + + public StateTree getModifierNode(){ + return this.modifierState; + } + +} diff --git a/src/dev/peerat/parser/java/tree/ClassContainerTree.java b/src/dev/peerat/parser/java/tree/ClassContainerTree.java new file mode 100644 index 0000000..965af37 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/ClassContainerTree.java @@ -0,0 +1,38 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class ClassContainerTree extends SyntaxTree { + + public ClassContainerTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init(){ + StateTree clazz_ = this.registery.getNode(ClassBaseTree.class); + StateTree function = this.registery.getNode(FunctionTree.class); + StateTree variable = this.registery.getNode(VariableTree.class); + StateTree function_container = this.registery.getNode(FunctionContainerTree.class); + + StateTree clazz_container = this.current; + clazz_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end((a, b) -> a); + + clazz_container.then(function); + clazz_container.then(variable); + + clazz_container.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a,b) -> a); + + clazz_container.then(clazz_); + } + +} diff --git a/src/dev/peerat/parser/java/tree/ClassTree.java b/src/dev/peerat/parser/java/tree/ClassTree.java new file mode 100644 index 0000000..003e293 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/ClassTree.java @@ -0,0 +1,81 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.Token; +import dev.peerat.parser.java.Annotation.AnnotableBuffer; +import dev.peerat.parser.java.Class; +import dev.peerat.parser.java.ClassContainer; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class ClassTree extends SyntaxTree { + + public ClassTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree type = registery.getNode(TypeTree.class); + StateTree clazz_container = registery.getNode(ClassContainerTree.class); + ClassBaseTree clazz_ = registery.getTree(ClassBaseTree.class); + // CLASS + StateTree clazz = this.current; + + StateTree clazz_base = clazz + .then((validator) -> validator.validate((token) -> token.getValue().equals("class"))) + .then(new RedirectStateTree<>(type, (global, local) -> global.set("name", local.get()))); + clazz_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((parent, bag) -> { + Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("name")); + if (parent instanceof ClassContainer) + ((ClassContainer) parent).addClass(current); + return current; + }).multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + StateTree clazz_implement = clazz_base + .then((validator) -> validator.validate((token) -> token.getValue().equals("implements"))); + StateTree clazz_implement_name = clazz_implement + .then(new RedirectStateTree<>(type, (global, local) -> { + Token token = global.get("implement"); + if (token == null) + global.set("implement", local.get()); + else + global.set("implement", token.concat(local.get())); + })); + clazz_implement_name + .then((validator) -> validator.validate((token) -> token.getValue().equals(","), + (bag, token) -> bag.set("implement", bag.get("implement").concat(token)))) + .then(clazz_implement_name); + clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((parent, bag) -> { + Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("name"), + bag.get("extend"), bag.get("implement")); + if (parent instanceof ClassContainer) + ((ClassContainer) parent).addClass(current); + return current; + }).multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + StateTree clazz_extend = clazz_base + .then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) + .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local.get()))); + clazz_extend.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((parent, bag) -> { + Class current = new Class((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("name"), + bag.get("extend"), bag.get("implement")); + if (parent instanceof ClassContainer) + ((ClassContainer) parent).addClass(current); + return current; + }).multiple(clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + clazz_extend.then(clazz_implement); + + + clazz_.getNode().then(clazz); + clazz_.getModifierNode().then(clazz); + } + +} diff --git a/src/dev/peerat/parser/java/tree/EnumTree.java b/src/dev/peerat/parser/java/tree/EnumTree.java new file mode 100644 index 0000000..c7a5dfc --- /dev/null +++ b/src/dev/peerat/parser/java/tree/EnumTree.java @@ -0,0 +1,72 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.Annotation.AnnotableBuffer; +import dev.peerat.parser.java.ClassContainer; +import dev.peerat.parser.java.Enumeration; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class EnumTree extends SyntaxTree { + + public EnumTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree modifier = registery.getNode(ModifierTree.class); + StateTree type = registery.getNode(TypeTree.class); + StateTree enum_value = registery.getNode(EnumValueTree.class); + StateTree clazz_ = registery.getNode(ClassBaseTree.class); + // ENUM + StateTree enums = this.current; + StateTree enum_base = enums + .then((validator) -> validator.validate((token) -> token.getValue().equals("enum"))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("name", token))); + + StateTree enum_start = enum_base + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); + enum_start.end((parent, bag) -> { + Enumeration current = new Enumeration((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("name"), + bag.get("implement")); + if (parent instanceof ClassContainer) + ((ClassContainer) parent).addClass(current); + return current; + }).unique(enum_value) +// .unique(mult_clazz_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + StateTree enum_implement = enum_base + .then((validator) -> validator.validate((token) -> token.getValue().equals("implements"))); + StateTree enum_implement_name = enum_implement + .then(new RedirectStateTree<>(type, (global, local) -> { + Token token = global.get("implement"); + if (token == null) + token = local.get(); + else + token = token.concat(local.get()); + global.set("implement", token); + })); + enum_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(enum_implement_name); + enum_implement_name.then(enum_start); + StateTree enum_extend = enum_base + .then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) + .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local.get()))); + enum_extend.then(enum_start); + enum_extend.then(enum_implement); + + StateTree enum_mod = clazz_ + .then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + clazz_.then(enums); + enum_mod.then(enums); + } + +} diff --git a/src/dev/peerat/parser/java/tree/EnumValueTree.java b/src/dev/peerat/parser/java/tree/EnumValueTree.java new file mode 100644 index 0000000..01bd6d7 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/EnumValueTree.java @@ -0,0 +1,39 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class EnumValueTree extends SyntaxTree { + + public EnumValueTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree value = registery.getNode(ValueTree.class); + + // ENUM VALUE + StateTree enum_value = this.current; + StateTree enum_name = enum_value + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + enum_name.end((a, b) -> a); + enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a, b) -> a); + enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(enum_name); + StateTree enum_arg = enum_name + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); + StateTree enum_end = enum_arg + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + enum_end.end((a, b) -> a); + enum_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a, b) -> a); + enum_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(enum_arg); + enum_end.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(enum_name); + } + +} diff --git a/src/dev/peerat/parser/java/tree/FunctionContainerTree.java b/src/dev/peerat/parser/java/tree/FunctionContainerTree.java new file mode 100644 index 0000000..2fb8b0f --- /dev/null +++ b/src/dev/peerat/parser/java/tree/FunctionContainerTree.java @@ -0,0 +1,28 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class FunctionContainerTree extends SyntaxTree { + + public FunctionContainerTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree variable = this.registery.getNode(VariableTree.class); + StateTree operation = this.registery.getNode(OperationTree.class); + + StateTree function_container = this.current; + function_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end((a, b) -> a); + + function_container.then(variable); + function_container.then(operation); + } + +} diff --git a/src/dev/peerat/parser/java/tree/FunctionTree.java b/src/dev/peerat/parser/java/tree/FunctionTree.java new file mode 100644 index 0000000..68da957 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/FunctionTree.java @@ -0,0 +1,173 @@ +package dev.peerat.parser.java.tree; + +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; +import java.util.function.BiFunction; + +import dev.peerat.parser.Bag; +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.Annotation; +import dev.peerat.parser.java.Function; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.Variable; +import dev.peerat.parser.java.Annotation.AnnotableBuffer; +import dev.peerat.parser.java.Function.FunctionContainer; +import dev.peerat.parser.state.BuilderStateTree; +import dev.peerat.parser.state.InitialStateTree; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class FunctionTree extends SyntaxTree { + + public FunctionTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new InitialStateTree<>(); + } + + @Override + public void init() { + StateTree modifier = registery.getNode(ModifierTree.class); + StateTree type = registery.getNode(TypeTree.class); + StateTree gen = registery.getNode(GenericTree.class); + StateTree value = registery.getNode(ValueTree.class); + StateTree annotation = registery.getNode(AnnotationTree.class); + StateTree function_container = registery.getNode(FunctionContainerTree.class); + + // FUNCTION + BiFunction function_builder = (parent, bag) -> { + buildVariable(bag); + Integer mod = bag.get("mod"); + List annotations = null; + if (parent instanceof AnnotableBuffer) + annotations = (((AnnotableBuffer) parent).getAnnotationBuffer()); + Function function = new Function(annotations, mod == null ? 0 : mod, bag.get("generic"), bag.get("type"), + bag.get("name"), bag.get("param"), bag.get("throws")); + if (parent instanceof FunctionContainer) + ((FunctionContainer) parent).addFunction(function); + return function; + }; + + InitialStateTree function = (InitialStateTree) this.current; + function.multiple(annotation); + BuilderStateTree function_static = function + .then((validator) -> validator.validate((token) -> token.getValue().equals("static")) + && validator.validate((token) -> token.getValue().equals("{"))) + .end((parent, bag) -> { + Function build = new Function((((AnnotableBuffer) parent).getAnnotationBuffer()), Modifier.STATIC, + null, null); + if (parent instanceof FunctionContainer) + ((FunctionContainer) parent).addFunction(build); + return build; + }); + function_static.multiple(function_container); + function_static.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); + StateTree function_mod = function.then(new RedirectStateTree<>(modifier, (global, local) -> { + Integer mod = global.get("mod"); + if (mod == null) + global.set("mod", local.get()); + else + global.set("mod", mod + local.get()); + })); + StateTree function_generic = function + .then(new RedirectStateTree<>(gen, (global, local) -> global.set("generic", local.get()))); + StateTree function_type = function + .then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local.get()))); + function_mod.then(function_mod); + function_mod.then(function_generic); + function_mod.then(function_type); + function_generic.then(function_type); + + StateTree function_name = function.then((validator) -> validator + .validate((token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set("name", token))); + function_type.then(function_name); + function_mod.then(function_name); + StateTree function_begin = function_name + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + StateTree function_end = function_begin + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end(function_builder).multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); + function_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end(); + function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("default"))) + .then(new RedirectStateTree<>(value, (global, local) -> System.out.println("TODO DEFAULT IN FUNCTION"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end(function_builder); + + StateTree function_throws = function_end + .then((validator) -> validator.validate((token) -> token.getValue().equals("throws"))) + .then(new RedirectStateTree<>(type, (global, local) -> { + List throwables = global.get("throws"); + if (throwables == null) { + throwables = new ArrayList<>(); + global.set("throws", throwables); + } + throwables.add(local.get()); + })); + BuilderStateTree function_start_throws = function_throws + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end(function_builder); + function_start_throws.multiple(function_container); + function_start_throws.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); + function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(function_throws); + function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end(function_builder); + + StateTree function_arg_mod = function_begin.then((validator) -> validator + .validate((token) -> token.getValue().equals("final"), (bag, token) -> bag.set("arg_mod", true))); + StateTree function_arg_type = function_begin + .then(new RedirectStateTree<>(type, (global, local) -> global.set("arg_type", local.get()))); + function_arg_mod.then(function_arg_type); + StateTree function_arg_type_array_begin = function_arg_type + .then((validator) -> validator.validate((token) -> token.getValue().equals("["), + (bag, token) -> bag.set("arg_type", bag.get("arg_type").concat(token)))); + StateTree function_arg_type_array_end = function_arg_type_array_begin + .then((validator) -> validator.validate((token) -> token.getValue().equals("]"), + (bag, token) -> bag.set("arg_type", bag.get("arg_type").concat(token)))); + function_arg_type_array_end.then(function_arg_type_array_begin); + StateTree function_arg_name = function_arg_type + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("arg_name", token))); + function_arg_type_array_end.then(function_arg_name); + function_arg_type + .then((validator) -> validator.validate((token) -> token.getValue().equals(".")) + && validator.validate((token) -> token.getValue().equals(".")) && validator.validate( + (token) -> token.getValue().equals("."), (bag, token) -> bag.set("arg_elips", true))) + .then(function_arg_name); + StateTree function_arg_split = function_arg_name + .then((validator) -> validator.validate((token) -> token.getValue().equals(","), (bag, token) -> { + buildVariable(bag); + })); + function_arg_split.then(function_arg_mod); + function_arg_split.then(function_arg_type); + function_arg_name.then(function_end); + } + + // TAKE ANNOTATIONS ??????? + private static void buildVariable(Bag bag) { + if (!bag.has("arg_name")) + return; + + List parameters = bag.get("param"); + if (parameters == null) { + parameters = new ArrayList<>(); + bag.set("param", parameters); + } + + Integer mod = bag.get("arg_mod"); + + Variable variable = new Variable(null, mod == null ? 0 : mod, bag.get("arg_type"), + bag.get("arg_name"), bag.get("arg_elips") == Boolean.TRUE); + bag.remove("arg_name"); + bag.remove("arg_mod"); + bag.remove("arg_type"); + bag.remove("arg_name"); + bag.remove("arg_elips"); + + parameters.add(variable); + } + +} diff --git a/src/dev/peerat/parser/java/tree/GenericTree.java b/src/dev/peerat/parser/java/tree/GenericTree.java new file mode 100644 index 0000000..7ff7765 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/GenericTree.java @@ -0,0 +1,80 @@ +package dev.peerat.parser.java.tree; + +import java.util.function.BiConsumer; + +import dev.peerat.parser.Bag; +import dev.peerat.parser.Token; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class GenericTree extends SyntaxTree { + + public GenericTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + + StateTree type = registery.getNode(TypeTree.class); + + BiConsumer concat = (bag, token) -> { + Token value = bag.get(); + if (value == null) + bag.set(token); + else + bag.set(value.concat(token)); + }; + + StateTree gen = this.current; + StateTree type_begin = gen + .then((validator) -> validator.validate((token) -> token.getValue().equals("<"), concat)); + StateTree type_generic = type_begin.then( + new RedirectStateTree<>(type, (global, local) -> global.set(global.get().concat(local.get())))); + StateTree type_generic_end = type_generic + .then((validator) -> validator.validate((token) -> token.getValue().equals(">"), concat)); + StateTree type_generic_split = type_generic + .then((validator) -> validator.validate((token) -> token.getValue().equals(","), concat)); + type_generic_split.then(type_generic); + + type_begin.then(type_generic_end); // remove ? + + StateTree type_generic_unknow = type_begin + .then((validator) -> validator.validate((token) -> token.getValue().equals("?"), concat)); + type_generic_unknow.then(type_generic_end); + type_generic_split.then(type_generic_unknow); + type_generic_unknow.then(type_generic_split); + StateTree type_generic_unknow_extends = type_generic_unknow + .then((validator) -> validator.validate((token) -> token.getValue().equals("extends"), concat)) + .then(new RedirectStateTree<>(type, + (global, local) -> global.set(global.get().concat(local.get())))); + type_generic_unknow_extends.then(type_generic_end); + type_generic_unknow_extends.then(type_generic_split); + StateTree type_generic_unknow_super = type_generic_unknow + .then((validator) -> validator.validate((token) -> token.getValue().equals("super"), concat)) + .then(new RedirectStateTree<>(type, + (global, local) -> global.set(global.get().concat(local.get())))); + type_generic_unknow_super.then(type_generic_end); + type_generic_unknow_super.then(type_generic_split); + + StateTree type_generic_named_extends = type_generic + .then((validator) -> validator.validate((token) -> token.getValue().equals("extends"), concat)) + .then(new RedirectStateTree<>(type, + (global, local) -> global.set(global.get().concat(local.get())))); + type_generic_named_extends.then(type_generic_end); + type_generic_named_extends.then(type_generic_split); + StateTree type_generic_named_super = type_generic + .then((validator) -> validator.validate((token) -> token.getValue().equals("super"), concat)) + .then(new RedirectStateTree<>(type, + (global, local) -> global.set(global.get().concat(local.get())))); + type_generic_named_super.then(type_generic_end); + type_generic_named_super.then(type_generic_split); + + type_generic_end.end(); + } + +} diff --git a/src/dev/peerat/parser/java/tree/InterfaceTree.java b/src/dev/peerat/parser/java/tree/InterfaceTree.java new file mode 100644 index 0000000..871793b --- /dev/null +++ b/src/dev/peerat/parser/java/tree/InterfaceTree.java @@ -0,0 +1,56 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.ClassContainer; +import dev.peerat.parser.java.Interface; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.Annotation.AnnotableBuffer; +import dev.peerat.parser.state.InitialStateTree; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class InterfaceTree extends SyntaxTree { + + public InterfaceTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree modifier = registery.getNode(ModifierTree.class); + StateTree type = registery.getNode(TypeTree.class); + StateTree clazz_container = registery.getNode(ClassContainerTree.class); + // INTERFACE + StateTree interfaces = this.current; + StateTree interface_base = interfaces + .then((validator) -> validator.validate((token) -> token.getValue().equals("interface"))) + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("name", token))); + StateTree interface_start = interface_base + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); + interface_start.end((parent, bag) -> { + Interface current = new Interface((((AnnotableBuffer) parent).getAnnotationBuffer()), bag.get("name"), + bag.get("extend")); + if (parent instanceof ClassContainer) + ((ClassContainer) parent).addClass(current); + return current; + }).multiple(clazz_container).unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) + .end((a, b) -> a); + + interface_base.then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) + .then(new RedirectStateTree<>(type, (global, local) -> global.set("extend", local.get()))) + .then(interface_start); + +// StateTree interface_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); +// clazz_.then(interfaces); +// interface_mod.then(interfaces); + + InitialStateTree mult_clazz_container = new InitialStateTree<>(); + mult_clazz_container.multiple(clazz_container); + mult_clazz_container.end((a, b) -> a); + } + +} diff --git a/src/dev/peerat/parser/java/tree/JavaTreeType.java b/src/dev/peerat/parser/java/tree/JavaTreeType.java new file mode 100644 index 0000000..77db4dc --- /dev/null +++ b/src/dev/peerat/parser/java/tree/JavaTreeType.java @@ -0,0 +1,33 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.tree.TreeType; + +public enum JavaTreeType implements TreeType{ + + ALL(null), + CLASS_BASE(ClassBaseTree.class), + CLASS(ClassTree.class), + INTERFACE(InterfaceTree.class), + ENUMERATION(EnumTree.class), + ANNOTATION_CLASS(AnnotationClassTree.class), + FUNCTION(FunctionTree.class), + OPERATION(OperationTree.class), + VARIABLE(VariableTree.class), + ANNOTATION(AnnotationTree.class), + VALUE(ValueTree.class), + TYPE(TypeTree.class), + GENERIC(GenericTree.class), + MODIFIER(ModifierTree.class); + + private Class type; + + JavaTreeType(Class type){ + this.type = type; + } + + @Override + public Class getType(){ + return type; + } + +} diff --git a/src/dev/peerat/parser/java/tree/ModifierTree.java b/src/dev/peerat/parser/java/tree/ModifierTree.java new file mode 100644 index 0000000..e94a550 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/ModifierTree.java @@ -0,0 +1,62 @@ +package dev.peerat.parser.java.tree; + +import java.lang.reflect.Modifier; + +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class ModifierTree extends SyntaxTree { + + public ModifierTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + this.current.then((validator) -> { + boolean mod = false; + while (validator.validate((token) -> getModifier(token.getValue()) > 0, (bag, token) -> { + int m = getModifier(token.getValue()); + Integer current = bag.get(); + bag.set(current == null ? m : current + m); + })) + mod = true; + return mod; + }).end(); + } + + private int getModifier(String modifier) { + switch (modifier) { + case "public": + return Modifier.PUBLIC; + case "private": + return Modifier.PRIVATE; + case "protected": + return Modifier.PROTECTED; + case "static": + return Modifier.STATIC; + case "final": + return Modifier.FINAL; + case "synchronized": + return Modifier.SYNCHRONIZED; + case "volatile": + return Modifier.VOLATILE; + case "transient": + return Modifier.TRANSIENT; + case "native": + return Modifier.NATIVE; + case "abstract": + return Modifier.ABSTRACT; + case "strictfp": + return Modifier.STRICT; + case "default": + return Modifier.STRICT; + default: + break; + } + return 0; + } +} diff --git a/src/dev/peerat/parser/java/tree/OperationTree.java b/src/dev/peerat/parser/java/tree/OperationTree.java new file mode 100644 index 0000000..3a7ab87 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/OperationTree.java @@ -0,0 +1,296 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.Operation.OperationContainer; +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.ForOperation; +import dev.peerat.parser.java.operation.IfOperation; +import dev.peerat.parser.java.operation.ReturnOperation; +import dev.peerat.parser.java.operation.SynchronizedOperation; +import dev.peerat.parser.java.operation.ThrowOperation; +import dev.peerat.parser.java.operation.WhileOperation; +import dev.peerat.parser.java.value.BiValue; +import dev.peerat.parser.java.value.MethodCallValue; +import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class OperationTree extends SyntaxTree { + + public OperationTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree modifier = registery.getNode(ModifierTree.class); + StateTree type = registery.getNode(TypeTree.class); + StateTree value = registery.getNode(ValueTree.class); + StateTree variable = registery.getNode(VariableTree.class); + StateTree function_container = registery.getNode(FunctionContainerTree.class); + + // OPERATION + StateTree operation = this.current; + + StateTree operation_return = operation + .then((validator) -> validator.validate((token) -> token.getValue().equals("return"))); + operation_return.then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((parent, bag) -> { + ReturnOperation op = new ReturnOperation(bag.get()); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return null; + }); + + operation_return.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end((parent, bag) -> { + ReturnOperation op = new ReturnOperation(bag.get()); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return null; + }); + + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("throw"))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((parent, bag) -> { + ThrowOperation op = new ThrowOperation(bag.get()); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return null; + }); + + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("do"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a, b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + StateTree operation_else = operation + .then((validator) -> validator.validate((token) -> token.getValue().equals("else"))).end((a, b) -> a); + operation_else.then(operation); + operation_else.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a, b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + StateTree operation_try = operation + .then((validator) -> validator.validate((token) -> token.getValue().equals("try"))); + StateTree operation_try_base = operation_try + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); + operation_try.then((validator) -> validator.validate((token) -> token.getValue().equals("("))) + .then(new RedirectStateTree<>(variable, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) + .then(operation_try_base); + StateTree operation_try_end = operation_try_base.end((a, b) -> a).multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + StateTree operation_finally = operation_try_end + .then((validator) -> validator.validate((token) -> token.getValue().equals("finally"))); + operation_finally.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((a, b) -> a).multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + StateTree operation_catch_named = operation_try_end + .then((validator) -> validator.validate((token) -> token.getValue().equals("catch"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) + .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); + operation_catch_named.then((validator) -> validator.validate((token) -> token.getValue().equals("|"))) + .then(operation_catch_named); + StateTree operation_catch = operation_catch_named + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a, b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + operation_catch.then(operation_finally); + operation_catch.then(operation_catch_named); + + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("continue"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((parent, bag) -> { + ContinueOperation op = new ContinueOperation(); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return null; + }); + + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("break"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((parent, bag) -> { + System.out.println("break"); + BreakOperation op = new BreakOperation(); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return null; + }); + + StateTree operation_if = operation + .then((validator) -> validator.validate((token) -> token.getValue().equals("if"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))).then((v) -> { + System.out.println("inside IF"); + return true; + }).then(new RedirectStateTree<>(value, (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; + }); + operation_if.then(operation); + operation_if.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a, b) -> a) + .multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + StateTree switch_cases = new StateTree<>(); + StateTree switch_case_begin = switch_cases + .then((validator) -> validator.validate((token) -> token.getValue().equals("case"))); + StateTree switch_case = switch_case_begin + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(":"))); + switch_case.then(switch_case_begin); + switch_case.end((a, b) -> a).multiple(function_container); + + switch_cases.then((validator) -> validator.validate((token) -> token.getValue().equals("default"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(":"))).end((a, b) -> a) + .multiple(function_container); + + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("switch"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")")) + && validator.validate((token) -> token.getValue().equals("{"))) + .end((a, b) -> a).multiple(switch_cases) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + StateTree operation_for = operation + .then((validator) -> validator.validate((token) -> token.getValue().equals("for"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))); + + StateTree operation_for_first_part = operation_for + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))); + + StateTree operation_for_modifier = operation_for.then(new RedirectStateTree<>(modifier, null)); + operation_for_modifier.then(operation_for_modifier); + + StateTree operation_for_type = operation_for + .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); + operation_for_modifier.then(operation_for_type); + + StateTree operation_for_assign = operation_for + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + operation_for_modifier.then(operation_for_assign); + operation_for_type.then(operation_for_assign); + + StateTree operation_for_assign_end = operation_for_assign + .then((validator) -> validator.validate((token) -> token.getValue().equals("="))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); + + operation_for_assign.then(operation_for_assign); + operation_for_assign.then(operation_for_first_part); + + operation_for_assign_end.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(operation_for_assign); + operation_for_assign_end.then(operation_for_first_part); + + StateTree operation_for_second_part = operation_for_first_part + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))); + + operation_for_first_part.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) + .then(operation_for_second_part); + + StateTree operation_for_end = operation_for_second_part + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + operation_for_end.end((parent, bag) -> { + ForOperation op = new ForOperation(null, null, null, null); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + System.out.println("FOOOR"); + return op; + }).then(operation); + + operation_for_end.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((parent, bag) -> { + ForOperation op = new ForOperation(null, null, null, null); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return op; + }).multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + operation_for_assign.then((validator) -> validator.validate((token) -> token.getValue().equals(":"))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))).then(operation_for_end); + + StateTree operation_for_update = operation_for_second_part + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); + operation_for_update.then(operation_for_end); + operation_for_update.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) + .then(operation_for_update); + + StateTree operation_while = operation + .then((validator) -> validator.validate((token) -> token.getValue().equals("while"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(null))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); + operation_while.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((parent, bag) -> { + WhileOperation op = new WhileOperation(null); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return op; + }).multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + operation_while.end((parent, bag) -> { + WhileOperation op = new WhileOperation(null); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return op; + }).then(operation); + + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("synchronized"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) + .end((parent, bag) -> { + SynchronizedOperation op = new SynchronizedOperation(bag.get()); + if (parent instanceof OperationContainer) + ((OperationContainer) parent).addOperation(op); + return op; + }).multiple(function_container) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); + + StateTree operation_name = operation + .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))); + operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set("newer", local.get()))) + .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end((parent, bag) -> parent); + + 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; + }); + + function_container.then(variable); + function_container.then(operation); + } + +} diff --git a/src/dev/peerat/parser/java/tree/TypeTree.java b/src/dev/peerat/parser/java/tree/TypeTree.java new file mode 100644 index 0000000..67b4b12 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/TypeTree.java @@ -0,0 +1,49 @@ +package dev.peerat.parser.java.tree; + +import java.util.function.BiConsumer; + +import dev.peerat.parser.Bag; +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class TypeTree extends SyntaxTree { + + public TypeTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + StateTree gen = registery.getNode(GenericTree.class); + // TYPE + BiConsumer concat = (bag, token) -> { + Token value = bag.get(); + if (value == null) + bag.set(token); + else + bag.set(value.concat(token)); + }; + + StateTree type = this.current; + StateTree type_ = type + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), concat)); +// type_.then((validator) -> validator.validate((token) -> token.getValue().equals("."), concat)) //only dot? +// .then(type_); + type_.then(gen); + + StateTree type_array_begin = type_ + .then((validator) -> validator.validate((token) -> token.getValue().equals("["))); + StateTree type_array_end = type_array_begin + .then((validator) -> validator.validate((token) -> token.getValue().equals("]"))); + type_array_end.then(type_array_begin); + type_array_end.end(); + + type_.end(); + } + +} diff --git a/src/dev/peerat/parser/java/tree/ValueTree.java b/src/dev/peerat/parser/java/tree/ValueTree.java new file mode 100644 index 0000000..df76373 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/ValueTree.java @@ -0,0 +1,170 @@ +package dev.peerat.parser.java.tree; + +import java.util.function.BiFunction; + +import dev.peerat.parser.Bag; +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.value.BiValue; +import dev.peerat.parser.java.value.StaticValue; +import dev.peerat.parser.java.value.Value.ValueContainer; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class ValueTree extends SyntaxTree { + + public ValueTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init(){ + StateTree type = this.registery.getNode(TypeTree.class); + StateTree function_container = this.registery.getNode(FunctionContainerTree.class); + StateTree class_container = this.registery.getNode(ClassContainerTree.class); + // VALUE + StateTree value = this.current; + StateTree unary_value = new StateTree<>(); + StateTree value_operation = new StateTree<>(); + + value.then((v) -> { + return v.validate((t) -> { + System.out.println("entry value "+t); + return false; + }); + }); + + BiFunction operationBuilder = (parent, bag) -> { + System.out.println("operationBuilder "+bag); + if (bag.has("current")) { + bag.set(new BiValue(new StaticValue(bag.get("current")), bag.get("action"), bag.get("right"))); + } else { + bag.set(new BiValue(bag.get(), bag.get("action"), bag.get("right"))); + } + System.out.println("value_op " + bag); + if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(bag.get()); + return null; + }; + + BiFunction staticValueBuilder = (parent, bag) -> { + System.out.println("staticValueBuilder "+bag); + StaticValue result = new StaticValue(bag.get("current")); + bag.set(result); + if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(result); + return null; + }; + + StateTree redirectRight = new RedirectStateTree<>(value, (global, local) -> { + System.out.println("redirectRight g="+global+" ,l="+local); + global.set("right", local.get()); + }); + + StateTree value_instance = unary_value.equals("new"); + StateTree value_instance_type = value_instance.redirect(type); + StateTree value_instance_params = value_instance_type.equals("("); + StateTree value_instance_params_end = value_instance_params.equals(")"); + StateTree value_instance_param = value_instance_params.redirect(value); + value_instance_param.then(value_instance_params_end); + value_instance_param.equals(",").then(value_instance_param); + value_instance_params_end.end(); + value_instance_params_end.equals("{") + .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(value); + 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(value); + StateTree value_instance_array_end = value_instance_array_value.equals("]"); + value_instance_array.then(value_instance_array_end); + value_instance_array_end.end(); + value_instance_array_end.then(value_instance_array); + + StateTree value_name = unary_value + .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), + (bag, token) -> bag.set("current", token))); + value_name.end(staticValueBuilder); + value_name.then(value_operation); + + unary_value.then((validator) -> validator.validate( + (token) -> token.getType().equals(TokenType.STRING) || token.getType().equals(TokenType.CHAR), + (bag, token) -> bag.set("current", token))) + .end(staticValueBuilder); + + value_operation.equals(">","action",">").then(redirectRight).end(operationBuilder); + value_operation.equals("<","action","<").then(redirectRight).end(operationBuilder); + value_operation.equals("<","action","<").equals("<","action","<<").then(redirectRight).end(operationBuilder); + value_operation.equals("+","action","+").then(redirectRight).end(operationBuilder); + StateTree value_operation_bit_and = value_operation.equals("&","action","&"); + value_operation_bit_and.then(redirectRight).end(operationBuilder); + value_operation_bit_and.equals("&","action","&&").then(redirectRight).end(operationBuilder); + StateTree value_operation_bit_or = value_operation.equals("|","action","|"); + value_operation_bit_or.then(redirectRight).end(operationBuilder); + value_operation_bit_or.equals("|","action","||").then(redirectRight).end(operationBuilder); + + value.equals("!").redirect(value).end(); + + StateTree left_value = value.redirect(unary_value); + left_value.end((parent, bag) -> { + if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(bag.get()); + return null; + }); + left_value.equals("?") + .redirect(unary_value) + .equals(":") + .redirect(unary_value) + .end((parent, bag) -> { + bag.set(new StaticValue(new Token(0,0,"",TokenType.NAME))); + if(parent instanceof ValueContainer) ((ValueContainer)parent).addValue(bag.get()); + return null; + }); + + StateTree value_array = left_value.equals("["); + StateTree value_array_value = value_array.redirect(value); + StateTree value_array_end = value_array_value.equals("]"); + value_array_end.end(); + value_array_end.then(value_array); + + StateTree operation_call = value_name.equals("."); + operation_call.then(value_name); + StateTree operation_begin = value_name.equals("("); + StateTree operation_end = operation_begin.equals(")"); + operation_end.then(operation_call); + operation_end.end(); + StateTree operation_value = operation_begin.redirect(value); + operation_value.then(operation_end); + operation_value.equals(",") + .then(operation_value); + + StateTree value_parenthesis = unary_value.equals("("); + StateTree value_parenthesis_close = value_parenthesis.equals(")"); + StateTree value_inside = value_parenthesis.redirect(value); + StateTree value_inside_type = value_parenthesis.redirect(type); + + 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.then(value_parenthesis_close); + value_inside.then(value_operation); + value_parenthesis_close.end(); + value_parenthesis_close.then(value_operation); + + 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) + .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end(); + + value_lambda.redirect(unary_value).end(); + + } + +} diff --git a/src/dev/peerat/parser/java/tree/VariableTree.java b/src/dev/peerat/parser/java/tree/VariableTree.java new file mode 100644 index 0000000..9181c63 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/VariableTree.java @@ -0,0 +1,89 @@ +package dev.peerat.parser.java.tree; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.BiFunction; + +import dev.peerat.parser.Bag; +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.java.Annotation; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.Variable; +import dev.peerat.parser.java.Annotation.AnnotableBuffer; +import dev.peerat.parser.java.Variable.VariableContainer; +import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.state.InitialStateTree; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class VariableTree extends SyntaxTree { + + public VariableTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new InitialStateTree<>(); + } + + @Override + public void init() { + StateTree modifier = registery.getNode(ModifierTree.class); + StateTree type = registery.getNode(TypeTree.class); + StateTree value = registery.getNode(ValueTree.class); + StateTree annotation = registery.getNode(AnnotationTree.class); + + // VARIABLE + BiFunction variable_builder = (parent, bag) -> { + Integer mod = bag.get("mod"); + Token vtype = bag.get("type"); + Map map = bag.get("vars"); + for (Entry vars : map.entrySet()) { + List annotations = null; + if (parent instanceof AnnotableBuffer) + annotations = (((AnnotableBuffer) parent).getAnnotationBuffer()); + Variable result = new Variable(annotations, mod == null ? 0 : mod, vtype, vars.getKey(), false, + vars.getValue()); + bag.set(result); + if (parent instanceof VariableContainer) + ((VariableContainer) parent).addVariable(result); + } + return null; + }; + + InitialStateTree variable = (InitialStateTree) this.current; + variable.multiple(annotation); + StateTree variable_mod = variable + .then(new RedirectStateTree<>(modifier, (global, local) -> global.set("mod", local.get()))); + StateTree variable_type = variable + .then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local.get()))); + variable_mod.then(variable_type); + StateTree variable_name = variable_type.then( + (validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), (bag, token) -> { + Map map = bag.get("vars"); + if (map == null) { + map = new LinkedHashMap<>(); + bag.set("vars", map); + } + bag.set("last", token); + map.put(token, null); + })); + variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end(variable_builder); + StateTree variable_split = variable_name + .then((validator) -> validator.validate((token) -> token.getValue().equals(","))); + variable_split.then(variable_name); + StateTree variable_value = variable_name + .then((validator) -> validator.validate((token) -> token.getValue().equals("="))) + .then(new RedirectStateTree<>(value, (global, local) -> { + global.>get("vars").put(global.get("last"), local.get()); + })); + variable_value.then(variable_split); + variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) + .end(variable_builder); + variable_value.end(variable_builder); + } + +} diff --git a/src/dev/peerat/parser/java/value/Value.java b/src/dev/peerat/parser/java/value/Value.java index 2e0d976..f3c3e0a 100644 --- a/src/dev/peerat/parser/java/value/Value.java +++ b/src/dev/peerat/parser/java/value/Value.java @@ -6,6 +6,13 @@ import dev.peerat.parser.java.JavaElement; public abstract class Value extends JavaElement{ + //Only for TESTS purpose! + public static interface ValueContainer{ + + void addValue(Value value); + + } + public ValueStreamable stream(){ return new ValueStreamable(); } diff --git a/src/dev/peerat/parser/state/RedirectStateTree.java b/src/dev/peerat/parser/state/RedirectStateTree.java index da7d13d..5be24f6 100644 --- a/src/dev/peerat/parser/state/RedirectStateTree.java +++ b/src/dev/peerat/parser/state/RedirectStateTree.java @@ -10,18 +10,18 @@ public class RedirectStateTree extends StateTree{ private StateTree redirect; private BiConsumer group; - private StackTraceElement calling; +// private StackTraceElement calling; public RedirectStateTree(StateTree redirect, BiConsumer group){ super(); this.redirect = redirect; this.group = group; - StackTraceElement[] trace = Thread.currentThread().getStackTrace(); - int current = 0; - while((current < trace.length) && (!(trace[++current].getClassName().endsWith("JavaParser")))); +// StackTraceElement[] trace = Thread.currentThread().getStackTrace(); +// int current = 0; +// while((current < trace.length) && (!(trace[++current].getClassName().endsWith("JavaParser")))); - this.calling = trace[current]; +// this.calling = trace[current]; } @Override @@ -35,7 +35,7 @@ public class RedirectStateTree extends StateTree{ if(builded == null) return null; builded.build(branch, element); - System.out.println("[redirect done] "+calling); +// System.out.println("[redirect done] "+calling); this.group.accept(currentBag, localBag); branch.setBag(currentBag); diff --git a/src/dev/peerat/parser/state/StateTree.java b/src/dev/peerat/parser/state/StateTree.java index 258b6bb..2d3eb8e 100644 --- a/src/dev/peerat/parser/state/StateTree.java +++ b/src/dev/peerat/parser/state/StateTree.java @@ -2,6 +2,7 @@ package dev.peerat.parser.state; import java.util.ArrayList; import java.util.List; +import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Function; @@ -77,4 +78,24 @@ public class StateTree{ return builderState; } + //maybe remove later + public StateTree equals(String value){ + return then((validator) -> validator.validate((token) -> token.getValue().equals(value))); + } + + public StateTree equals(String value, String key){ + return then((validator) -> validator.validate((token) -> token.getValue().equals(value), (bag, token) -> bag.set(key, token))); + } + + public StateTree equals(String value, String key, String val){ + return then((validator) -> validator.validate((token) -> token.getValue().equals(value), (bag, token) -> bag.set(key, val))); + } + + public StateTree redirect(StateTree target){ + return then(new RedirectStateTree<>(target, (global, local) -> global.set(local.get()))); + } + + public StateTree redirect(StateTree target, BiConsumer group){ + return then(new RedirectStateTree<>(target, group)); + } } diff --git a/src/dev/peerat/parser/tree/SyntaxTree.java b/src/dev/peerat/parser/tree/SyntaxTree.java new file mode 100644 index 0000000..81eee37 --- /dev/null +++ b/src/dev/peerat/parser/tree/SyntaxTree.java @@ -0,0 +1,29 @@ +package dev.peerat.parser.tree; + +import dev.peerat.parser.state.StateTree; + +public abstract class SyntaxTree{ + + protected SyntaxTreeRegistery registery; + protected StateTree current; + private boolean init; + + public SyntaxTree(SyntaxTreeRegistery registery){ + this.registery = registery; + } + + public StateTree getNode(){ + return this.current; + } + + public void checkInit(){ + if(!init){ + init(); + this.init = true; + } + } + + public abstract void init(); + + +} diff --git a/src/dev/peerat/parser/tree/SyntaxTreeRegistery.java b/src/dev/peerat/parser/tree/SyntaxTreeRegistery.java new file mode 100644 index 0000000..f7bb397 --- /dev/null +++ b/src/dev/peerat/parser/tree/SyntaxTreeRegistery.java @@ -0,0 +1,35 @@ +package dev.peerat.parser.tree; + +import java.util.HashMap; +import java.util.Map; + +import dev.peerat.parser.state.StateTree; + +public class SyntaxTreeRegistery{ + + private Map, SyntaxTree> registery; + + public SyntaxTreeRegistery(){ + this.registery = new HashMap<>(); + } + + public void register(SyntaxTree node){ + this.registery.put(node.getClass(), node); + } + + public StateTree getNode(Class clazz){ + return this.registery.get(clazz).getNode(); + } + + public > T getTree(Class clazz){ + T result = (T) this.registery.get(clazz); + result.checkInit(); + return result; + } + + public void init(){ + for(SyntaxTree tree : registery.values()){ + tree.checkInit(); + } + } +} diff --git a/src/dev/peerat/parser/tree/TreeType.java b/src/dev/peerat/parser/tree/TreeType.java new file mode 100644 index 0000000..efe9d1f --- /dev/null +++ b/src/dev/peerat/parser/tree/TreeType.java @@ -0,0 +1,6 @@ +package dev.peerat.parser.tree; + +public interface TreeType{ + + Class getType(); +}