[Build] Values
This commit is contained in:
parent
9ad002d6db
commit
a6f90a2c3e
3 changed files with 349 additions and 80 deletions
|
@ -18,6 +18,7 @@ import be.jeffcheasey88.peeratcode.parser.Token;
|
||||||
import be.jeffcheasey88.peeratcode.parser.TokenType;
|
import be.jeffcheasey88.peeratcode.parser.TokenType;
|
||||||
import be.jeffcheasey88.peeratcode.parser.TokenValidator;
|
import be.jeffcheasey88.peeratcode.parser.TokenValidator;
|
||||||
import be.jeffcheasey88.peeratcode.parser.Tokenizer;
|
import be.jeffcheasey88.peeratcode.parser.Tokenizer;
|
||||||
|
import be.jeffcheasey88.peeratcode.parser.java.Value.BiValue;
|
||||||
import be.jeffcheasey88.peeratcode.parser.state.BuilderStateTree;
|
import be.jeffcheasey88.peeratcode.parser.state.BuilderStateTree;
|
||||||
import be.jeffcheasey88.peeratcode.parser.state.InitialStateTree;
|
import be.jeffcheasey88.peeratcode.parser.state.InitialStateTree;
|
||||||
import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree;
|
import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree;
|
||||||
|
@ -165,13 +166,32 @@ public class JavaParser extends Parser<JavaElement> {
|
||||||
function_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a);
|
function_container.then((validator) -> validator.validate((token) -> token.getValue().equals(";"))).end((a,b) -> a);
|
||||||
|
|
||||||
//VALUE
|
//VALUE
|
||||||
|
BiFunction<JavaElement, Bag, JavaElement> 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<Bag, Bag> value_right = (global, local) -> {
|
||||||
|
global.set("right", local.get("left"));
|
||||||
|
};
|
||||||
|
|
||||||
StateTree<JavaElement> value = new StateTree<>();
|
StateTree<JavaElement> value = new StateTree<>();
|
||||||
|
|
||||||
StateTree<JavaElement> value_container = new StateTree<>();
|
StateTree<JavaElement> value_container = new StateTree<>();
|
||||||
|
|
||||||
StateTree<JavaElement> value_list = new StateTree<>();
|
StateTree<JavaElement> value_list = new StateTree<>();
|
||||||
StateTree<JavaElement> value_list_element = value_list.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)));
|
StateTree<JavaElement> value_list_element = value_list.then(new RedirectStateTree<>(value_container, (global, local) -> {
|
||||||
value_list_element.end((a,b) -> a);
|
List<Value> 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(",")))
|
value_list_element.then((validator) -> validator.validate((token) -> token.getValue().equals(",")))
|
||||||
.then(value_list_element);
|
.then(value_list_element);
|
||||||
|
|
||||||
|
@ -184,8 +204,12 @@ public class JavaParser extends Parser<JavaElement> {
|
||||||
.end((a,b) -> a)
|
.end((a,b) -> a)
|
||||||
.multiple(braces_container)
|
.multiple(braces_container)
|
||||||
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a);
|
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a);
|
||||||
value_name = value_name.then(new RedirectStateTree<>(type, (global, local) -> global.set(null)));
|
value_name = value_name.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(local.get())));
|
||||||
value_name.end((a,b) -> a);
|
value_name.end((parent,bag) -> {
|
||||||
|
Value result = new Value(bag.<Token>get());
|
||||||
|
bag.set(result);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
value_name.then((validator) -> validator.validate((token) -> token.getValue().equals(":")) && validator.validate((token) -> token.getValue().equals(":")))
|
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)))
|
.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME)))
|
||||||
|
@ -233,7 +257,7 @@ public class JavaParser extends Parser<JavaElement> {
|
||||||
StateTree<JavaElement> value_left = new StateTree<>();
|
StateTree<JavaElement> value_left = new StateTree<>();
|
||||||
|
|
||||||
StateTree<JavaElement> value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
|
StateTree<JavaElement> value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
|
||||||
StateTree<JavaElement> value_cast = value_parenthesis.then(new RedirectStateTree<>(type, (global, local) -> global.set(null)))
|
StateTree<JavaElement> value_cast = value_parenthesis.then(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(null)))
|
||||||
.then((validator) -> validator.validate((token) -> token.getValue().equals(")")))
|
.then((validator) -> validator.validate((token) -> token.getValue().equals(")")))
|
||||||
.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)));
|
.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)));
|
||||||
value_cast.then(value_left);
|
value_cast.then(value_left);
|
||||||
|
@ -250,9 +274,9 @@ public class JavaParser extends Parser<JavaElement> {
|
||||||
.unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a,b) -> a);
|
.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.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
||||||
value_lambda_arg.then(value_lambda);
|
value_lambda_arg.then(value_lambda);
|
||||||
StateTree<JavaElement> value_parenthesis_end = value_parenthesis.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)))
|
StateTree<JavaElement> 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(")")));
|
.then((validator) -> validator.validate((token) -> token.getValue().equals(")")));
|
||||||
value_parenthesis_end.end((a,b) -> a);
|
value_parenthesis_end.end();
|
||||||
value_parenthesis_end.then((v) -> v.validate((t) -> {
|
value_parenthesis_end.then((v) -> v.validate((t) -> {
|
||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
|
@ -262,59 +286,59 @@ public class JavaParser extends Parser<JavaElement> {
|
||||||
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);
|
||||||
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<JavaElement> value_inside = value_container.then(new RedirectStateTree<>(value, (global, local) -> global.set(null)));
|
StateTree<JavaElement> 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("[")))
|
value_inside.then((validator) -> validator.validate((token) -> token.getValue().equals("[")))
|
||||||
.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)))
|
.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("]")))
|
||||||
.then(value_left);
|
.then(value_left);
|
||||||
value_inside.then(value_left);
|
value_inside.then(value_left);
|
||||||
value_left.end((a,b) -> a);
|
value_left.end();
|
||||||
StateTree<JavaElement> value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("=")));
|
StateTree<JavaElement> value_equals = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "=")));
|
||||||
value_equals.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_equals.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
value_equals.then((validator) -> validator.validate((token) -> token.getValue().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("="), (bag, token) -> bag.set("action", "=="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
StateTree<JavaElement> value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"))).loop();
|
StateTree<JavaElement> value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"), (bag, token) -> bag.set("action", "<?"))).loop();
|
||||||
value_minus.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_minus.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "<?="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
StateTree<JavaElement> value_max = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals(">"))).loop();
|
StateTree<JavaElement> 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, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_max.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
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_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("="))).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("="), (bag, token) -> bag.set("action", "!="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
StateTree<JavaElement> value_or = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("|")));
|
StateTree<JavaElement> 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("|"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
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("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
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, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_or.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
StateTree<JavaElement> value_and = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("&")));
|
StateTree<JavaElement> 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("&"))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
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("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
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, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_and.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
StateTree<JavaElement> value_plus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("+")));
|
StateTree<JavaElement> value_plus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("+"), (bag, token) -> bag.set("action", "+")));
|
||||||
value_plus.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_plus.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
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("="), (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("+"))).end((a,b) -> a);
|
value_plus.then((validator) -> validator.validate((token) -> token.getValue().equals("+"), (bag, token) -> bag.set("action", "++"))).end(value_builder);
|
||||||
StateTree<JavaElement> value_min = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("-")));
|
StateTree<JavaElement> value_min = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("-"), (bag, token) -> bag.set("action", "-")));
|
||||||
value_min.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_min.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
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("="), (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("-"))).end((a,b) -> a);
|
value_min.then((validator) -> validator.validate((token) -> token.getValue().equals("-"), (bag, token) -> bag.set("action", "--"))).end(value_builder);
|
||||||
StateTree<JavaElement> value_div = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("/")));
|
StateTree<JavaElement> value_div = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("/"), (bag, token) -> bag.set("action", "/")));
|
||||||
value_div.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_div.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
value_div.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
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<JavaElement> value_mod = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("%")));
|
StateTree<JavaElement> value_mod = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("%"), (bag, token) -> bag.set("action", "%")));
|
||||||
value_mod.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_mod.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
value_mod.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
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<JavaElement> value_xor = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("^")));
|
StateTree<JavaElement> value_xor = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("^"), (bag, token) -> bag.set("action", "^")));
|
||||||
value_xor.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_xor.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
value_xor.then((validator) -> validator.validate((token) -> token.getValue().equals("="))).then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
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<JavaElement> value_mult = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("*")));
|
StateTree<JavaElement> value_mult = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("*"), (bag, token) -> bag.set("action", "*")));
|
||||||
value_mult.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))).end((a,b) -> a);
|
value_mult.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
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_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("?")))
|
value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("?")))
|
||||||
.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)))
|
.then(new RedirectStateTree<>(value_container, value_right))
|
||||||
.then((validator) -> validator.validate((token) -> token.getValue().equals(":")))
|
.then((validator) -> validator.validate((token) -> token.getValue().equals(":"), (bag, token) -> bag.set("action", "?:")))
|
||||||
.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)))
|
.then(new RedirectStateTree<>(value_container, value_right))
|
||||||
.end((a,b) -> a);
|
.end(value_builder);
|
||||||
StateTree<JavaElement> value_instanceof = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("instanceof")))
|
StateTree<JavaElement> value_instanceof = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("instanceof"), (bag, token) -> bag.set("action", "instanceof")))
|
||||||
.then(new RedirectStateTree<>(type, (global, local) -> global.set(null)));
|
.then(new RedirectStateTree<>(TypeTests.get(), value_right));
|
||||||
value_instanceof.end((a,b) -> a);
|
value_instanceof.end(value_builder);
|
||||||
value_instanceof.then(value_left);
|
value_instanceof.then(value_left);
|
||||||
|
|
||||||
value.then((validator) -> {
|
value.then((validator) -> {
|
||||||
|
@ -328,34 +352,29 @@ public class JavaParser extends Parser<JavaElement> {
|
||||||
&& validator.validate((token) -> token.getValue().equals("'")));
|
&& validator.validate((token) -> token.getValue().equals("'")));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}).end((a,b) -> a);
|
}).end();
|
||||||
value.then((validator) -> {
|
value.then((validator) -> {
|
||||||
if(validator.validate((token) -> token.getValue().equals("\""))){
|
if(validator.validate((token) -> token.getValue().equals("\""))){
|
||||||
|
while(validator.validate(
|
||||||
boolean escaped = true;
|
(token) -> !token.getValue().equals("\""),
|
||||||
while(escaped){
|
(bag, token) -> {
|
||||||
while(validator.validate(
|
Token current = bag.get();
|
||||||
(token) -> !token.getValue().equals("\""),
|
if(current == null) current = token;
|
||||||
(bag, token) -> {
|
else current = current.concat(token);
|
||||||
Token current = bag.get();
|
bag.set(current);
|
||||||
if(current == null) current = token;
|
}));
|
||||||
else current = current.concat(token);
|
return validator.validate((token) -> token.getValue().equals("\""), (bag, token) -> {
|
||||||
bag.set(current);
|
Token current = bag.get();
|
||||||
}));
|
if(current == null) current = token;
|
||||||
|
else current = current.concat(token);
|
||||||
if(validator.validate((token) -> token.getValue().equals("\""), (bag, token) -> {
|
bag.set(current);
|
||||||
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;
|
return false;
|
||||||
}).end((a,b) -> a);
|
}).end((parent,bag) -> {
|
||||||
|
bag.set(new Value(bag.<Token>get()));
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
braces_container.then(clazz_container);
|
braces_container.then(clazz_container);
|
||||||
StateTree<JavaElement> braces_array = braces_container.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)));
|
StateTree<JavaElement> braces_array = braces_container.then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null)));
|
||||||
|
|
|
@ -7,7 +7,15 @@ public class Value extends JavaElement{
|
||||||
private Token token;
|
private Token token;
|
||||||
private JavaElement content;
|
private JavaElement content;
|
||||||
|
|
||||||
public Value(){}
|
Value(){}
|
||||||
|
|
||||||
|
public Value(Token token){
|
||||||
|
this.token = token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Value(JavaElement content){
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
|
||||||
public Token getToken(){
|
public Token getToken(){
|
||||||
return this.token;
|
return this.token;
|
||||||
|
@ -17,21 +25,39 @@ public class Value extends JavaElement{
|
||||||
return this.content;
|
return this.content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return "Value[token="+token+", content="+content+"]";
|
||||||
|
}
|
||||||
|
|
||||||
public static class BiValue extends Value{
|
public static class BiValue extends Value{
|
||||||
|
|
||||||
private Value left;
|
private Value left;
|
||||||
|
private String action;
|
||||||
private Value right;
|
private Value right;
|
||||||
|
|
||||||
public BiValue(){}
|
public BiValue(Value left, String action, Value right){
|
||||||
|
this.left = left;
|
||||||
|
this.action = action;
|
||||||
|
this.right = right;
|
||||||
|
}
|
||||||
|
|
||||||
public Value left(){
|
public Value left(){
|
||||||
return left;
|
return left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getAction(){
|
||||||
|
return this.action;
|
||||||
|
}
|
||||||
|
|
||||||
public Value right(){
|
public Value right(){
|
||||||
return right;
|
return right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return left+" "+action+" "+right;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TriValue extends Value{
|
public static class TriValue extends Value{
|
||||||
|
|
|
@ -2,16 +2,236 @@ package be.jeffcheasey88.peeratcode.parser.java;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
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 be.jeffcheasey88.peeratcode.parser.Bag;
|
||||||
import be.jeffcheasey88.peeratcode.parser.Parser;
|
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.TokenValidator;
|
||||||
|
import be.jeffcheasey88.peeratcode.parser.java.Value.BiValue;
|
||||||
|
import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree;
|
||||||
import be.jeffcheasey88.peeratcode.parser.state.StateTree;
|
import be.jeffcheasey88.peeratcode.parser.state.StateTree;
|
||||||
|
|
||||||
public class ValueTests {
|
public class ValueTests {
|
||||||
|
|
||||||
public static StateTree<JavaElement> get(){
|
public static StateTree<JavaElement> get(){
|
||||||
|
|
||||||
|
BiFunction<JavaElement, Bag, JavaElement> 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<Bag, Bag> value_right = (global, local) -> {
|
||||||
|
global.set("right", local.get("left"));
|
||||||
|
};
|
||||||
|
|
||||||
|
StateTree<JavaElement> value = new StateTree<>();
|
||||||
|
|
||||||
StateTree<JavaElement> value_container = new StateTree<>();
|
StateTree<JavaElement> value_container = new StateTree<>();
|
||||||
|
|
||||||
|
StateTree<JavaElement> value_list = new StateTree<>();
|
||||||
|
StateTree<JavaElement> value_list_element = value_list.then(new RedirectStateTree<>(value_container, (global, local) -> {
|
||||||
|
List<Value> 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<JavaElement> value_instance = value.then((validator) -> validator.validate((token) -> token.getValue().equals("new")));
|
||||||
|
StateTree<JavaElement> value_name = new StateTree<JavaElement>();
|
||||||
|
value.then(value_name);
|
||||||
|
value_instance.then(new RedirectStateTree<>(value_name, (global, local) -> global.set(null)))
|
||||||
|
.end((a,b) -> 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(new RedirectStateTree<>(TypeTests.get(), (global, local) -> global.set(local.get())));
|
||||||
|
value_name.end((parent,bag) -> {
|
||||||
|
Value result = new Value(bag.<Token>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<JavaElement> value_call = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals(".")));
|
||||||
|
value_call.end((a,b) -> a);
|
||||||
|
value_call.then(value_name);
|
||||||
|
StateTree<JavaElement> value_array_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("[")));
|
||||||
|
StateTree<JavaElement> 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<JavaElement> value_arg_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
|
||||||
|
StateTree<JavaElement> 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<JavaElement> value_generic_begin = value_name.then((validator) -> validator.validate((token) -> token.getValue().equals("<")));
|
||||||
|
StateTree<JavaElement> value_generic_name = value_generic_begin.then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME)));
|
||||||
|
StateTree<JavaElement> value_generic_split = value_generic_name.then((validator) -> validator.validate((token) -> token.getValue().equals(",")));
|
||||||
|
StateTree<JavaElement> 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_name.then(value_generic_end);
|
||||||
|
value_generic_split.then(value_generic_name);
|
||||||
|
StateTree<JavaElement> 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<JavaElement> value_left = new StateTree<>();
|
||||||
|
|
||||||
|
StateTree<JavaElement> value_parenthesis = value_container.then((validator) -> validator.validate((token) -> token.getValue().equals("(")));
|
||||||
|
StateTree<JavaElement> 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<JavaElement> 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<JavaElement> 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<JavaElement> 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((v) -> v.validate((t) -> {
|
||||||
|
return false;
|
||||||
|
}));
|
||||||
|
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<JavaElement> 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();
|
||||||
|
StateTree<JavaElement> 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<JavaElement> value_minus = value_left.then((validator) -> validator.validate((token) -> token.getValue().equals("<"), (bag, token) -> bag.set("action", "<?"))).loop();
|
||||||
|
value_minus.then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
|
value_minus.then((validator) -> validator.validate((token) -> token.getValue().equals("="), (bag, token) -> bag.set("action", "<?="))).then(new RedirectStateTree<>(value_container, value_right)).end(value_builder);
|
||||||
|
StateTree<JavaElement> 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<JavaElement> 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<JavaElement> 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<JavaElement> 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<JavaElement> 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<JavaElement> 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<JavaElement> 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<JavaElement> 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<JavaElement> 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<JavaElement> 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 Value(bag.<Token>get()));
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
return value_container;
|
return value_container;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,4 +256,8 @@ public class ValueTests {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void doubleInDouble() throws Exception{
|
||||||
|
JavaElement result = testCase("(jeffcheasey88 == \"test\")");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue