Push -> My PC just died, RIP my computer 2021 - 2025
This commit is contained in:
parent
e0716ef657
commit
7ffd5c2d20
20 changed files with 355 additions and 171 deletions
|
@ -20,27 +20,25 @@ public class Parser<E>{
|
||||||
this.state = stateTree;
|
this.state = stateTree;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void parse(BufferedReader reader, E container) throws Exception{
|
public final TokenValidator parse(BufferedReader reader, E container) throws Exception{
|
||||||
this.tokenizer.reset();
|
this.tokenizer.reset();
|
||||||
this.tokenizer.parse(reader);
|
this.tokenizer.parse(reader);
|
||||||
|
TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0]));
|
||||||
this.state.seed(new TokenValidator(tokenizer.getTokens().toArray(new Token[0])), container);
|
this.state.seed(validator, container);
|
||||||
|
return validator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void parse(String line, E container) throws Exception{
|
public final TokenValidator parse(String line, E container) throws Exception{
|
||||||
this.tokenizer.reset();
|
this.tokenizer.reset();
|
||||||
this.tokenizer.parse(line);
|
this.tokenizer.parse(line);
|
||||||
|
TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0]));
|
||||||
this.state.seed(new TokenValidator(tokenizer.getTokens().toArray(new Token[0])), container);
|
this.state.seed(validator, container);
|
||||||
}
|
return validator;
|
||||||
|
|
||||||
public final void parseStream(BufferedReader reader, E container) throws Exception{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//tmp
|
//tmp
|
||||||
public void build(BufferedWriter writer) throws Exception{
|
public void build(BufferedWriter writer, TokenValidator validator) throws Exception{
|
||||||
Token[] confirmed = new Token[TokenValidator.MAX_VALIDATE];
|
Token[] confirmed = new Token[validator.getTokenCount()];
|
||||||
System.arraycopy(tokenizer.getTokens().toArray(), 0, confirmed, 0, confirmed.length);
|
System.arraycopy(tokenizer.getTokens().toArray(), 0, confirmed, 0, confirmed.length);
|
||||||
int line = 1;
|
int line = 1;
|
||||||
int character = 1;
|
int character = 1;
|
||||||
|
|
17
src/dev/peerat/parser/SyntaxMissMatchException.java
Normal file
17
src/dev/peerat/parser/SyntaxMissMatchException.java
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
package dev.peerat.parser;
|
||||||
|
|
||||||
|
public class SyntaxMissMatchException extends Exception{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -635419322226790786L;
|
||||||
|
|
||||||
|
private TokenValidator validator;
|
||||||
|
|
||||||
|
public SyntaxMissMatchException(TokenValidator validator){
|
||||||
|
this.validator = validator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage(){
|
||||||
|
return "Only "+validator.getValidatedTokenCount()+" out "+validator.getTokenCount()+" of tokens parsed !";
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,11 +5,7 @@ import java.util.function.Function;
|
||||||
|
|
||||||
public class TokenValidator{
|
public class TokenValidator{
|
||||||
|
|
||||||
public static int MAX_VALIDATE = 0;
|
|
||||||
public static int TOKENS = 0;
|
|
||||||
|
|
||||||
private Token[] elements;
|
private Token[] elements;
|
||||||
private int index;
|
|
||||||
private int validated;
|
private int validated;
|
||||||
|
|
||||||
private Bag bag;
|
private Bag bag;
|
||||||
|
@ -23,6 +19,14 @@ public class TokenValidator{
|
||||||
this.bag = new Bag();
|
this.bag = new Bag();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getTokenCount(){
|
||||||
|
return this.elements.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValidatedTokenCount(){
|
||||||
|
return this.validated;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean hasNext(){
|
public boolean hasNext(){
|
||||||
return validated < elements.length;
|
return validated < elements.length;
|
||||||
}
|
}
|
||||||
|
@ -30,12 +34,7 @@ public class TokenValidator{
|
||||||
public boolean validate(Function<Token, Boolean> action){
|
public boolean validate(Function<Token, Boolean> action){
|
||||||
if(validated >= this.elements.length) return false;
|
if(validated >= this.elements.length) return false;
|
||||||
if(action.apply(this.elements[validated])){
|
if(action.apply(this.elements[validated])){
|
||||||
if(validated+1 > MAX_VALIDATE){
|
|
||||||
MAX_VALIDATE = validated+1;
|
|
||||||
TOKENS = elements.length;
|
|
||||||
}
|
|
||||||
this.validated++;
|
this.validated++;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -52,13 +51,11 @@ public class TokenValidator{
|
||||||
public TokenValidator branch(){
|
public TokenValidator branch(){
|
||||||
TokenValidator branch = new TokenValidator(bag);
|
TokenValidator branch = new TokenValidator(bag);
|
||||||
branch.elements = this.elements;
|
branch.elements = this.elements;
|
||||||
branch.index = Math.max(0, this.validated-1);
|
|
||||||
branch.validated = this.validated;
|
branch.validated = this.validated;
|
||||||
return branch;
|
return branch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void merge(TokenValidator branch){
|
public void merge(TokenValidator branch){
|
||||||
this.index = branch.index;
|
|
||||||
this.validated = branch.validated;
|
this.validated = branch.validated;
|
||||||
this.bag = branch.bag;
|
this.bag = branch.bag;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import dev.peerat.parser.Token;
|
import dev.peerat.parser.Token;
|
||||||
import dev.peerat.parser.java.visitor.JavaVisitor;
|
|
||||||
import dev.peerat.parser.visitor.Visitor;
|
import dev.peerat.parser.visitor.Visitor;
|
||||||
import dev.peerat.parser.visitor.VisitorBag;
|
import dev.peerat.parser.visitor.VisitorBag;
|
||||||
|
|
||||||
|
|
44
src/dev/peerat/parser/java/JavaProject.java
Normal file
44
src/dev/peerat/parser/java/JavaProject.java
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
package dev.peerat.parser.java;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import dev.peerat.parser.visitor.Visitor;
|
||||||
|
import dev.peerat.parser.visitor.VisitorBag;
|
||||||
|
|
||||||
|
public class JavaProject extends JavaElement{
|
||||||
|
|
||||||
|
private List<JavaFile> files;
|
||||||
|
|
||||||
|
public JavaProject(){
|
||||||
|
this.files = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addFile(JavaFile file){
|
||||||
|
this.files.add(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<JavaFile> getFiles(){
|
||||||
|
return this.files;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E extends JavaElement> E find(Function<JavaElement, Boolean> finder) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E extends JavaElement> void findAll(Function<JavaElement, Boolean> finder, List<E> list) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VisitorBag visit(Visitor<JavaElement> visitor){
|
||||||
|
VisitorBag bag = new VisitorBag();
|
||||||
|
for(JavaFile file : this.files) bag.merge(file.visit(visitor));
|
||||||
|
return bag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -2,15 +2,15 @@ package dev.peerat.parser.java.visitor;
|
||||||
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import dev.peerat.parser.java.Annotation;
|
||||||
import dev.peerat.parser.java.Class;
|
import dev.peerat.parser.java.Class;
|
||||||
import dev.peerat.parser.java.JavaElement;
|
import dev.peerat.parser.java.JavaElement;
|
||||||
import dev.peerat.parser.visitor.Visitor;
|
import dev.peerat.parser.visitor.Visitor;
|
||||||
import dev.peerat.parser.visitor.VisitorBag;
|
import dev.peerat.parser.visitor.VisitorBag;
|
||||||
|
|
||||||
public class JavaClassVisitor extends JavaVisitor<dev.peerat.parser.java.Class>{
|
public class JavaClassVisitor extends JavaModifiableVisitor<dev.peerat.parser.java.Class, JavaClassVisitor>{
|
||||||
|
|
||||||
private Predicate<String> nameFilter;
|
private Predicate<String> nameFilter;
|
||||||
private Predicate<Integer> modifierFilter;
|
|
||||||
private Visitor<JavaElement> elementVisitor;
|
private Visitor<JavaElement> elementVisitor;
|
||||||
|
|
||||||
public JavaClassVisitor(boolean propagate){
|
public JavaClassVisitor(boolean propagate){
|
||||||
|
@ -22,78 +22,6 @@ public class JavaClassVisitor extends JavaVisitor<dev.peerat.parser.java.Class>{
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public JavaClassVisitor isPublic(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x1) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isPrivate(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x2) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isProtected(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x4) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isStatic(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x8) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isFinal(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x10) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isSynchronized(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x20) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isVolatile(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x40) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isTransient(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x80) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isNative(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x100) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isAbstract(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x400) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isStrict(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x800) != 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor isPackageLevel(){
|
|
||||||
Predicate<Integer> validator = (mod) -> (mod & 0x1) == 0 && (mod & 0x2) == 0 && (mod & 0x4) == 0;
|
|
||||||
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JavaClassVisitor elements(Visitor<JavaElement> visitor){
|
public JavaClassVisitor elements(Visitor<JavaElement> visitor){
|
||||||
this.elementVisitor = visitor;
|
this.elementVisitor = visitor;
|
||||||
return this;
|
return this;
|
||||||
|
@ -111,8 +39,20 @@ public class JavaClassVisitor extends JavaVisitor<dev.peerat.parser.java.Class>{
|
||||||
if(!nameFilter.test(element.getName().getValue())) return bag;
|
if(!nameFilter.test(element.getName().getValue())) return bag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this.annotationVisitor != null){
|
||||||
|
boolean validatedOne = false;
|
||||||
|
for(Annotation annotation : element.getAnnotations()){
|
||||||
|
VisitorBag visited = annotation.visit(this.annotationVisitor);
|
||||||
|
if(visited.isValidated()){
|
||||||
|
bag.merge(visited);
|
||||||
|
validatedOne = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!validatedOne) return bag;
|
||||||
|
}
|
||||||
|
|
||||||
if(this.modifierFilter != null){
|
if(this.modifierFilter != null){
|
||||||
//check MOD
|
if(!this.modifierFilter.test(element.getModifier())) return bag;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.elementVisitor != null){
|
if(this.elementVisitor != null){
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
package dev.peerat.parser.java.visitor;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import dev.peerat.parser.java.JavaElement;
|
||||||
|
import dev.peerat.parser.visitor.Visitor;
|
||||||
|
|
||||||
|
public abstract class JavaModifiableVisitor<E extends JavaElement, V> extends JavaVisitor<E>{
|
||||||
|
|
||||||
|
protected Predicate<Integer> modifierFilter;
|
||||||
|
protected Visitor<JavaElement> annotationVisitor; //TODO possibility to combine visitor too
|
||||||
|
|
||||||
|
public JavaModifiableVisitor(Class<?> type, boolean propagate){
|
||||||
|
super(type, propagate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isPublic(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x1) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isPrivate(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x2) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isProtected(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x4) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isStatic(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x8) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isFinal(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x10) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isSynchronized(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x20) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isVolatile(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x40) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isTransient(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x80) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isNative(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x100) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isAbstract(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x400) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isStrict(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x800) != 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V isPackageLevel(){
|
||||||
|
Predicate<Integer> validator = (mod) -> (mod & 0x1) == 0 && (mod & 0x2) == 0 && (mod & 0x4) == 0;
|
||||||
|
this.modifierFilter = (this.modifierFilter == null) ? validator : this.modifierFilter.and(validator);
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V annotation(Visitor<JavaElement> visitor){
|
||||||
|
this.annotationVisitor = visitor;
|
||||||
|
return (V) this;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,17 +1,18 @@
|
||||||
package dev.peerat.parser.state;
|
package dev.peerat.parser.state;
|
||||||
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import dev.peerat.parser.TokenValidator;
|
import dev.peerat.parser.TokenValidator;
|
||||||
|
|
||||||
public class BinaryStateTree<E> extends StateTree<E>{
|
public class BinaryStateTree<E> extends StateTree<E>{
|
||||||
|
|
||||||
private Function<TokenValidator, Boolean> condition;
|
private Predicate<TokenValidator> condition;
|
||||||
|
|
||||||
private StateTree<E> success;
|
private StateTree<E> success;
|
||||||
private StateTree<E> fail;
|
private StateTree<E> fail;
|
||||||
|
|
||||||
public BinaryStateTree(Function<TokenValidator, Boolean> checker){
|
public BinaryStateTree(Predicate<TokenValidator> checker){
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.condition = checker;
|
this.condition = checker;
|
||||||
|
@ -19,7 +20,7 @@ public class BinaryStateTree<E> extends StateTree<E>{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
|
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
|
||||||
return ((this.condition.apply(validator)) ? success : fail).internalSeed(validator, element);
|
return ((this.condition.test(validator)) ? success : fail).internalSeed(validator, element);
|
||||||
}
|
}
|
||||||
|
|
||||||
public StateTree<E> success(StateTree<E> state){
|
public StateTree<E> success(StateTree<E> state){
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import dev.peerat.parser.Bag;
|
import dev.peerat.parser.Bag;
|
||||||
import dev.peerat.parser.TokenValidator;
|
import dev.peerat.parser.TokenValidator;
|
||||||
|
@ -40,7 +41,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
||||||
builded.build(validator, build);
|
builded.build(validator, build);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
while(state.checker.apply((branch = validator.branch()))){
|
while(state.checker.test((branch = validator.branch()))){
|
||||||
builded = state.internalSeed(branch, build);
|
builded = state.internalSeed(branch, build);
|
||||||
if(builded == null) break;
|
if(builded == null) break;
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
|
@ -57,7 +58,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
||||||
builded.build(validator, build);
|
builded.build(validator, build);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
if(state.checker.apply(branch)){
|
if(state.checker.test(branch)){
|
||||||
builded = state.internalSeed(branch, build);
|
builded = state.internalSeed(branch, build);
|
||||||
if(builded == null) break;
|
if(builded == null) break;
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
|
@ -76,7 +77,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
||||||
sub_builded.build(validator, element);
|
sub_builded.build(validator, element);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(child.checker.apply(branch)){
|
if(child.checker.test(branch)){
|
||||||
sub_builded = child.internalSeed(branch, element);
|
sub_builded = child.internalSeed(branch, element);
|
||||||
if(sub_builded == null) continue;
|
if(sub_builded == null) continue;
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
|
@ -93,7 +94,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends StateTree<E>> StateTree<E> thenNoChild(Function<TokenValidator, Boolean> checker){
|
public <T extends StateTree<E>> StateTree<E> thenNoChild(Predicate<TokenValidator> checker){
|
||||||
StateTree<E> state = new StateTree<>();
|
StateTree<E> state = new StateTree<>();
|
||||||
state.checker = checker;
|
state.checker = checker;
|
||||||
this.childs.add(state);
|
this.childs.add(state);
|
||||||
|
@ -105,7 +106,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends BuilderStateTree<E,B>> BuilderStateTree<E,B> multiple(Function<TokenValidator, Boolean> checker){
|
public <T extends BuilderStateTree<E,B>> BuilderStateTree<E,B> multiple(Predicate<TokenValidator> checker){
|
||||||
StateTree<B> state = new StateTree<>();
|
StateTree<B> state = new StateTree<>();
|
||||||
state.checker = checker;
|
state.checker = checker;
|
||||||
return multiple(state);
|
return multiple(state);
|
||||||
|
@ -116,7 +117,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends StateTree<B>> StateTree<B> unique(Function<TokenValidator, Boolean> checker){
|
public <T extends StateTree<B>> StateTree<B> unique(Predicate<TokenValidator> checker){
|
||||||
StateTree<B> state = new StateTree<>();
|
StateTree<B> state = new StateTree<>();
|
||||||
state.checker = checker;
|
state.checker = checker;
|
||||||
unique(state);
|
unique(state);
|
||||||
|
|
|
@ -26,7 +26,7 @@ public class InitialStateTree<E> extends StateTree<E>{
|
||||||
builded.build(validator, element);
|
builded.build(validator, element);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
while(state.checker.apply((branch = validator.branch()))){
|
while(state.checker.test((branch = validator.branch()))){
|
||||||
builded = state.internalSeed(branch, element);
|
builded = state.internalSeed(branch, element);
|
||||||
if(builded == null) break;
|
if(builded == null) break;
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
|
|
|
@ -4,9 +4,10 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Function;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
import dev.peerat.parser.Bag;
|
import dev.peerat.parser.Bag;
|
||||||
|
import dev.peerat.parser.SyntaxMissMatchException;
|
||||||
import dev.peerat.parser.Token;
|
import dev.peerat.parser.Token;
|
||||||
import dev.peerat.parser.TokenValidator;
|
import dev.peerat.parser.TokenValidator;
|
||||||
|
|
||||||
|
@ -14,7 +15,7 @@ public class StateTree<E>{
|
||||||
|
|
||||||
private List<StateTree<E>> childs;
|
private List<StateTree<E>> childs;
|
||||||
|
|
||||||
Function<TokenValidator, Boolean> checker;
|
protected Predicate<TokenValidator> checker;
|
||||||
private BuilderStateTree<E, ?> builder;
|
private BuilderStateTree<E, ?> builder;
|
||||||
|
|
||||||
//TODO checker in constructeur ?
|
//TODO checker in constructeur ?
|
||||||
|
@ -22,12 +23,11 @@ public class StateTree<E>{
|
||||||
this.childs = new ArrayList<>();
|
this.childs = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void seed(TokenValidator validator, E container){
|
public void seed(TokenValidator validator, E container) throws SyntaxMissMatchException{
|
||||||
while(validator.hasNext()){
|
BuilderStateTree<E, ?> build = internalSeed(validator, container);
|
||||||
BuilderStateTree<E, ?> build = internalSeed(validator, container);
|
if(build == null) throw new SyntaxMissMatchException(validator);
|
||||||
if(build == null) break;
|
build.build(validator, container);
|
||||||
build.build(validator, container);
|
if(validator.hasNext()) throw new SyntaxMissMatchException(validator);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
|
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
|
||||||
|
@ -41,7 +41,7 @@ public class StateTree<E>{
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(child.checker.apply(branch)){
|
if(child.checker.test(branch)){
|
||||||
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
|
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
|
||||||
if(builded != null){
|
if(builded != null){
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
|
@ -58,7 +58,7 @@ public class StateTree<E>{
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends StateTree<E>> StateTree<E> then(Function<TokenValidator, Boolean> checker){
|
public <T extends StateTree<E>> StateTree<E> then(Predicate<TokenValidator> checker){
|
||||||
StateTree<E> state = new StateTree<>();
|
StateTree<E> state = new StateTree<>();
|
||||||
state.checker = checker;
|
state.checker = checker;
|
||||||
this.childs.add(state);
|
this.childs.add(state);
|
||||||
|
|
|
@ -12,15 +12,16 @@ public class Example {
|
||||||
|
|
||||||
JavaParser parser = new JavaParser();
|
JavaParser parser = new JavaParser();
|
||||||
JavaFile container = new JavaFile();
|
JavaFile container = new JavaFile();
|
||||||
parser.parse("package dev.peerat.test; public class Example{ private int i = j; public void helloTest(){ System.out.println(\"hello\"); } }", container);
|
parser.parse("package dev.peerat.test; public class Example{ private int i = j, j; public void helloTest(){ System.out.println(\"hello\"); } }", container);
|
||||||
|
|
||||||
VisitorBag result = container.visit(
|
VisitorBag result = container.visit(
|
||||||
allClass()
|
key(allClass()
|
||||||
.isPublic()
|
.isPublic()
|
||||||
.elements(
|
.elements(
|
||||||
collect(variable())
|
value(allVariable()
|
||||||
|
)
|
||||||
)
|
)
|
||||||
);
|
));
|
||||||
|
|
||||||
System.out.println("allJavaElement in class : "+result.toList());
|
System.out.println("allJavaElement in class : "+result.toList());
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,12 +99,28 @@ public class Operator{
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends Visitor<?>> T key(Visitor<?> visitor){
|
public static <E> Visitor<E> key(Visitor<E> visitor){
|
||||||
return null;
|
return new Visitor<E>(){
|
||||||
|
@Override
|
||||||
|
public VisitorBag visit(E element){
|
||||||
|
return visitor.visit(element).pair(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canVisit(Class<?> type){
|
||||||
|
// System.out.println("collect can visit ? "+type);
|
||||||
|
return visitor.canVisit(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canPropagate(){
|
||||||
|
return visitor.canPropagate();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends Visitor<?>> T value(Visitor<?> visitor){
|
public static <E> Visitor<E> value(Visitor<E> visitor){
|
||||||
return null;
|
return collect(visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <E> Visitor<E> collect(Visitor<E> visitor){
|
public static <E> Visitor<E> collect(Visitor<E> visitor){
|
||||||
|
|
58
src/dev/peerat/parser/visitor/TokenVisitor.java
Normal file
58
src/dev/peerat/parser/visitor/TokenVisitor.java
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
package dev.peerat.parser.visitor;
|
||||||
|
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import dev.peerat.parser.Token;
|
||||||
|
import dev.peerat.parser.TokenType;
|
||||||
|
|
||||||
|
public class TokenVisitor extends Visitor<Token>{
|
||||||
|
|
||||||
|
private Predicate<String> name;
|
||||||
|
private Predicate<TokenType> type;
|
||||||
|
private Predicate<Integer> line;
|
||||||
|
private Predicate<Integer> character;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canVisit(Class<?> type){
|
||||||
|
return type.isAssignableFrom(Token.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canPropagate(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TokenVisitor named(Predicate<String> predicate){
|
||||||
|
this.name = predicate;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TokenVisitor type(Predicate<TokenType> predicate){
|
||||||
|
this.type = predicate;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TokenVisitor line(Predicate<Integer> predicate){
|
||||||
|
this.line = predicate;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TokenVisitor character(Predicate<Integer> predicate){
|
||||||
|
this.character = predicate;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public VisitorBag visit(Token element){
|
||||||
|
VisitorBag bag = new VisitorBag();
|
||||||
|
|
||||||
|
if(this.name != null && !this.name.test(element.getValue())) return bag;
|
||||||
|
if(this.type != null && !this.type.test(element.getType())) return bag;
|
||||||
|
if(this.line != null && !this.line.test(element.getLineNumber())) return bag;
|
||||||
|
if(this.character != null && !this.character.test(element.getCharacterNumber())) return bag;
|
||||||
|
|
||||||
|
bag.compute(element);
|
||||||
|
return bag;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,47 +1,50 @@
|
||||||
package dev.peerat.parser.visitor;
|
package dev.peerat.parser.visitor;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
//only one pass in parameter or visit ?
|
//only one pass in parameter or visit ?
|
||||||
public class VisitorBag{
|
public class VisitorBag{
|
||||||
|
|
||||||
private static Object VALIDATE_BAG = new Object();
|
private static final Object VALIDATE_BAG = new Object();
|
||||||
|
|
||||||
private List<Object> collect;
|
private List<Object> collect;
|
||||||
private List<Object> list;
|
private Object computed;
|
||||||
|
|
||||||
public VisitorBag(){
|
public VisitorBag(){
|
||||||
this.collect = new ArrayList<>();
|
this.collect = new ArrayList<>();
|
||||||
this.list = new ArrayList<>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void compute(Object element){
|
public void compute(Object element){
|
||||||
// System.out.println("compute("+collect+", "+list+") "+element+" <- "+Thread.currentThread().getStackTrace()[2]);
|
this.computed = element;
|
||||||
this.list.add(element);
|
}
|
||||||
|
|
||||||
|
VisitorBag pair(Object key){
|
||||||
|
this.collect = Arrays.asList(new Pair<>(key, collect));
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void merge(VisitorBag bag){
|
public void merge(VisitorBag bag){
|
||||||
// System.out.println("merge("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]);
|
|
||||||
this.collect.addAll(bag.collect);
|
this.collect.addAll(bag.collect);
|
||||||
if(!this.collect.isEmpty()) list.add(VALIDATE_BAG);
|
if(!this.collect.isEmpty()) this.computed = VALIDATE_BAG;
|
||||||
// System.out.println("merged("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isValidated(){
|
public boolean isValidated(){
|
||||||
return !this.list.isEmpty();
|
return this.VALIDATE_BAG != null;
|
||||||
}
|
|
||||||
|
|
||||||
public List<Object> computeList(){
|
|
||||||
return this.list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VisitorBag collect(){
|
VisitorBag collect(){
|
||||||
this.collect.addAll(this.list);
|
this.collect.addAll(this.list);
|
||||||
// System.out.println("collected("+collect+", "+list+") <- "+Thread.currentThread().getStackTrace()[2]);
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasElement(){
|
||||||
|
return !this.collect.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
public <T> T toElement(){
|
public <T> T toElement(){
|
||||||
return (T) this.collect.get(0);
|
return (T) this.collect.get(0);
|
||||||
}
|
}
|
||||||
|
@ -49,4 +52,45 @@ public class VisitorBag{
|
||||||
public <T> List<T> toList(){
|
public <T> List<T> toList(){
|
||||||
return (List<T>) this.collect;
|
return (List<T>) this.collect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <K, V> Map<K, V> toMap(){
|
||||||
|
Map<K, V> map = new HashMap<>();
|
||||||
|
for(Object obj : this.collect){
|
||||||
|
Pair<K, V> pair = (Pair<K, V>)obj;
|
||||||
|
map.put(pair.getKey(), pair.getValue());
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public <K, V> Map<K, List<V>> toMapValues(){
|
||||||
|
Map<K, List<V>> map = new HashMap<>();
|
||||||
|
for(Object obj : this.collect){
|
||||||
|
Pair<K, V> pair = (Pair<K, V>)obj;
|
||||||
|
map.put(pair.getKey(), pair.getValues());
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Pair<K, V>{
|
||||||
|
|
||||||
|
private Object key;
|
||||||
|
private List<Object> values;
|
||||||
|
|
||||||
|
public Pair(Object key, List<Object> values){
|
||||||
|
this.key = key;
|
||||||
|
this.values = values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public K getKey(){
|
||||||
|
return (K) this.key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V getValue(){
|
||||||
|
return (V) this.values.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<V> getValues(){
|
||||||
|
return (List<V>) this.values;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -57,12 +57,7 @@ public class ForCase {
|
||||||
};
|
};
|
||||||
|
|
||||||
void testCase(String value) throws Exception{
|
void testCase(String value) throws Exception{
|
||||||
TokenValidator.TOKENS = 0;
|
|
||||||
TokenValidator.MAX_VALIDATE = 0;
|
|
||||||
|
|
||||||
parser.parse(value, null);
|
parser.parse(value, null);
|
||||||
|
|
||||||
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -32,8 +32,8 @@ public class SpecificCase{
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
parser.parse(reader, new JavaFile());
|
TokenValidator validator = parser.parse(reader, new JavaFile());
|
||||||
parser.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt"))));
|
parser.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt"))), validator);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,15 +90,8 @@ public class TypeTests{
|
||||||
};
|
};
|
||||||
|
|
||||||
JavaElement testCase(String value) throws Exception{
|
JavaElement testCase(String value) throws Exception{
|
||||||
TokenValidator.TOKENS = 0;
|
|
||||||
TokenValidator.MAX_VALIDATE = 0;
|
|
||||||
|
|
||||||
JavaElement result = null;
|
JavaElement result = null;
|
||||||
|
|
||||||
parser.parse(value, result);
|
parser.parse(value, result);
|
||||||
|
|
||||||
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -253,15 +253,8 @@ public class ValueTests {
|
||||||
};
|
};
|
||||||
|
|
||||||
JavaElement testCase(String value) throws Exception{
|
JavaElement testCase(String value) throws Exception{
|
||||||
TokenValidator.TOKENS = 0;
|
|
||||||
TokenValidator.MAX_VALIDATE = 0;
|
|
||||||
|
|
||||||
JavaElement result = null;
|
JavaElement result = null;
|
||||||
|
|
||||||
parser.parse(value, result);
|
parser.parse(value, result);
|
||||||
|
|
||||||
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ import dev.peerat.parser.TokenType;
|
||||||
import dev.peerat.parser.TokenValidator;
|
import dev.peerat.parser.TokenValidator;
|
||||||
import dev.peerat.parser.java.Annotation.AnnotableBuffer;
|
import dev.peerat.parser.java.Annotation.AnnotableBuffer;
|
||||||
import dev.peerat.parser.java.Variable.VariableContainer;
|
import dev.peerat.parser.java.Variable.VariableContainer;
|
||||||
|
import dev.peerat.parser.java.builder.JavaBuilder;
|
||||||
import dev.peerat.parser.java.value.Value;
|
import dev.peerat.parser.java.value.Value;
|
||||||
import dev.peerat.parser.state.InitialStateTree;
|
import dev.peerat.parser.state.InitialStateTree;
|
||||||
import dev.peerat.parser.state.RedirectStateTree;
|
import dev.peerat.parser.state.RedirectStateTree;
|
||||||
|
@ -78,15 +79,8 @@ public class VariableTests{
|
||||||
};
|
};
|
||||||
|
|
||||||
JavaElement testCase(String value) throws Exception{
|
JavaElement testCase(String value) throws Exception{
|
||||||
TokenValidator.TOKENS = 0;
|
JavaElement result = JavaBuilder.ofClass("Test").build();
|
||||||
TokenValidator.MAX_VALIDATE = 0;
|
|
||||||
|
|
||||||
JavaElement result = new Class(null, 0,new Token(0, 0, "Test", TokenType.NAME));
|
|
||||||
|
|
||||||
parser.parse(value, result);
|
parser.parse(value, result);
|
||||||
|
|
||||||
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue