package dev.peerat.parser.java; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.BiFunction; import org.junit.jupiter.api.Test; import dev.peerat.parser.Bag; import dev.peerat.parser.Parser; import dev.peerat.parser.Token; import dev.peerat.parser.TokenType; import dev.peerat.parser.TokenValidator; import dev.peerat.parser.java.value.BiValue; import dev.peerat.parser.java.value.StaticValue; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.state.RedirectStateTree; import dev.peerat.parser.state.StateTree; public class ValueTests { public static StateTree get(){ BiFunction value_builder = (parent, bag) -> { if(bag.has("right")){ BiValue result = new BiValue(bag.get("left"), bag.get("action"), bag.get("right")); bag.set(result); } return null; }; BiConsumer value_right = (global, local) -> { global.set("right", local.get("left")); }; StateTree value = new StateTree<>(); StateTree value_container = new StateTree<>(); StateTree value_list = new StateTree<>(); StateTree value_list_element = value_list.then(new RedirectStateTree<>(value_container, (global, local) -> { List list = global.get(); if(list == null){ list = new ArrayList<>(); global.set(list); } list.add(local.get()); })); value_list_element.end(); value_list_element.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) .then(value_list_element); 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.get()))) .end((parent, bag) -> { Value result = new StaticValue(bag.get()); bag.set(result); return result; }) .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(new RedirectStateTree<>(TypeTests.get(), (global, local) -> { global.set(local.get()); })); value_name.end((parent,bag) -> { Value result = new StaticValue(bag.get()); bag.set(result); return null; }); value_name.then((validator) -> validator.validate((token) -> token.getValue().equals(":")) && validator.validate((token) -> token.getValue().equals(":"))) .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))) .end((a,b) -> a); StateTree value_call = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("."))); value_call.end((a,b) -> a); 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) .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) .multiple(value_list) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); value_array_end.then(value_call); value_array_end.then(value_array_begin); 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_begin.then(value_generic_end); 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_name.then(value_generic_end); 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); StateTree value_left = new StateTree<>(); StateTree value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("("))); StateTree value_cast = value_parenthesis.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(null))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))); value_cast.then(value_left); StateTree value_lambda_arg = value_parenthesis.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME))); value_lambda_arg.then((validator) -> validator.validate((token) -> token.getValue().equals(","))) .then(value_lambda_arg); StateTree value_lambda = value_parenthesis.then((validator) -> validator.validate((token) -> token.getValue().equals(")")) && validator.validate((token) -> token.getValue().equals("-")) && validator.validate((token) -> token.getValue().equals(">"))); value_lambda.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a).end((a,b) -> a) // .multiple(function_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a); value_lambda.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a); value_lambda_arg.then(value_lambda); StateTree value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value_container, (global, local) -> global.set("left", local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))); value_parenthesis_end.end(); value_parenthesis_end.then(value_call); value_parenthesis_end.then(value_left); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("!"))).then(value_container); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("-"))).then(value_container); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("+"))).then(value_container); value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("~"))).then(value_container); StateTree value_inside = value_container.then(new RedirectStateTree<>(value, (global, local) -> global.set("left", local.get()))); value_inside.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(value_left); value_inside.then(value_left); value_left.end((parent, bag) -> { if(bag.get() == null) bag.set(bag.get("left")); return null; }); StateTree value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "="))); value_equals.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_equals.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "=="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); StateTree value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"), (bag, token) -> bag.set("action", "(value_container, value_right)).end(value_builder); value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "(value_container, value_right)).end(value_builder); StateTree value_max = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals(">"), (bag, token) -> bag.set("action", ">?"))).loop(); value_max.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_max.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", ">?="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("!")) && validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "!="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); StateTree value_or = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("|"), (bag, token) -> bag.set("action", "|"))); value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("|"), (bag, token) -> bag.set("action", "||"))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_or.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "|="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_or.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); StateTree value_and = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&"))); value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("&"), (bag, token) -> bag.set("action", "&&"))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_and.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "&="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_and.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); StateTree value_plus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("+"), (bag, token) -> bag.set("action", "+"))); value_plus.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "+="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("+"), (bag, token) -> bag.set("action", "++"))).end(value_builder); StateTree value_min = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("-"), (bag, token) -> bag.set("action", "-"))); value_min.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "-="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("-"), (bag, token) -> bag.set("action", "--"))).end(value_builder); StateTree value_div = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("/"), (bag, token) -> bag.set("action", "/"))); value_div.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_div.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "/="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); StateTree value_mod = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("%"), (bag, token) -> bag.set("action", "%"))); value_mod.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_mod.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "%="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); StateTree value_xor = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("^"), (bag, token) -> bag.set("action", "^"))); value_xor.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_xor.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "^="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); StateTree value_mult = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("*"), (bag, token) -> bag.set("action", "*"))); value_mult.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_mult.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "*="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder); value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("?"))) .then(new RedirectStateTree<>(value_container, value_right)) .then((validator) -> validator.validate((token) -> token.getValue().equals(":"), (bag, token) -> bag.set("action", "?:"))) .then(new RedirectStateTree<>(value_container, value_right)) .end(value_builder); StateTree value_instanceof = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("instanceof"), (bag, token) -> bag.set("action", "instanceof"))) .then(new RedirectStateTree<>(TypeTests.get(), value_right)); value_instanceof.end(value_builder); value_instanceof.then(value_left); value.then((validator) -> { if(validator.validate((token) -> token.getValue().equals("'"))){ validator.validate((token) -> token.getValue().equals("\\")); return validator.validate((token) -> token.getValue().equals("'")) || (validator.validate((token) -> !token.getValue().equals("'")) && validator.validate((token) -> token.getValue().equals("'"))); } return false; }).end(); value.then((validator) -> { if(validator.validate((token) -> token.getValue().equals("\""))){ 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); })); return 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); }); } return false; }).end((parent,bag) -> { bag.set(new StaticValue(bag.get())); return null; }); return value_container; } private static Parser parser = new Parser(){ { setTokenizer(ModifierTests.TOKENIZER); setStateTree(get()); } }; JavaElement testCase(String value) throws Exception{ JavaElement result = null; parser.parse(value, result); return result; } @Test void doubleInDouble() throws Exception{ JavaElement result = testCase("(jeffcheasey88 == goefra) || (yuzzu == yugs)"); } }