package be.jeffcheasey88.peeratcode.parser.java; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Function; import be.jeffcheasey88.peeratcode.parser.Bag; 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.java.Value.BiValue; import be.jeffcheasey88.peeratcode.parser.java.Value.TriValue; import be.jeffcheasey88.peeratcode.parser.java.Value.ValueContainer; import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree; import be.jeffcheasey88.peeratcode.parser.state.StateTree; public class JavaParser extends Parser { public static long time; public static void main(String[] args) throws Exception{ File file = new File("C:\\Users\\jeffc\\eclipse-workspace\\peer-at-code-backend\\src\\be\\jeffcheasey88\\peeratcode\\routes\\Result.java"); BufferedReader reader = new BufferedReader(new FileReader(file)); time = System.currentTimeMillis(); Parser parser = new JavaParser(); JavaFile jFile = new JavaFile(); parser.parse(reader, jFile); System.out.println((System.currentTimeMillis()-time)+"ms"); } private static final Function LAMBDA_name = (v) -> v.validate((t) -> t.getType().equals(TokenType.NAME), (bag, token) -> { Token base = bag.get(); if(base == null) bag.set(token); else bag.set(base.concat(token)); }), // LAMBDA_name = (v) -> v.validate((t) -> {if(t.getType().equals(TokenType.NAME) && JavaParser.getModifier(t.getValue()) == 0) { System.out.println("valid type name --> "+t.getValue()); return true;}else return false;}), LAMBDA_mod = (v) -> v.validate((t) -> JavaParser.getModifier(t.getValue()) > 0, (bag, token) -> { Integer modifier = bag.get(); if(modifier == null) modifier = 0; bag.set(modifier+JavaParser.getModifier(token.getValue())); }); BiFunction END_PACKAGE = ((javafile, validator) -> javafile.setPackage(validator.getBag())), END_IMPORT = ((javafile, validator) -> javafile.addImport(validator.getBag())); BiFunction END_CLASS = ((javafile, validator) -> javafile.setClass(new Class(validator.getBag()))); BiFunction END_TYPE = ((javafile, validator) -> { System.out.println("return token "+validator.getBag().get()); return validator.getBag().get(); }); BiFunction END_VAR = ((javafile, validator) -> { System.out.println("new var"); return new Variable(validator.getBag()); }); BiFunction END_FUNC = ((javafile, validator) -> { System.out.println("new function"); return new be.jeffcheasey88.peeratcode.parser.java.Function(validator.getBag()); }); BiFunction END_MODIFIER = ((javafile, validator) ->{ return validator.getBag().get(); }); public JavaParser(){ Tokenizer tokenizer = new Tokenizer(); Function LAMBDA_0 = (v) -> v.validate((t) -> t.getValue().equals("package")); Function LAMBDA_1 = (v) -> v.validate((t) -> t.getValue().equals(";")); Function LAMBDA_3 = (v) -> v.validate((t) -> t.getValue().equals("import")); Function LAMBDA_4 = (v) -> v.validate((t) -> t.getValue().equals("static"), (bag, token) -> bag.set("static", "bool")); Function LAMBDA_5 = (v) -> v.validate((t) -> t.getValue().equals("<")); Function LAMBDA_6 = (v) -> v.validate((t) -> t.getValue().equals(">")); Function LAMBDA_7 = (v) -> v.validate((t) -> t.getValue().equals(",")); Function LAMBDA_8 = (v) -> v.validate((t) -> t.getValue().equals("=")); Function LAMBDA_10 = (v) -> v.validate((t) -> t.getValue().equals("!")); Function LAMBDA_11 = (v) -> v.validate((t) -> t.getValue().equals("?")); Function LAMBDA_12 = (v) -> v.validate((t) -> t.getValue().equals(":")); Function LAMBDA_13 = (v) -> v.validate((t) -> t.getValue().equals("~")); Function LAMBDA_14 = (v) -> v.validate((t) -> t.getValue().equals("+")); Function LAMBDA_15 = (v) -> v.validate((t) -> t.getValue().equals("-")); Function LAMBDA_16 = (v) -> v.validate((t) -> t.getValue().equals("/")); Function LAMBDA_17 = (v) -> v.validate((t) -> t.getValue().equals("*")); Function LAMBDA_18 = (v) -> v.validate((t) -> t.getValue().equals("&")); Function LAMBDA_19 = (v) -> v.validate((t) -> t.getValue().equals("|")); Function LAMBDA_20 = (v) -> v.validate((t) -> t.getValue().equals("^")); Function LAMBDA_21 = (v) -> v.validate((t) -> t.getValue().equals("%")); Function LAMBDA_23 = (v) -> v.validate((t) -> t.getValue().equals("(")); Function LAMBDA_24 = (v) -> v.validate((t) -> t.getValue().equals(")")); Function LAMBDA_25 = (v) -> v.validate((t) -> t.getValue().equals(".")); Function LAMBDA_26 = (v) -> v.validate((t) -> t.getValue().equals("\"")); Function LAMBDA_27 = (v) -> v.validate((t) -> !t.getValue().equals("\"")); Function LAMBDA_28 = (v) -> v.validate((t) -> t.getValue().equals("'")); Function LAMBDA_29 = (v) -> v.validate((t) -> t.getValue().equals("oneChar")); Function LAMBDA_30 = (v) -> v.validate((t) -> t.getValue().equals("if")); Function LAMBDA_31 = (v) -> v.validate((t) -> t.getValue().equals("for")); Function LAMBDA_32 = (v) -> v.validate((t) -> t.getValue().equals("while")); Function LAMBDA_33 = (v) -> v.validate((t) -> t.getValue().equals("return")); Function LAMBDA_34 = (v) -> v.validate((t) -> t.getValue().equals("do")); Function LAMBDA_35 = (v) -> v.validate((t) -> t.getValue().equals("synchronized")); Function LAMBDA_36 = (v) -> v.validate((t) -> t.getValue().equals("continue")); Function LAMBDA_37 = (v) -> v.validate((t) -> t.getValue().equals("throw")); Function LAMBDA_38 = (v) -> v.validate((t) -> t.getValue().equals("break")); Function LAMBDA_39 = (v) -> v.validate((t) -> t.getValue().equals("try")); Function LAMBDA_40 = (v) -> v.validate((t) -> t.getValue().equals("{")); Function LAMBDA_41 = (v) -> v.validate((t) -> t.getValue().equals("}")); Function LAMBDA_44 = (v) -> v.validate((t) -> t.getValue().equals("throws")); Function LAMBDA_46 = (v) -> v.validate((t) -> t.getValue().equals("class")); Function LAMBDA_47 = (v) -> v.validate((t) -> t.getValue().equals("implements")); Function LAMBDA_48 = (v) -> v.validate((t) -> t.getValue().equals("extends")); StateTree main = new StateTree<>(); StateTree value_q0 = value(LAMBDA_5, LAMBDA_6, LAMBDA_7, LAMBDA_8, LAMBDA_10, LAMBDA_11, LAMBDA_12, LAMBDA_13, LAMBDA_14, LAMBDA_15, LAMBDA_16, LAMBDA_17, LAMBDA_18, LAMBDA_19, LAMBDA_20, LAMBDA_21, LAMBDA_23, LAMBDA_24, LAMBDA_25, LAMBDA_26, LAMBDA_27, LAMBDA_28, LAMBDA_29); System.out.println("----"); //(ab = (cd & 34)) // tokenizer.getTokens().addAll(build("(","ab","=","(","cd","&","34",")",")")); tokenizer.getTokens().addAll(build("(","ab","=","cd",")")); // tokenizer.getTokens().addAll(build("(","ab",")")); value_q0.seed(tokenizer, null); System.out.println("----"); System.out.println((System.currentTimeMillis()-time)+"ms"); // try { // DebugServer server = new DebugServer(main); // } catch (Exception e) { // e.printStackTrace(); // } setTokenizer(tokenizer); setStateTree(main); } private List build(String... values){ List list = new ArrayList<>(); for(String value : values) list.add(new Token(0, 0, value, value.length() > 1 ? TokenType.NAME : TokenType.DELIMITER)); return list; } private BiConsumer groupToken(String group){ return (bag, token) -> { Token base = bag.get(group); if(base == null) bag.set(group, token); else bag.set(group, base.concat(token)); }; } 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; } private StateTree value( Function LAMBDA_5, Function LAMBDA_6, Function LAMBDA_7, Function LAMBDA_8, Function LAMBDA_10, Function LAMBDA_11, Function LAMBDA_12, Function LAMBDA_13, Function LAMBDA_14, Function LAMBDA_15, Function LAMBDA_16, Function LAMBDA_17, Function LAMBDA_18, Function LAMBDA_19, Function LAMBDA_20, Function LAMBDA_21, Function LAMBDA_23, Function LAMBDA_24, Function LAMBDA_25, Function LAMBDA_26, Function LAMBDA_27, Function LAMBDA_28, Function LAMBDA_29 ){ BiFunction END_NATIVE_VALUE = (element, validator) -> { System.out.println("\tnative\t"+element); System.out.println("\t"+validator.getBag()); return new ValueContainer(validator.getBag().get("?").get()); }; BiFunction END_VALUE = (element, validator) -> { //single value System.out.println("\tvalue\t"+element); Value v = new Value(validator.getBag().get()); validator.getBag().set(v); return v; }; BiFunction END_BIVALUE = (element, validator) -> { //create new value from parent & created single value System.out.println("\tbivalue\t"+element); return null; }; BiFunction END_TRIVALUE = (element, validator) -> { //same but for val ? val : val System.out.println("\ttrivalue\t"+element); return new TriValue(); }; StateTree value_q0 = new StateTree<>(); StateTree value_q22 = new StateTree<>(); StateTree value_q23 = value_q22.then(LAMBDA_8); value_q23.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // == value_q23.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // = StateTree value_q24 = value_q22.then(LAMBDA_5); value_q24.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // < value_q24.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // <= StateTree value_q41 = value_q24.then(LAMBDA_5); value_q41.then(new RedirectStateTree<>(value_q0,(bag) -> "<<")).end(END_BIVALUE); // << value_q41.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // <<= StateTree value_q25 = value_q22.then(LAMBDA_6); value_q25.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // > value_q25.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // >= StateTree value_q55 = value_q25.then(LAMBDA_6); value_q55.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // >> value_q55.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // >>= StateTree value_q61 = value_q55.then(LAMBDA_6); value_q61.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // >>> value_q61.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // >>>= StateTree value_q26 = value_q22.then(LAMBDA_10); value_q26.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // ! value_q26.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // != value_q22.then(LAMBDA_11).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).then(LAMBDA_12).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_TRIVALUE); //? : value_q22.then(LAMBDA_13).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // ~ StateTree value_q29 = value_q22.then(LAMBDA_14); value_q29.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // + value_q29.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // += value_q29.then(LAMBDA_14).end(END_VALUE); // ++ StateTree value_q30 = value_q22.then(LAMBDA_15); value_q30.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // - value_q30.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // -= value_q30.then(LAMBDA_15).end(END_VALUE); // -- StateTree value_q31 = value_q22.then(LAMBDA_16); value_q31.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // / value_q31.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // /= StateTree value_q32 = value_q22.then(LAMBDA_17); value_q32.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // * value_q32.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // *= StateTree value_q33 = value_q22.then(LAMBDA_18); value_q33.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // & value_q33.then(LAMBDA_18).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // && value_q33.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // &= StateTree value_q34 = value_q22.then(LAMBDA_19); value_q34.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // | value_q34.then(LAMBDA_19).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // || value_q34.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // |= StateTree value_q35 = value_q22.then(LAMBDA_20); value_q35.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // ^ value_q35.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // ^= StateTree value_q36 = value_q22.then(LAMBDA_21); value_q36.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // % value_q36.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).end(END_BIVALUE); // %= StateTree value_q1 = value_q0.then(LAMBDA_name); StateTree value_q12 = value_q1.then(LAMBDA_23); StateTree value_q13 = value_q12.then(new RedirectStateTree<>(value_q0,(bag) -> "?")); StateTree value_q15 = value_q13.then(LAMBDA_24); value_q15.end(END_VALUE).then(value_q22); value_q12.then(value_q15); StateTree value_q14 = value_q13.then(LAMBDA_7); value_q14.then(value_q13); value_q1.end(END_VALUE).then(value_q22); StateTree value_q11 = value_q1.then(LAMBDA_25); value_q11.then(value_q1); value_q0.then(LAMBDA_23).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).then(LAMBDA_24).end(END_NATIVE_VALUE).then(value_q22); value_q0.then(LAMBDA_26).then(LAMBDA_27).then(LAMBDA_26).end(END_NATIVE_VALUE).then(value_q22); value_q0.then(LAMBDA_28).then(LAMBDA_29).then(LAMBDA_28).end(END_NATIVE_VALUE).then(value_q22); return value_q0; } }