package be.jeffcheasey88.peeratcode.parser.java; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import be.jeffcheasey88.peeratcode.parser.Parser; import be.jeffcheasey88.peeratcode.parser.Token; import be.jeffcheasey88.peeratcode.parser.TokenType; import be.jeffcheasey88.peeratcode.parser.TokenValidator; import be.jeffcheasey88.peeratcode.parser.Tokenizer; import be.jeffcheasey88.peeratcode.parser.state.BuilderStateTree; import be.jeffcheasey88.peeratcode.parser.state.InitialStateTree; import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree; import be.jeffcheasey88.peeratcode.parser.state.StateTree; public class JavaParser extends Parser { public static long time; static { time = System.currentTimeMillis(); } public JavaParser(){ Tokenizer tokenizer = new Tokenizer(){ @Override public void parse(BufferedReader reader) throws Exception{ int lineNumber = 0; String line; while((line = reader.readLine()) != null){ lineNumber++; for(int i = 0; i < line.length(); i++){ char c = line.charAt(i); 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 == '/' && (i == line.length()-1 || line.charAt(i+1) == '/')) break; 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 //- Operation //- Variable //- 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); System.out.println("mod "+token); })) mod = true; return mod; }).end((a,b) -> a); //TYPE StateTree type = new StateTree(); StateTree type_ = type.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set(token))); StateTree type_begin = type_.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))); StateTree type_generic = type_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); StateTree type_generic_end = type_generic.then((validator) -> validator.validate((token) -> token.getValue().equals(">"))); StateTree type_generic_split = type_generic.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); type_generic_split.then(type_generic); type_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("?"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) .then(type_generic_end); type_begin.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) .then((validator) -> validator.validate((token) -> token.getValue().equals("extends"))) .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) .then(type_generic_end); type_.end((a,b) -> a); type_generic_end.end((a,b) -> a); 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_generic_end.then(type_array_begin); type_array_end.then(type_array_begin); type_array_end.end((a,b) -> a); StateTree clazz_container = new StateTree<>(); StateTree braces_container = new StateTree<>(); //VALUE StateTree value = new StateTree<>(); StateTree value_container = new StateTree<>(); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("("))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .end((a,b) -> a); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("!"))).then(value_container); StateTree value_left = value_container.then(new RedirectStateTree<>(value, (global, local) -> global.set(null))); value_left.end((a,b) -> a); StateTree value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="))); value_equals.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_equals.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); StateTree value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))).loop(); value_minus.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); StateTree value_max = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals(">"))).loop(); value_max.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_max.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("!")) && validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("|")) && validator.validate((token) -> token.getValue().equals("|"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("&")) && validator.validate((token) -> token.getValue().equals("&"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("~"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); StateTree value_plus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))); value_plus.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))).end((a,b) -> a); StateTree value_min = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("-"))); value_min.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("-"))).end((a,b) -> a); StateTree value_div = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("/"))); value_div.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_div.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); StateTree value_mult = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("*"))); value_mult.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_mult.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("?"))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(":"))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .end((a,b) -> a); StateTree value_instance = value.then((validator) -> validator.validate((token) -> token.getValue().equals("new"))); StateTree value_name = new StateTree(); value.then(value_name); value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> global.set(local))) .end((a,b) -> { System.out.println("new "+b); return a; }) .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) .multiple(braces_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); value_name = value_name.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> { Token current = bag.get(); if(current == null) current = token; else current = current.concat(token); bag.set(current); })); value_name.end((a,b) -> a); StateTree value_call = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))); value_call.then(value_name); StateTree value_array_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("["))); StateTree value_array_end = value_array_begin.then((validator) -> validator.validate((token) -> token.getValue().equals("]"))); value_array_begin.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("inside", local))) .then(value_array_end); value_array_end.end((a,b) -> a); value_array_end.then(value_call); StateTree value_arg_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree value_arg_end = value_arg_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); value_arg_end.end((a,b) -> a); value_arg_end.then(value_call); StateTree value_generic_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))); StateTree value_generic_name = value_generic_begin.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); StateTree value_generic_split = value_generic_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))); StateTree value_generic_end = value_generic_begin.then((validator) -> validator.validate((token) -> token.getValue().equals(">"))); value_generic_end.then(value_arg_begin); value_generic_end.then(value_generic_name); value_generic_end.then(value_generic_split); value_generic_name.then(value_generic_begin); value_generic_split.then(value_generic_name); StateTree value_arg = value_arg_begin.then(new RedirectStateTree<>(value_container, (global, local) -> { Integer count = global.get("args"); if(count == null) count = 0; global.set("arg"+count, local); global.set("args", (count+1)); })); value_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) .then(value_arg); value_arg.then(value_arg_end); value.then((validator) -> { if(validator.validate((token) -> token.getValue().equals("'"))){ validator.validate((token) -> token.getValue().equals("\\")); return validator.validate( (token) -> true, (bag, token) -> bag.set(token)) && validator.validate((token) -> token.getValue().equals("'")); } return false; }).end((a,b) -> a); value.then((validator) -> { if(validator.validate((token) -> token.getValue().equals("\""))){ boolean escaped = true; while(escaped){ while(validator.validate( (token) -> !token.getValue().equals("\""), (bag, token) -> { Token current = bag.get(); if(current == null) current = token; else current = current.concat(token); bag.set(current); })); if(validator.validate((token) -> token.getValue().equals("\""), (bag, token) -> { Token current = bag.get(); if(current == null) current = token; else current = current.concat(token); bag.set(current); })){ }else escaped = false; } return validator.validate((token) -> token.getValue().equals("\"")); } return false; }).end((a,b) -> a); StateTree braces_array = braces_container.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); braces_array.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) .then(braces_array); braces_array.end((a,b) -> a); //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); StateTree enum_arg = enum_name.then((validator) -> validator.validate((token) -> token.getValue().equals("("))) .then(new RedirectStateTree<>(value_container, (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(",")) || validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); enum_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) .then(enum_arg); //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))); annotation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))).then(annotation_name); annotation_name.end((a,b) -> a); 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((a,b) -> a); StateTree annotation_var = annotation_begin.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); StateTree annotation_value = annotation_var.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); annotation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(annotation_var); annotation_value.then(annotation_end); annotation_begin.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).then(annotation_end); StateTree function_container = new StateTree<>(); //OPERATION StateTree operation = new StateTree<>(); StateTree operation_name = operation.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); StateTree operation_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_container, (global, local) -> global.set(null))); operation_value.then(operation_end); operation_value.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(operation_value); StateTree operation_return = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("return"))); operation_return.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); operation_return.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); operation.then((validator) -> validator.validate((token) -> token.getValue().equals("throw"))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); operation.then((validator) -> validator.validate((token) -> token.getValue().equals("do"))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); operation.then((validator) -> validator.validate((token) -> token.getValue().equals("else"))) .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<>(value_container, (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"))) // .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); operation.then((validator) -> validator.validate((token) -> token.getValue().equals("continue"))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); operation.then((validator) -> validator.validate((token) -> token.getValue().equals("break"))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); StateTree operation_if = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("if"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .end((a,b) -> a); 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 operation_for = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("for"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree operation_for_init = operation_for.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); StateTree operation_foreach = operation_for_init.then((validator) -> validator.validate((token) -> token.getValue().equals(":"))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); operation_foreach.end((a,b) -> a); operation_foreach.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_while = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("while"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); operation_while.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.then((validator) -> validator.validate((token) -> token.getValue().equals("synchronized"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .end((a,b) -> a); //VARIABLE InitialStateTree variable = new InitialStateTree<>(); variable.multiple(annotation); StateTree variable_mod = variable.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); StateTree variable_type = variable.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local))); variable_mod.then(variable_type); StateTree variable_name = variable_type.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set(token))); variable_name.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> new Variable(b)); 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_container, (global, local) -> global.set("value", local))); variable_value.then(variable_split); variable_value.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) .end((a,b) -> a); function_container.then(variable); function_container.then(operation); //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((a,b) -> a); function_static.multiple(function_container); function_static.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); StateTree function_mod = function.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); StateTree function_type = function.then(new RedirectStateTree<>(type, (global, local) -> global.set("type", local))); function_mod.then(function_type); StateTree function_name = function_type.then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set(token))); 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((a,b) -> a) .multiple(function_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); function_end.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); StateTree function_throws = function_end.then((validator) -> validator.validate((token) -> token.getValue().equals("throws"))) .then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); BuilderStateTree function_start_throws = function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))).end((a,b) -> a); function_start_throws.multiple(function_container); function_start_throws.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_throws); function_throws.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a); StateTree function_arg_type = function_begin.then(new RedirectStateTree<>(type, (global, local) -> global.set(null))); StateTree function_arg_name = function_arg_type.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); function_arg_type.then((validator) -> validator.validate((token) -> token.getValue().equals(".")) && validator.validate((token) -> token.getValue().equals(".")) && validator.validate((token) -> token.getValue().equals("."))) .then(function_arg_name); function_arg_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(function_arg_type); function_arg_name.then(function_end); clazz_container.then(function); clazz_container.then(variable); braces_container.then(clazz_container); //CLASS StateTree clazz_ = new StateTree<>(); StateTree clazz = new StateTree<>(); 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((JavaElement, bag) -> new Class(bag)) .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) token = local.get(); else token = token.concat(local.get()); global.set("implement", token); })); clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals(","))).then(clazz_implement_name); clazz_implement_name.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((JavaElement, bag) -> new Class(bag)) .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((JavaElement, bag) -> new Class(bag)) .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))); interface_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) .multiple(clazz_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); StateTree interface_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); clazz_.then(interfaces); interface_mod.then(interfaces); //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))); enum_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) .multiple(enum_value) .multiple(clazz_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); 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))); def_anno_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) .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"), (bag, token) -> bag.set(new LinkedList<>()))){ validator.validate( (token) -> token.getValue().equals("static"), (bag, token) -> bag.set("static", null)); while(validator.validate( (token) -> !token.getValue().equals(";"), (bag, token) -> bag.>get().add(token)) ); return validator.validate((token) -> token.getValue().equals(";")); } return false; }).end((javafile, bag) -> javafile); InitialStateTree main = new InitialStateTree<>(); //PACKAGE StateTree pack = main.then((validator) -> { if(validator.validate( (token) -> token.getValue().equals("package"), (bag, token) -> bag.set(new LinkedList<>()))){ while(validator.validate( (token) -> !token.getValue().equals(";"), (bag, token) -> bag.>get().add(token)) ); return validator.validate((token) -> token.getValue().equals(";")); } return false; }).end((javafile, bag) -> javafile); main.multiple(pack); main.multiple(importState); main.multiple(annotation); main.multiple(clazz_); System.out.println((System.currentTimeMillis()-time)+"ms"); setTokenizer(tokenizer); setStateTree(main); } 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; default: break; } return 0; } public static void main(String[] args) throws Exception{ File file = new File("C:\\Users\\jeffc\\eclipse-workspace\\B1PRB_Janvier2021_Oral_LhoistXavier\\src\\be\\lhoistxavier\\GameFrame.java"); BufferedReader reader = new BufferedReader(new FileReader(file)); time = System.currentTimeMillis(); Parser parser = new JavaParser(); JavaElement jFile = new JavaElement(); parser.parse(reader, jFile); System.out.println((System.currentTimeMillis()-time)+"ms"); System.out.println(TokenValidator.MAX_VALIDATE); parser.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt")))); } }