[Build] Values

This commit is contained in:
jeffcheasey88 2023-09-12 21:40:44 +02:00
parent 9ad002d6db
commit a6f90a2c3e
3 changed files with 349 additions and 80 deletions

View file

@ -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)));

View file

@ -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{

View file

@ -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\")");
}
} }