peer-at-code-parser-java/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java
jeffcheasey88 64f39dc840 One Value
2023-07-09 11:47:29 +02:00

301 lines
18 KiB
Java

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<JavaFile> {
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<JavaFile> parser = new JavaParser();
JavaFile jFile = new JavaFile();
parser.parse(reader, jFile);
System.out.println((System.currentTimeMillis()-time)+"ms");
}
private static final
Function<TokenValidator, Boolean>
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<JavaFile, TokenValidator, JavaFile>
END_PACKAGE = ((javafile, validator) -> javafile.setPackage(validator.getBag())),
END_IMPORT = ((javafile, validator) -> javafile.addImport(validator.getBag()));
BiFunction<JavaFile, TokenValidator, Class>
END_CLASS = ((javafile, validator) -> javafile.setClass(new Class(validator.getBag())));
BiFunction<JavaElement, TokenValidator, Token>
END_TYPE = ((javafile, validator) -> {
System.out.println("return token "+validator.getBag().get());
return validator.getBag().get();
});
BiFunction<JavaElement, TokenValidator, Variable>
END_VAR = ((javafile, validator) -> {
System.out.println("new var");
return new Variable(validator.getBag());
});
BiFunction<JavaElement, TokenValidator, be.jeffcheasey88.peeratcode.parser.java.Function>
END_FUNC = ((javafile, validator) -> {
System.out.println("new function");
return new be.jeffcheasey88.peeratcode.parser.java.Function(validator.getBag());
});
BiFunction<JavaElement, TokenValidator, Integer>
END_MODIFIER = ((javafile, validator) ->{
return validator.getBag().get();
});
public JavaParser(){
Tokenizer tokenizer = new Tokenizer();
Function<TokenValidator, Boolean> LAMBDA_0 = (v) -> v.validate((t) -> t.getValue().equals("package"));
Function<TokenValidator, Boolean> LAMBDA_1 = (v) -> v.validate((t) -> t.getValue().equals(";"));
Function<TokenValidator, Boolean> LAMBDA_3 = (v) -> v.validate((t) -> t.getValue().equals("import"));
Function<TokenValidator, Boolean> LAMBDA_4 = (v) -> v.validate((t) -> t.getValue().equals("static"), (bag, token) -> bag.set("static", "bool"));
Function<TokenValidator, Boolean> LAMBDA_5 = (v) -> v.validate((t) -> t.getValue().equals("<"));
Function<TokenValidator, Boolean> LAMBDA_6 = (v) -> v.validate((t) -> t.getValue().equals(">"));
Function<TokenValidator, Boolean> LAMBDA_7 = (v) -> v.validate((t) -> t.getValue().equals(","));
Function<TokenValidator, Boolean> LAMBDA_8 = (v) -> v.validate((t) -> t.getValue().equals("="));
Function<TokenValidator, Boolean> LAMBDA_10 = (v) -> v.validate((t) -> t.getValue().equals("!"));
Function<TokenValidator, Boolean> LAMBDA_11 = (v) -> v.validate((t) -> t.getValue().equals("?"));
Function<TokenValidator, Boolean> LAMBDA_12 = (v) -> v.validate((t) -> t.getValue().equals(":"));
Function<TokenValidator, Boolean> LAMBDA_13 = (v) -> v.validate((t) -> t.getValue().equals("~"));
Function<TokenValidator, Boolean> LAMBDA_14 = (v) -> v.validate((t) -> t.getValue().equals("+"));
Function<TokenValidator, Boolean> LAMBDA_15 = (v) -> v.validate((t) -> t.getValue().equals("-"));
Function<TokenValidator, Boolean> LAMBDA_16 = (v) -> v.validate((t) -> t.getValue().equals("/"));
Function<TokenValidator, Boolean> LAMBDA_17 = (v) -> v.validate((t) -> t.getValue().equals("*"));
Function<TokenValidator, Boolean> LAMBDA_18 = (v) -> v.validate((t) -> t.getValue().equals("&"));
Function<TokenValidator, Boolean> LAMBDA_19 = (v) -> v.validate((t) -> t.getValue().equals("|"));
Function<TokenValidator, Boolean> LAMBDA_20 = (v) -> v.validate((t) -> t.getValue().equals("^"));
Function<TokenValidator, Boolean> LAMBDA_21 = (v) -> v.validate((t) -> t.getValue().equals("%"));
Function<TokenValidator, Boolean> LAMBDA_23 = (v) -> v.validate((t) -> t.getValue().equals("("));
Function<TokenValidator, Boolean> LAMBDA_24 = (v) -> v.validate((t) -> t.getValue().equals(")"));
Function<TokenValidator, Boolean> LAMBDA_25 = (v) -> v.validate((t) -> t.getValue().equals("."));
Function<TokenValidator, Boolean> LAMBDA_26 = (v) -> v.validate((t) -> t.getValue().equals("\""));
Function<TokenValidator, Boolean> LAMBDA_27 = (v) -> v.validate((t) -> !t.getValue().equals("\""));
Function<TokenValidator, Boolean> LAMBDA_28 = (v) -> v.validate((t) -> t.getValue().equals("'"));
Function<TokenValidator, Boolean> LAMBDA_29 = (v) -> v.validate((t) -> t.getValue().equals("oneChar"));
Function<TokenValidator, Boolean> LAMBDA_30 = (v) -> v.validate((t) -> t.getValue().equals("if"));
Function<TokenValidator, Boolean> LAMBDA_31 = (v) -> v.validate((t) -> t.getValue().equals("for"));
Function<TokenValidator, Boolean> LAMBDA_32 = (v) -> v.validate((t) -> t.getValue().equals("while"));
Function<TokenValidator, Boolean> LAMBDA_33 = (v) -> v.validate((t) -> t.getValue().equals("return"));
Function<TokenValidator, Boolean> LAMBDA_34 = (v) -> v.validate((t) -> t.getValue().equals("do"));
Function<TokenValidator, Boolean> LAMBDA_35 = (v) -> v.validate((t) -> t.getValue().equals("synchronized"));
Function<TokenValidator, Boolean> LAMBDA_36 = (v) -> v.validate((t) -> t.getValue().equals("continue"));
Function<TokenValidator, Boolean> LAMBDA_37 = (v) -> v.validate((t) -> t.getValue().equals("throw"));
Function<TokenValidator, Boolean> LAMBDA_38 = (v) -> v.validate((t) -> t.getValue().equals("break"));
Function<TokenValidator, Boolean> LAMBDA_39 = (v) -> v.validate((t) -> t.getValue().equals("try"));
Function<TokenValidator, Boolean> LAMBDA_40 = (v) -> v.validate((t) -> t.getValue().equals("{"));
Function<TokenValidator, Boolean> LAMBDA_41 = (v) -> v.validate((t) -> t.getValue().equals("}"));
Function<TokenValidator, Boolean> LAMBDA_44 = (v) -> v.validate((t) -> t.getValue().equals("throws"));
Function<TokenValidator, Boolean> LAMBDA_46 = (v) -> v.validate((t) -> t.getValue().equals("class"));
Function<TokenValidator, Boolean> LAMBDA_47 = (v) -> v.validate((t) -> t.getValue().equals("implements"));
Function<TokenValidator, Boolean> LAMBDA_48 = (v) -> v.validate((t) -> t.getValue().equals("extends"));
StateTree<JavaFile> main = new StateTree<>();
StateTree<JavaElement> 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<Token> build(String... values){
List<Token> 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<Bag, Token> 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<JavaElement> value(
Function<TokenValidator, Boolean> LAMBDA_5,
Function<TokenValidator, Boolean> LAMBDA_6,
Function<TokenValidator, Boolean> LAMBDA_7,
Function<TokenValidator, Boolean> LAMBDA_8,
Function<TokenValidator, Boolean> LAMBDA_10,
Function<TokenValidator, Boolean> LAMBDA_11,
Function<TokenValidator, Boolean> LAMBDA_12,
Function<TokenValidator, Boolean> LAMBDA_13,
Function<TokenValidator, Boolean> LAMBDA_14,
Function<TokenValidator, Boolean> LAMBDA_15,
Function<TokenValidator, Boolean> LAMBDA_16,
Function<TokenValidator, Boolean> LAMBDA_17,
Function<TokenValidator, Boolean> LAMBDA_18,
Function<TokenValidator, Boolean> LAMBDA_19,
Function<TokenValidator, Boolean> LAMBDA_20,
Function<TokenValidator, Boolean> LAMBDA_21,
Function<TokenValidator, Boolean> LAMBDA_23,
Function<TokenValidator, Boolean> LAMBDA_24,
Function<TokenValidator, Boolean> LAMBDA_25,
Function<TokenValidator, Boolean> LAMBDA_26,
Function<TokenValidator, Boolean> LAMBDA_27,
Function<TokenValidator, Boolean> LAMBDA_28,
Function<TokenValidator, Boolean> LAMBDA_29
){
BiFunction<JavaElement, TokenValidator, JavaElement> END_NATIVE_VALUE = (element, validator) -> {
System.out.println("\tnative\t"+element);
System.out.println("\t"+validator.getBag());
return new ValueContainer(validator.getBag().<Bag>get("?").get());
};
BiFunction<JavaElement, TokenValidator, JavaElement> 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<JavaElement, TokenValidator, JavaElement> END_BIVALUE = (element, validator) -> {
//create new value from parent & created single value
System.out.println("\tbivalue\t"+element);
return null;
};
BiFunction<JavaElement, TokenValidator, JavaElement> END_TRIVALUE = (element, validator) -> {
//same but for val ? val : val
System.out.println("\ttrivalue\t"+element);
return new TriValue();
};
StateTree<JavaElement> value_q0 = new StateTree<>();
StateTree<JavaElement> value_q22 = new StateTree<>();
StateTree<JavaElement> value_q23 = value_q22.then(LAMBDA_8);
value_q23.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // ==
value_q23.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // =
StateTree<JavaElement> value_q24 = value_q22.then(LAMBDA_5);
value_q24.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // <
value_q24.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // <=
StateTree<JavaElement> value_q41 = value_q24.then(LAMBDA_5);
value_q41.then(new RedirectStateTree<>(value_q0,(bag) -> "<<")).<JavaElement>end(END_BIVALUE); // <<
value_q41.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // <<=
StateTree<JavaElement> value_q25 = value_q22.then(LAMBDA_6);
value_q25.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // >
value_q25.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // >=
StateTree<JavaElement> value_q55 = value_q25.then(LAMBDA_6);
value_q55.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // >>
value_q55.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // >>=
StateTree<JavaElement> value_q61 = value_q55.then(LAMBDA_6);
value_q61.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // >>>
value_q61.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // >>>=
StateTree<JavaElement> value_q26 = value_q22.then(LAMBDA_10);
value_q26.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // !
value_q26.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // !=
value_q22.then(LAMBDA_11).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).then(LAMBDA_12).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_TRIVALUE); //? :
value_q22.then(LAMBDA_13).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // ~
StateTree<JavaElement> value_q29 = value_q22.then(LAMBDA_14);
value_q29.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // +
value_q29.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // +=
value_q29.then(LAMBDA_14).<JavaElement>end(END_VALUE); // ++
StateTree<JavaElement> value_q30 = value_q22.then(LAMBDA_15);
value_q30.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // -
value_q30.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // -=
value_q30.then(LAMBDA_15).<JavaElement>end(END_VALUE); // --
StateTree<JavaElement> value_q31 = value_q22.then(LAMBDA_16);
value_q31.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // /
value_q31.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // /=
StateTree<JavaElement> value_q32 = value_q22.then(LAMBDA_17);
value_q32.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // *
value_q32.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // *=
StateTree<JavaElement> value_q33 = value_q22.then(LAMBDA_18);
value_q33.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // &
value_q33.then(LAMBDA_18).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // &&
value_q33.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // &=
StateTree<JavaElement> value_q34 = value_q22.then(LAMBDA_19);
value_q34.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // |
value_q34.then(LAMBDA_19).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // ||
value_q34.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // |=
StateTree<JavaElement> value_q35 = value_q22.then(LAMBDA_20);
value_q35.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // ^
value_q35.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // ^=
StateTree<JavaElement> value_q36 = value_q22.then(LAMBDA_21);
value_q36.then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // %
value_q36.then(LAMBDA_8).then(new RedirectStateTree<>(value_q0,(bag) -> "?")).<JavaElement>end(END_BIVALUE); // %=
StateTree<JavaElement> value_q1 = value_q0.then(LAMBDA_name);
StateTree<JavaElement> value_q12 = value_q1.then(LAMBDA_23);
StateTree<JavaElement> value_q13 = value_q12.then(new RedirectStateTree<>(value_q0,(bag) -> "?"));
StateTree<JavaElement> value_q15 = value_q13.then(LAMBDA_24);
value_q15.<JavaElement>end(END_VALUE).then(value_q22);
value_q12.then(value_q15);
StateTree<JavaElement> value_q14 = value_q13.then(LAMBDA_7);
value_q14.then(value_q13);
value_q1.<JavaElement>end(END_VALUE).then(value_q22);
StateTree<JavaElement> 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).<JavaElement>end(END_NATIVE_VALUE).then(value_q22);
value_q0.then(LAMBDA_26).then(LAMBDA_27).then(LAMBDA_26).<JavaElement>end(END_NATIVE_VALUE).then(value_q22);
value_q0.then(LAMBDA_28).then(LAMBDA_29).then(LAMBDA_28).<JavaElement>end(END_NATIVE_VALUE).then(value_q22);
return value_q0;
}
}