diff --git a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java index 8f68ce4..3ec56c2 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java +++ b/src/be/jeffcheasey88/peeratcode/parser/java/JavaParser.java @@ -6,7 +6,6 @@ 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; @@ -117,6 +116,8 @@ public class JavaParser extends Parser { validator.validate( (token) -> token.getType().equals(TokenType.NAME), (bag, token) -> bag.set(token))); + type_.then((validator) -> validator.validate((token) -> token.getValue().equals("."))) + .then(type_); StateTree gen = new StateTree<>(); type_.then(gen); StateTree type_begin = gen.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))); @@ -283,9 +284,14 @@ public class JavaParser extends Parser { 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_or = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("|"))); + value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("|"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + value_or.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + StateTree value_and = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("&"))); + value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("&"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + value_and.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); @@ -300,6 +306,9 @@ public class JavaParser extends Parser { StateTree value_mod = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("%"))); value_mod.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_mod.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + StateTree value_xor = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("^"))); + value_xor.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); + value_xor.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); @@ -540,9 +549,18 @@ public class JavaParser extends Parser { 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((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); + .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); operation_for_assign.then(operation_for_assign); operation_for_assign.then(operation_for_first_part); @@ -555,18 +573,26 @@ public class JavaParser extends Parser { StateTree operation_for_second_part = operation_for_first_part.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))); - operation_for_first_part.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) + operation_for_first_part.then(new RedirectStateTree<>(value_container, (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((a,b) -> a); + + operation_for_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); operation_for_assign.then((validator) -> validator.validate((token) -> token.getValue().equals(":"))) - .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) + .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) .then(operation_for_end); - operation_for_second_part.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) - .then(operation_for_end); + StateTree operation_for_update = operation_for_second_part.then(new RedirectStateTree<>(value_container, (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("("))) @@ -588,6 +614,10 @@ public class JavaParser extends Parser { .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((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_container.then(variable); @@ -703,11 +733,15 @@ public class JavaParser extends Parser { 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) + StateTree interface_start = interface_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); + interface_start.end((a,b) -> a) .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(null))) + .then(interface_start); + StateTree interface_mod = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); clazz_.then(interfaces); interface_mod.then(interfaces); @@ -726,13 +760,28 @@ public class JavaParser extends Parser { 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) + + StateTree enum_start = enum_base.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))); + enum_start.end((a,b) -> a) .unique(enum_value) .unique(mult_clazz_container) .unique(debug) .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);