Dev from a brand new PC
This commit is contained in:
commit
b635c13d57
20 changed files with 286 additions and 159 deletions
|
@ -20,27 +20,25 @@ public class Parser<E>{
|
|||
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.parse(reader);
|
||||
|
||||
this.state.seed(new TokenValidator(tokenizer.getTokens().toArray(new Token[0])), container);
|
||||
TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0]));
|
||||
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.parse(line);
|
||||
|
||||
this.state.seed(new TokenValidator(tokenizer.getTokens().toArray(new Token[0])), container);
|
||||
}
|
||||
|
||||
public final void parseStream(BufferedReader reader, E container) throws Exception{
|
||||
|
||||
TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0]));
|
||||
this.state.seed(validator, container);
|
||||
return validator;
|
||||
}
|
||||
|
||||
//tmp
|
||||
public void build(BufferedWriter writer) throws Exception{
|
||||
Token[] confirmed = new Token[TokenValidator.MAX_VALIDATE];
|
||||
public void build(BufferedWriter writer, TokenValidator validator) throws Exception{
|
||||
Token[] confirmed = new Token[validator.getTokenCount()];
|
||||
System.arraycopy(tokenizer.getTokens().toArray(), 0, confirmed, 0, confirmed.length);
|
||||
int line = 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 static int MAX_VALIDATE = 0;
|
||||
public static int TOKENS = 0;
|
||||
|
||||
private Token[] elements;
|
||||
private int index;
|
||||
private int validated;
|
||||
|
||||
private Bag bag;
|
||||
|
@ -23,6 +19,14 @@ public class TokenValidator{
|
|||
this.bag = new Bag();
|
||||
}
|
||||
|
||||
public int getTokenCount(){
|
||||
return this.elements.length;
|
||||
}
|
||||
|
||||
public int getValidatedTokenCount(){
|
||||
return this.validated;
|
||||
}
|
||||
|
||||
public boolean hasNext(){
|
||||
return validated < elements.length;
|
||||
}
|
||||
|
@ -30,12 +34,7 @@ public class TokenValidator{
|
|||
public boolean validate(Function<Token, Boolean> action){
|
||||
if(validated >= this.elements.length) return false;
|
||||
if(action.apply(this.elements[validated])){
|
||||
if(validated+1 > MAX_VALIDATE){
|
||||
MAX_VALIDATE = validated+1;
|
||||
TOKENS = elements.length;
|
||||
}
|
||||
this.validated++;
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -52,13 +51,11 @@ public class TokenValidator{
|
|||
public TokenValidator branch(){
|
||||
TokenValidator branch = new TokenValidator(bag);
|
||||
branch.elements = this.elements;
|
||||
branch.index = Math.max(0, this.validated-1);
|
||||
branch.validated = this.validated;
|
||||
return branch;
|
||||
}
|
||||
|
||||
public void merge(TokenValidator branch){
|
||||
this.index = branch.index;
|
||||
this.validated = branch.validated;
|
||||
this.bag = branch.bag;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,6 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
|
||||
import dev.peerat.parser.Token;
|
||||
import dev.peerat.parser.java.visitor.JavaVisitor;
|
||||
import dev.peerat.parser.visitor.Visitor;
|
||||
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 dev.peerat.parser.java.Annotation;
|
||||
import dev.peerat.parser.java.Class;
|
||||
import dev.peerat.parser.java.JavaElement;
|
||||
import dev.peerat.parser.visitor.Visitor;
|
||||
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<Integer> modifierFilter;
|
||||
private Visitor<JavaElement> elementVisitor;
|
||||
|
||||
public JavaClassVisitor(boolean propagate){
|
||||
|
@ -22,78 +22,6 @@ public class JavaClassVisitor extends JavaVisitor<dev.peerat.parser.java.Class>{
|
|||
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){
|
||||
this.elementVisitor = visitor;
|
||||
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(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){
|
||||
//check MOD
|
||||
if(!this.modifierFilter.test(element.getModifier())) return bag;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import dev.peerat.parser.TokenValidator;
|
||||
|
||||
public class BinaryStateTree<E> extends StateTree<E>{
|
||||
|
||||
private Function<TokenValidator, Boolean> condition;
|
||||
private Predicate<TokenValidator> condition;
|
||||
|
||||
private StateTree<E> success;
|
||||
private StateTree<E> fail;
|
||||
|
||||
public BinaryStateTree(Function<TokenValidator, Boolean> checker){
|
||||
public BinaryStateTree(Predicate<TokenValidator> checker){
|
||||
super();
|
||||
|
||||
this.condition = checker;
|
||||
|
@ -19,7 +20,7 @@ public class BinaryStateTree<E> extends StateTree<E>{
|
|||
|
||||
@Override
|
||||
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){
|
||||
|
|
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import dev.peerat.parser.Bag;
|
||||
import dev.peerat.parser.TokenValidator;
|
||||
|
@ -40,7 +41,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
|||
builded.build(validator, build);
|
||||
}
|
||||
}else{
|
||||
while(state.checker.apply((branch = validator.branch()))){
|
||||
while(state.checker.test((branch = validator.branch()))){
|
||||
builded = state.internalSeed(branch, build);
|
||||
if(builded == null) break;
|
||||
validator.merge(branch);
|
||||
|
@ -57,7 +58,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
|||
builded.build(validator, build);
|
||||
}
|
||||
}else{
|
||||
if(state.checker.apply(branch)){
|
||||
if(state.checker.test(branch)){
|
||||
builded = state.internalSeed(branch, build);
|
||||
if(builded == null) break;
|
||||
validator.merge(branch);
|
||||
|
@ -76,7 +77,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
|||
sub_builded.build(validator, element);
|
||||
break;
|
||||
}
|
||||
if(child.checker.apply(branch)){
|
||||
if(child.checker.test(branch)){
|
||||
sub_builded = child.internalSeed(branch, element);
|
||||
if(sub_builded == null) continue;
|
||||
validator.merge(branch);
|
||||
|
@ -93,7 +94,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
|||
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<>();
|
||||
state.checker = checker;
|
||||
this.childs.add(state);
|
||||
|
@ -105,7 +106,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
|||
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<>();
|
||||
state.checker = checker;
|
||||
return multiple(state);
|
||||
|
@ -116,7 +117,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
|||
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<>();
|
||||
state.checker = checker;
|
||||
unique(state);
|
||||
|
|
|
@ -26,7 +26,7 @@ public class InitialStateTree<E> extends StateTree<E>{
|
|||
builded.build(validator, element);
|
||||
}
|
||||
}else{
|
||||
while(state.checker.apply((branch = validator.branch()))){
|
||||
while(state.checker.test((branch = validator.branch()))){
|
||||
builded = state.internalSeed(branch, element);
|
||||
if(builded == null) break;
|
||||
validator.merge(branch);
|
||||
|
|
|
@ -4,9 +4,10 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import dev.peerat.parser.Bag;
|
||||
import dev.peerat.parser.SyntaxMissMatchException;
|
||||
import dev.peerat.parser.Token;
|
||||
import dev.peerat.parser.TokenValidator;
|
||||
|
||||
|
@ -14,7 +15,7 @@ public class StateTree<E>{
|
|||
|
||||
private List<StateTree<E>> childs;
|
||||
|
||||
Function<TokenValidator, Boolean> checker;
|
||||
protected Predicate<TokenValidator> checker;
|
||||
private BuilderStateTree<E, ?> builder;
|
||||
|
||||
//TODO checker in constructeur ?
|
||||
|
@ -22,12 +23,11 @@ public class StateTree<E>{
|
|||
this.childs = new ArrayList<>();
|
||||
}
|
||||
|
||||
public void seed(TokenValidator validator, E container){
|
||||
while(validator.hasNext()){
|
||||
BuilderStateTree<E, ?> build = internalSeed(validator, container);
|
||||
if(build == null) break;
|
||||
build.build(validator, container);
|
||||
}
|
||||
public void seed(TokenValidator validator, E container) throws SyntaxMissMatchException{
|
||||
BuilderStateTree<E, ?> build = internalSeed(validator, container);
|
||||
if(build == null) throw new SyntaxMissMatchException(validator);
|
||||
build.build(validator, container);
|
||||
if(validator.hasNext()) throw new SyntaxMissMatchException(validator);
|
||||
}
|
||||
|
||||
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
|
||||
|
@ -41,7 +41,7 @@ public class StateTree<E>{
|
|||
}
|
||||
continue;
|
||||
}
|
||||
if(child.checker.apply(branch)){
|
||||
if(child.checker.test(branch)){
|
||||
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
|
||||
if(builded != null){
|
||||
validator.merge(branch);
|
||||
|
@ -58,7 +58,7 @@ public class StateTree<E>{
|
|||
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<>();
|
||||
state.checker = checker;
|
||||
this.childs.add(state);
|
||||
|
|
|
@ -12,15 +12,16 @@ public class Example {
|
|||
|
||||
JavaParser parser = new JavaParser();
|
||||
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(
|
||||
allClass()
|
||||
key(allClass()
|
||||
.isPublic()
|
||||
.elements(
|
||||
collect(variable())
|
||||
value(allVariable()
|
||||
)
|
||||
)
|
||||
);
|
||||
));
|
||||
|
||||
System.out.println("allJavaElement in class : "+result.toList());
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ public class Operator{
|
|||
return new Visitor<E>(){
|
||||
@Override
|
||||
public VisitorBag visit(E element){
|
||||
return visitor.visit(element).key(element);
|
||||
return visitor.visit(element).pair(element);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
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;
|
||||
}
|
||||
|
||||
}
|
|
@ -9,7 +9,7 @@ import java.util.Map;
|
|||
//only one pass in parameter or visit ?
|
||||
public class VisitorBag{
|
||||
|
||||
private static Object VALIDATE_BAG = new Object();
|
||||
private static final Object VALIDATED_BAG = new Object();
|
||||
|
||||
private List<Object> collect;
|
||||
private Object computed;
|
||||
|
@ -17,14 +17,14 @@ public class VisitorBag{
|
|||
public VisitorBag(){
|
||||
this.collect = new ArrayList<>(0);
|
||||
}
|
||||
|
||||
|
||||
public void compute(Object element){
|
||||
this.computed = element;
|
||||
}
|
||||
|
||||
public void merge(VisitorBag bag){
|
||||
this.collect.addAll(bag.collect);
|
||||
if((!this.collect.isEmpty()) && this.computed == null) this.computed = VALIDATE_BAG;
|
||||
if((!this.collect.isEmpty()) && this.computed == null) this.computed = VALIDATED_BAG;
|
||||
}
|
||||
|
||||
public Object computed(){
|
||||
|
@ -35,7 +35,7 @@ public class VisitorBag{
|
|||
return this.computed != null;
|
||||
}
|
||||
|
||||
VisitorBag key(Object key){
|
||||
VisitorBag pair(Object key){
|
||||
this.collect = Arrays.asList(new Pair<>(key, this.collect));
|
||||
return this;
|
||||
}
|
||||
|
@ -45,6 +45,10 @@ public class VisitorBag{
|
|||
return this;
|
||||
}
|
||||
|
||||
public boolean hasElement(){
|
||||
return !this.collect.isEmpty();
|
||||
}
|
||||
|
||||
public <T> T toElement(){
|
||||
return (T) this.collect.get(0);
|
||||
}
|
||||
|
@ -86,12 +90,11 @@ public class VisitorBag{
|
|||
}
|
||||
|
||||
public V getValue(){
|
||||
return (V)this.values.get(0);
|
||||
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{
|
||||
TokenValidator.TOKENS = 0;
|
||||
TokenValidator.MAX_VALIDATE = 0;
|
||||
|
||||
parser.parse(value, null);
|
||||
|
||||
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -32,8 +32,8 @@ public class SpecificCase{
|
|||
return value;
|
||||
}
|
||||
};
|
||||
parser.parse(reader, new JavaFile());
|
||||
parser.build(new BufferedWriter(new FileWriter(new File("/home/ParserV2.txt"))));
|
||||
TokenValidator validator = parser.parse(reader, new JavaFile());
|
||||
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{
|
||||
TokenValidator.TOKENS = 0;
|
||||
TokenValidator.MAX_VALIDATE = 0;
|
||||
|
||||
JavaElement result = null;
|
||||
|
||||
parser.parse(value, result);
|
||||
|
||||
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -253,15 +253,8 @@ public class ValueTests {
|
|||
};
|
||||
|
||||
JavaElement testCase(String value) throws Exception{
|
||||
TokenValidator.TOKENS = 0;
|
||||
TokenValidator.MAX_VALIDATE = 0;
|
||||
|
||||
JavaElement result = null;
|
||||
|
||||
parser.parse(value, result);
|
||||
|
||||
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ import dev.peerat.parser.TokenType;
|
|||
import dev.peerat.parser.TokenValidator;
|
||||
import dev.peerat.parser.java.Annotation.AnnotableBuffer;
|
||||
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.state.InitialStateTree;
|
||||
import dev.peerat.parser.state.RedirectStateTree;
|
||||
|
@ -78,15 +79,8 @@ public class VariableTests{
|
|||
};
|
||||
|
||||
JavaElement testCase(String value) throws Exception{
|
||||
TokenValidator.TOKENS = 0;
|
||||
TokenValidator.MAX_VALIDATE = 0;
|
||||
|
||||
JavaElement result = new Class(null, 0,new Token(0, 0, "Test", TokenType.NAME));
|
||||
|
||||
JavaElement result = JavaBuilder.ofClass("Test").build();
|
||||
parser.parse(value, result);
|
||||
|
||||
assertEquals(TokenValidator.TOKENS, TokenValidator.MAX_VALIDATE);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue