diff --git a/src/dev/peerat/parser/SyntaxMissMatchException.java b/src/dev/peerat/parser/SyntaxMissMatchException.java index c95b910..6c99cea 100644 --- a/src/dev/peerat/parser/SyntaxMissMatchException.java +++ b/src/dev/peerat/parser/SyntaxMissMatchException.java @@ -14,4 +14,14 @@ public class SyntaxMissMatchException extends Exception{ public String getMessage(){ return "Only "+validator.getValidatedTokenCount()+" out "+validator.getTokenCount()+" of tokens parsed !"; } + + public String locateEndOfParsing(){ + int last = validator.getValidatedTokenCount(); + return "Last Token Validated: "+validator.getToken(last).toString()+" near to "+getTokenValue(last-2)+" "+getTokenValue(last-1)+" "+getTokenValue(last)+" "+getTokenValue(last+1)+" "+getTokenValue(last+2); + } + + private String getTokenValue(int index){ + if(index < 0 || index >= validator.getTokenCount()) return ""; + return validator.getToken(index).getValue(); + } } diff --git a/src/dev/peerat/parser/Token.java b/src/dev/peerat/parser/Token.java index 4d89d6c..0120366 100644 --- a/src/dev/peerat/parser/Token.java +++ b/src/dev/peerat/parser/Token.java @@ -36,6 +36,22 @@ public class Token{ return new Token(line, character, value+token.getValue(), TokenType.GROUP); } + void setLine(int value){ + this.line = value; + } + + void setCharacter(int value){ + this.character = value; + } + + void setValue(String value){ + this.value = value; + } + + void setType(TokenType value){ + this.type = value; + } + @Override public boolean equals(Object obj){ if(obj == null) return false; diff --git a/src/dev/peerat/parser/TokenUpdater.java b/src/dev/peerat/parser/TokenUpdater.java new file mode 100644 index 0000000..ca78220 --- /dev/null +++ b/src/dev/peerat/parser/TokenUpdater.java @@ -0,0 +1,84 @@ +package dev.peerat.parser; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Consumer; + +public class TokenUpdater{ + + private Map> map; + private Token[] tokens; + + //tmp + public TokenUpdater(){ + this.map = new HashMap<>(); + } + + public TokenUpdater(Token[] tokens){ + this.map = new HashMap<>(); + this.tokens = tokens; + } + + public void setValue(Token token, String value){ + Consumer consumer = (current) -> current.setValue(value); + Consumer current = this.map.get(token); + map.put(token, current == null ? consumer : current.andThen(consumer)); + } + + public void setType(Token token, TokenType value){ + Consumer consumer = (current) -> current.setType(value); + Consumer current = this.map.get(token); + map.put(token, current == null ? consumer : current.andThen(consumer)); + } + + public void setLine(Token token, int value){ + Consumer consumer = (current) -> current.setLine(value); + Consumer current = this.map.get(token); + map.put(token, current == null ? consumer : current.andThen(consumer)); + } + + public void setCharacter(Token token, int value){ + Consumer consumer = (current) -> current.setCharacter(value); + Consumer current = this.map.get(token); + map.put(token, current == null ? consumer : current.andThen(consumer)); + } + + public void pushUpdates(){ + + //tmp + if(this.tokens == null){ + for(Entry> entry : this.map.entrySet()) entry.getValue().accept(entry.getKey()); + return; + } + + for(int index = 0; index < this.tokens.length; index++){ + Token token = this.tokens[index]; + Consumer consumer = this.map.remove(token); + if(consumer != null){ + int line = token.getLineNumber(); + int character = token.getCharacterNumber(); + String value = token.getValue(); + consumer.accept(token); + + if(token.getLineNumber() != line){ + int dif = token.getLineNumber()-line; + for(int next = index+1; next < this.tokens.length; next++){ + Token update = this.tokens[next]; + if(update.getLineNumber() < line) break; + update.setLine(update.getLineNumber()+dif); + } + } + if(token.getCharacterNumber() != character || value.length() != token.getValue().length()){ + int dif = ((token.getCharacterNumber()+token.getValue().length())-(character+value.length())); + for(int next = index+1; next < this.tokens.length; next++){ + Token update = this.tokens[next]; + if(update.getLineNumber() > line) break; + update.setCharacter(update.getCharacterNumber()+dif); + } + } + } + } + //warn -> if map not empty -> tried to update non-tracked token, like group on concat,... + } +} diff --git a/src/dev/peerat/parser/TokenValidator.java b/src/dev/peerat/parser/TokenValidator.java index 073a456..3144556 100644 --- a/src/dev/peerat/parser/TokenValidator.java +++ b/src/dev/peerat/parser/TokenValidator.java @@ -27,6 +27,16 @@ public class TokenValidator{ return this.validated; } + public TokenUpdater toUpdater(){ + return new TokenUpdater(elements); + } + + + //NO NEED FOR TREE ! + Token getToken(int index){ + return this.elements[index]; + } + public boolean hasNext(){ return validated < elements.length; } diff --git a/src/dev/peerat/parser/java/Annotation.java b/src/dev/peerat/parser/java/Annotation.java index a745c40..a1d7679 100644 --- a/src/dev/peerat/parser/java/Annotation.java +++ b/src/dev/peerat/parser/java/Annotation.java @@ -3,13 +3,12 @@ package dev.peerat.parser.java; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.value.Value; -import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -127,5 +126,11 @@ public class Annotation implements JavaElement{ return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/AnnotationClass.java b/src/dev/peerat/parser/java/AnnotationClass.java index 7abaf7c..a6cd419 100644 --- a/src/dev/peerat/parser/java/AnnotationClass.java +++ b/src/dev/peerat/parser/java/AnnotationClass.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -82,4 +83,10 @@ public class AnnotationClass extends ClassBase{ return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/Class.java b/src/dev/peerat/parser/java/Class.java index 1a2b395..9075d98 100644 --- a/src/dev/peerat/parser/java/Class.java +++ b/src/dev/peerat/parser/java/Class.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.function.Predicate; import dev.peerat.parser.Token; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -80,11 +81,13 @@ public class Class extends ClassBase{ @Override public VisitorBag visit(Visitor visitor) { - if(visitor.canVisit(getClass())) return visitor.visit(this); - VisitorBag bag = new VisitorBag(); - if(!visitor.canPropagate()) return bag; - - bag.merge(super.visit(visitor)); + VisitorBag bag = super.visit(visitor); + if(!bag.isValidated()){ + if(visitor.canVisit(getClass())){ + bag.merge(visitor.visit(this)); + if(!visitor.canPropagate()) return bag; + } + } for(JavaElement element : this.elements){ bag.merge(element.visit(visitor)); @@ -92,4 +95,10 @@ public class Class extends ClassBase{ return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/Enumeration.java b/src/dev/peerat/parser/java/Enumeration.java index ee339d3..74b1ce2 100644 --- a/src/dev/peerat/parser/java/Enumeration.java +++ b/src/dev/peerat/parser/java/Enumeration.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -87,5 +88,11 @@ public class Enumeration extends ClassBase{ return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/Function.java b/src/dev/peerat/parser/java/Function.java index c643a54..f6dab53 100644 --- a/src/dev/peerat/parser/java/Function.java +++ b/src/dev/peerat/parser/java/Function.java @@ -1,20 +1,18 @@ package dev.peerat.parser.java; -import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.function.Predicate; import dev.peerat.parser.Token; -import dev.peerat.parser.TokenType; import dev.peerat.parser.java.Annotation.Annotable; import dev.peerat.parser.java.Variable.VariableContainer; import dev.peerat.parser.java.operation.Operation; import dev.peerat.parser.java.operation.Operation.OperationContainer; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.value.Value.ValueContainer; -import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -159,4 +157,13 @@ public class Function extends Annotable implements VariableContainer, OperationC return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + if(this.generic != null) bag.merge(visitor.visit(this.generic)); + bag.merge(visitor.visit(this.type)); + bag.merge(visitor.visit(this.name)); + return bag; + } } diff --git a/src/dev/peerat/parser/java/Import.java b/src/dev/peerat/parser/java/Import.java index d643971..6032f68 100644 --- a/src/dev/peerat/parser/java/Import.java +++ b/src/dev/peerat/parser/java/Import.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -43,5 +44,11 @@ public class Import implements JavaElement{ if(visitor.canVisit(getClass())) return visitor.visit(this); return new VisitorBag(); } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/Interface.java b/src/dev/peerat/parser/java/Interface.java index c5a31c5..926eafe 100644 --- a/src/dev/peerat/parser/java/Interface.java +++ b/src/dev/peerat/parser/java/Interface.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -85,4 +86,10 @@ public class Interface extends ClassBase{ return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/JavaElement.java b/src/dev/peerat/parser/java/JavaElement.java index e1fe67b..aa7b666 100644 --- a/src/dev/peerat/parser/java/JavaElement.java +++ b/src/dev/peerat/parser/java/JavaElement.java @@ -3,6 +3,7 @@ package dev.peerat.parser.java; import java.util.Collection; import java.util.function.Predicate; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -13,4 +14,6 @@ public interface JavaElement{ void findAll(Predicate finder, Collection collector); VisitorBag visit(Visitor visitor); + + VisitorBag visit(TokenVisitor visitor); } \ No newline at end of file diff --git a/src/dev/peerat/parser/java/JavaFile.java b/src/dev/peerat/parser/java/JavaFile.java index fe5d7fc..590af74 100644 --- a/src/dev/peerat/parser/java/JavaFile.java +++ b/src/dev/peerat/parser/java/JavaFile.java @@ -9,6 +9,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.Annotation.AnnotableBuffer; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -89,8 +90,11 @@ public class JavaFile implements JavaElement, ClassContainer, AnnotableBuffer{ @Override public VisitorBag visit(Visitor visitor){ - if(visitor.canVisit(getClass())) return visitor.visit(this); - VisitorBag bag = new VisitorBag(); + VisitorBag bag; + if(visitor.canVisit(getClass())){ + bag = visitor.visit(this); + if(!visitor.canPropagate()) return bag; + }else bag = new VisitorBag(); if(!visitor.canPropagate()) return bag; if(this.imports != null) @@ -108,4 +112,10 @@ public class JavaFile implements JavaElement, ClassContainer, AnnotableBuffer{ return bag; } + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } + } diff --git a/src/dev/peerat/parser/java/JavaParser.java b/src/dev/peerat/parser/java/JavaParser.java index fe3ae4c..bde970e 100644 --- a/src/dev/peerat/parser/java/JavaParser.java +++ b/src/dev/peerat/parser/java/JavaParser.java @@ -7,11 +7,14 @@ import dev.peerat.parser.java.tree.AnnotationTree; import dev.peerat.parser.java.tree.ClassBaseTree; import dev.peerat.parser.java.tree.ClassContainerTree; import dev.peerat.parser.java.tree.ClassTree; +import dev.peerat.parser.java.tree.EnumTree; import dev.peerat.parser.java.tree.EnumValueTree; import dev.peerat.parser.java.tree.FunctionContainerTree; import dev.peerat.parser.java.tree.FunctionTree; import dev.peerat.parser.java.tree.GenericTree; +import dev.peerat.parser.java.tree.ImportTree; import dev.peerat.parser.java.tree.InterfaceTree; +import dev.peerat.parser.java.tree.JavaTree; import dev.peerat.parser.java.tree.JavaTreeType; import dev.peerat.parser.java.tree.ModifierTree; import dev.peerat.parser.java.tree.OperationTree; @@ -104,6 +107,7 @@ public class JavaParser extends Parser{ SyntaxTreeRegistery registery = new SyntaxTreeRegistery<>(); registery.register(new ModifierTree(registery)); + registery.register(new ImportTree(registery)); registery.register(new TypeTree(registery)); registery.register(new GenericTree(registery)); registery.register(new ValueTree(registery)); @@ -117,73 +121,15 @@ public class JavaParser extends Parser{ registery.register(new ClassBaseTree(registery)); registery.register(new ClassTree(registery)); registery.register(new InterfaceTree(registery)); + registery.register(new EnumTree(registery)); registery.register(new AnnotationClassTree(registery)); + registery.register(new JavaTree(registery)); registery.init(); tRegistery.takeTiming("[Registery] %dms"); Timing load = Timing.of(); - StateTree main; - - if(level == JavaTreeType.ALL){ - InitialStateTree base = new InitialStateTree<>(); - main = base; - - StateTree pack = main.then((validator) -> { - if(validator.validate( - (token) -> token.getValue().equals("package"))){ - - while(validator.validate( - (token) -> !token.getValue().equals(";"), - (bag, token) -> { - Token current = bag.get(); - if(current == null) bag.set(token); - else bag.set(current.concat(token)); - }) - ); - return validator.validate((token) -> token.getValue().equals(";")); - } - return false; - }).end((parent, bag) -> { - ((JavaFile)parent).setPackage(bag.get()); - return parent; - }); - - StateTree importState = new StateTree<>(); - importState.then((validator) -> { - if(validator.validate( - (token) -> token.getValue().equals("import"))){ - - validator.validate( - (token) -> token.getValue().equals("static"), - (bag, token) -> bag.set("static", null)); - - while(validator.validate( - (token) -> !token.getValue().equals(";"), - (bag, token) -> { - Token current = bag.get(); - if(current == null) bag.set(token); - else bag.set(current.concat(token)); - }) - ); - - return validator.validate((token) -> token.getValue().equals(";")); - } - return false; - }).end((parent, bag) -> { - ((JavaFile)parent).addImport(new Import(bag.has("static"), bag.get())); - return parent; - }); - -// base.multiple(pack); - base.multiple(importState); - base.multiple(registery.getNode(AnnotationTree.class)); - base.multiple(registery.getNode(ClassBaseTree.class)); - }else{ - main = registery.getNode(level.getType()); - } - // //SUMMARY // //- Import // //- Package @@ -257,7 +203,7 @@ public class JavaParser extends Parser{ // System.out.println((System.currentTimeMillis()-time)+"ms"); setTokenizer(new JavaTokenizer()); - setStateTree(main); + setStateTree(registery.getNode(level.getType())); load.takeTiming("[load] %dms"); } diff --git a/src/dev/peerat/parser/java/JavaProject.java b/src/dev/peerat/parser/java/JavaProject.java index 169be44..c52cbc3 100644 --- a/src/dev/peerat/parser/java/JavaProject.java +++ b/src/dev/peerat/parser/java/JavaProject.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.List; import java.util.function.Predicate; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -41,5 +42,11 @@ public class JavaProject implements JavaElement{ return bag; } + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } + } diff --git a/src/dev/peerat/parser/java/JavaTokenizer.java b/src/dev/peerat/parser/java/JavaTokenizer.java index f841ed8..90fea0a 100644 --- a/src/dev/peerat/parser/java/JavaTokenizer.java +++ b/src/dev/peerat/parser/java/JavaTokenizer.java @@ -132,7 +132,6 @@ public class JavaTokenizer extends Tokenizer{ } token = new Token(lineNumber, i+1, value, TokenType.STRING); i = j-1; - System.out.println(token); }else if(c == '\''){ String value = "'"; int j = i+1; @@ -150,7 +149,6 @@ public class JavaTokenizer extends Tokenizer{ } token = new Token(lineNumber, i+1, value, TokenType.CHAR); i = j-1; - System.out.println(token); }else{ if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '/')) break; if(c == '/' && (i < line.length()-1 && line.charAt(i+1) == '*')){ diff --git a/src/dev/peerat/parser/java/Variable.java b/src/dev/peerat/parser/java/Variable.java index 187519f..1c72f7e 100644 --- a/src/dev/peerat/parser/java/Variable.java +++ b/src/dev/peerat/parser/java/Variable.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.Annotation.Annotable; import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -101,4 +102,10 @@ public class Variable extends Annotable{ return bag; } + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } + } diff --git a/src/dev/peerat/parser/java/builder/JavaAnnotationBuilder.java b/src/dev/peerat/parser/java/builder/JavaAnnotationBuilder.java index c2ee3dd..3f7d43b 100644 --- a/src/dev/peerat/parser/java/builder/JavaAnnotationBuilder.java +++ b/src/dev/peerat/parser/java/builder/JavaAnnotationBuilder.java @@ -6,6 +6,7 @@ import java.util.Map.Entry; import dev.peerat.parser.Token; import dev.peerat.parser.java.Annotation; +import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; public class JavaAnnotationBuilder extends JavaBuilder{ @@ -51,7 +52,5 @@ public class JavaAnnotationBuilder extends JavaBuilder{ } return new Annotation(new Token(0,0,name, null), map); } - - } diff --git a/src/dev/peerat/parser/java/builder/JavaBuilder.java b/src/dev/peerat/parser/java/builder/JavaBuilder.java index adf413e..8f0a254 100644 --- a/src/dev/peerat/parser/java/builder/JavaBuilder.java +++ b/src/dev/peerat/parser/java/builder/JavaBuilder.java @@ -1,6 +1,7 @@ package dev.peerat.parser.java.builder; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.JavaFile; import dev.peerat.parser.java.operation.Operation; import dev.peerat.parser.java.value.Value; @@ -16,6 +17,10 @@ public abstract class JavaBuilder{ return ofFile().setPackage(pack); } + public static JavaFileBuilder ofFile(JavaFile file){ + return ofFile(); //TODO COMPLETE ALL BY DOM VALUES + } + public static JavaImportBuilder ofImport(){ return new JavaImportBuilder(); } @@ -87,4 +92,6 @@ public abstract class JavaBuilder{ public abstract T build(); + public boolean filterEquals(JavaElement element){ return false;} //TODO ABSTRACT + } diff --git a/src/dev/peerat/parser/java/builder/JavaOperationBuilder.java b/src/dev/peerat/parser/java/builder/JavaOperationBuilder.java index 1b9c2ad..861c328 100644 --- a/src/dev/peerat/parser/java/builder/JavaOperationBuilder.java +++ b/src/dev/peerat/parser/java/builder/JavaOperationBuilder.java @@ -12,6 +12,7 @@ import dev.peerat.parser.java.operation.Operation; import dev.peerat.parser.java.operation.Operation.OperationContainer; import dev.peerat.parser.java.tree.JavaTreeType; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -54,5 +55,9 @@ public class JavaOperationBuilder extends JavaBuilder{ return null; } + @Override + public VisitorBag visit(TokenVisitor visitor){ + return null; + } } } diff --git a/src/dev/peerat/parser/java/builder/JavaValueBuilder.java b/src/dev/peerat/parser/java/builder/JavaValueBuilder.java index 4fc3711..14e9ffc 100644 --- a/src/dev/peerat/parser/java/builder/JavaValueBuilder.java +++ b/src/dev/peerat/parser/java/builder/JavaValueBuilder.java @@ -26,6 +26,7 @@ import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.value.VariableAccessValue; import dev.peerat.parser.java.value.Value.ValueContainer; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -143,5 +144,10 @@ public class JavaValueBuilder extends JavaBuilder{ return null; } + @Override + public VisitorBag visit(TokenVisitor visitor){ + return null; + } + } } diff --git a/src/dev/peerat/parser/java/operation/AssignOperation.java b/src/dev/peerat/parser/java/operation/AssignOperation.java index 0a86d37..17592ad 100644 --- a/src/dev/peerat/parser/java/operation/AssignOperation.java +++ b/src/dev/peerat/parser/java/operation/AssignOperation.java @@ -5,6 +5,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -47,4 +48,10 @@ public class AssignOperation extends Operation{ bag.merge(right.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/BreakOperation.java b/src/dev/peerat/parser/java/operation/BreakOperation.java index 19a3a9c..52b3a0a 100644 --- a/src/dev/peerat/parser/java/operation/BreakOperation.java +++ b/src/dev/peerat/parser/java/operation/BreakOperation.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -31,5 +32,11 @@ public class BreakOperation extends Operation{ if(visitor.canVisit(getClass())) return visitor.visit(this); return null; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/CatchOperation.java b/src/dev/peerat/parser/java/operation/CatchOperation.java index 7d958c4..c1a2eab 100644 --- a/src/dev/peerat/parser/java/operation/CatchOperation.java +++ b/src/dev/peerat/parser/java/operation/CatchOperation.java @@ -5,6 +5,7 @@ import java.util.List; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -32,5 +33,11 @@ public class CatchOperation extends OperationBag{ if(visitor.canVisit(getClass())) return visitor.visit(this); return super.visit(visitor); } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/ContinueOperation.java b/src/dev/peerat/parser/java/operation/ContinueOperation.java index 52a19f5..9e92fcc 100644 --- a/src/dev/peerat/parser/java/operation/ContinueOperation.java +++ b/src/dev/peerat/parser/java/operation/ContinueOperation.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -29,4 +30,10 @@ public class ContinueOperation extends Operation{ if(visitor.canVisit(getClass())) return visitor.visit(this); return null; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/DoOperation.java b/src/dev/peerat/parser/java/operation/DoOperation.java index a8a4997..7a858b2 100644 --- a/src/dev/peerat/parser/java/operation/DoOperation.java +++ b/src/dev/peerat/parser/java/operation/DoOperation.java @@ -2,6 +2,7 @@ package dev.peerat.parser.java.operation; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -13,4 +14,9 @@ public class DoOperation extends OperationBag{ return super.visit(visitor); } + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/ElseOperation.java b/src/dev/peerat/parser/java/operation/ElseOperation.java index 1cc6ab2..0717f3e 100644 --- a/src/dev/peerat/parser/java/operation/ElseOperation.java +++ b/src/dev/peerat/parser/java/operation/ElseOperation.java @@ -2,6 +2,7 @@ package dev.peerat.parser.java.operation; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -12,5 +13,11 @@ public class ElseOperation extends OperationBag{ if(visitor.canVisit(getClass())) return visitor.visit(this); return super.visit(visitor); } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/FinallyOperation.java b/src/dev/peerat/parser/java/operation/FinallyOperation.java index 44bb7ab..1308035 100644 --- a/src/dev/peerat/parser/java/operation/FinallyOperation.java +++ b/src/dev/peerat/parser/java/operation/FinallyOperation.java @@ -2,6 +2,7 @@ package dev.peerat.parser.java.operation; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -12,5 +13,11 @@ public class FinallyOperation extends OperationBag{ if(visitor.canVisit(getClass())) return visitor.visit(this); return super.visit(visitor); } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/ForOperation.java b/src/dev/peerat/parser/java/operation/ForOperation.java index 03cd057..bd45a7a 100644 --- a/src/dev/peerat/parser/java/operation/ForOperation.java +++ b/src/dev/peerat/parser/java/operation/ForOperation.java @@ -9,6 +9,7 @@ import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -116,4 +117,10 @@ public class ForOperation extends OperationBag{ bag.merge(super.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/ForeachOperation.java b/src/dev/peerat/parser/java/operation/ForeachOperation.java index 0af5ded..7f1dd10 100644 --- a/src/dev/peerat/parser/java/operation/ForeachOperation.java +++ b/src/dev/peerat/parser/java/operation/ForeachOperation.java @@ -9,6 +9,7 @@ import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -58,4 +59,10 @@ public class ForeachOperation extends OperationBag{ bag.merge(super.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/IfOperation.java b/src/dev/peerat/parser/java/operation/IfOperation.java index 3a74ce5..9482eb5 100644 --- a/src/dev/peerat/parser/java/operation/IfOperation.java +++ b/src/dev/peerat/parser/java/operation/IfOperation.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -38,11 +39,19 @@ public class IfOperation extends OperationBag{ } @Override - public VisitorBag visit(Visitor visitor) { - if(visitor.canVisit(getClass())) return visitor.visit(this); - VisitorBag bag = new VisitorBag(); + public VisitorBag visit(Visitor visitor){ + VisitorBag bag; + if(visitor.canVisit(getClass())){ + bag = visitor.visit(this); + if(!visitor.canPropagate()) return bag; + }else bag = new VisitorBag(); bag.merge(condition.visit(visitor)); bag.merge(super.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + return new VisitorBag(); + } } diff --git a/src/dev/peerat/parser/java/operation/ReturnOperation.java b/src/dev/peerat/parser/java/operation/ReturnOperation.java index 29cadad..b5e417a 100644 --- a/src/dev/peerat/parser/java/operation/ReturnOperation.java +++ b/src/dev/peerat/parser/java/operation/ReturnOperation.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -43,4 +44,10 @@ public class ReturnOperation extends Operation{ if(this.value != null) bag.merge(this.value.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/SwitchOperation.java b/src/dev/peerat/parser/java/operation/SwitchOperation.java index 4d44e61..c2c9a7f 100644 --- a/src/dev/peerat/parser/java/operation/SwitchOperation.java +++ b/src/dev/peerat/parser/java/operation/SwitchOperation.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -31,4 +32,10 @@ public class SwitchOperation extends Operation{ if(visitor.canVisit(getClass())) return visitor.visit(this); return null; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/SynchronizedOperation.java b/src/dev/peerat/parser/java/operation/SynchronizedOperation.java index 0d5b57f..6345777 100644 --- a/src/dev/peerat/parser/java/operation/SynchronizedOperation.java +++ b/src/dev/peerat/parser/java/operation/SynchronizedOperation.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -45,4 +46,10 @@ public class SynchronizedOperation extends OperationBag{ bag.merge(super.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/ThrowOperation.java b/src/dev/peerat/parser/java/operation/ThrowOperation.java index 862ee89..4e2e027 100644 --- a/src/dev/peerat/parser/java/operation/ThrowOperation.java +++ b/src/dev/peerat/parser/java/operation/ThrowOperation.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -42,4 +43,9 @@ public class ThrowOperation extends Operation{ return bag; } + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/TryOperation.java b/src/dev/peerat/parser/java/operation/TryOperation.java index cdec481..4cbc323 100644 --- a/src/dev/peerat/parser/java/operation/TryOperation.java +++ b/src/dev/peerat/parser/java/operation/TryOperation.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -50,4 +51,10 @@ public class TryOperation extends OperationBag{ bag.merge(super.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/operation/WhileOperation.java b/src/dev/peerat/parser/java/operation/WhileOperation.java index 5e7709c..2081b00 100644 --- a/src/dev/peerat/parser/java/operation/WhileOperation.java +++ b/src/dev/peerat/parser/java/operation/WhileOperation.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -44,4 +45,10 @@ public class WhileOperation extends OperationBag{ bag.merge(super.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/printer/JavaOperationPrinter.java b/src/dev/peerat/parser/java/printer/JavaOperationPrinter.java index fe1388e..bf750d6 100644 --- a/src/dev/peerat/parser/java/printer/JavaOperationPrinter.java +++ b/src/dev/peerat/parser/java/printer/JavaOperationPrinter.java @@ -1,5 +1,7 @@ package dev.peerat.parser.java.printer; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.operation.IfOperation; import dev.peerat.parser.java.operation.ReturnOperation; import dev.peerat.parser.java.value.Value; @@ -21,5 +23,35 @@ public class JavaOperationPrinter{ } } + + public static class JavaOperationIfPrinter extends JavaPrinter{ + + @Override + public void print(IfOperation element, Writer writer, String buffer, JavaPrintProvider provider) throws Exception { + writer.write(buffer+"if("); + Value condition = element.getCondition(); + provider.getPrinter(condition).print(condition, writer, "", provider); + writer.write(")"); + int size = element.getElements().size(); + if(size == 0){ + writer.write(";"); + return; + } + if(size == 1){ + writer.write(" "); + JavaElement subElement = element.getElements().get(0); + provider.getPrinter(subElement).print(subElement, writer, "", provider); + writer.write(";"); + return; + } + writer.write("{\n"); + for(JavaElement subElement : element.getElements()){ + provider.getPrinter(subElement).print(subElement, writer, buffer+"\t", provider); + writer.write("\n"); + } + writer.write(buffer+"}\n"); + } + + } } diff --git a/src/dev/peerat/parser/java/printer/JavaPrinter.java b/src/dev/peerat/parser/java/printer/JavaPrinter.java index 688b7f8..c6cbd41 100644 --- a/src/dev/peerat/parser/java/printer/JavaPrinter.java +++ b/src/dev/peerat/parser/java/printer/JavaPrinter.java @@ -11,7 +11,9 @@ import dev.peerat.parser.java.Import; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.JavaFile; import dev.peerat.parser.java.Variable; +import dev.peerat.parser.java.operation.IfOperation; import dev.peerat.parser.java.operation.ReturnOperation; +import dev.peerat.parser.java.printer.JavaOperationPrinter.JavaOperationIfPrinter; import dev.peerat.parser.java.printer.JavaOperationPrinter.JavaOperationReturnPrinter; import dev.peerat.parser.java.printer.JavaValuePrinter.JavaArrayAccessValuePrinter; import dev.peerat.parser.java.printer.JavaValuePrinter.JavaArrayValuePrinter; @@ -53,6 +55,7 @@ public abstract class JavaPrinter{ provider.register(VariableAccessValue.class, new JavaVariableAccessValuePrinter()); provider.register(ReturnOperation.class, new JavaOperationReturnPrinter()); + provider.register(IfOperation.class, new JavaOperationIfPrinter()); provider.register(Import.class, new JavaImportPrinter()); provider.register(Annotation.class, new JavaAnnotationPrinter()); @@ -82,7 +85,9 @@ public abstract class JavaPrinter{ } public JavaPrinter getPrinter(Class type){ - return (JavaPrinter) this.map.get(type); + JavaPrinter result = (JavaPrinter) this.map.get(type); + if(result == null) throw new IllegalArgumentException("No Print Provider for type "+type+"."); + return result; } } diff --git a/src/dev/peerat/parser/java/printer/JavaValuePrinter.java b/src/dev/peerat/parser/java/printer/JavaValuePrinter.java index 1b2a9cb..4cd9c56 100644 --- a/src/dev/peerat/parser/java/printer/JavaValuePrinter.java +++ b/src/dev/peerat/parser/java/printer/JavaValuePrinter.java @@ -35,7 +35,7 @@ public class JavaValuePrinter{ Value left = element.left(); provider.getPrinter(left).print(left, writer, "", provider); - writer.write(element.getAction()); + writer.write(" "+element.getAction()+" "); Value right = element.right(); provider.getPrinter(right).print(right, writer, "", provider); diff --git a/src/dev/peerat/parser/java/tree/ClassBaseTree.java b/src/dev/peerat/parser/java/tree/ClassBaseTree.java index dfe837e..3e22af6 100644 --- a/src/dev/peerat/parser/java/tree/ClassBaseTree.java +++ b/src/dev/peerat/parser/java/tree/ClassBaseTree.java @@ -20,7 +20,7 @@ public class ClassBaseTree extends SyntaxTree { StateTree modifier = registery.getNode(ModifierTree.class); StateTree clazz_ = this.current; - this.modifierState = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))); + this.modifierState = clazz_.then(new RedirectStateTree<>(modifier, (global, local) -> global.set("modifier", local))).loop(); } public StateTree getModifierNode(){ diff --git a/src/dev/peerat/parser/java/tree/ImportTree.java b/src/dev/peerat/parser/java/tree/ImportTree.java new file mode 100644 index 0000000..6c85ff4 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/ImportTree.java @@ -0,0 +1,45 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.Token; +import dev.peerat.parser.java.Import; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.JavaFile; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class ImportTree extends SyntaxTree { + + public ImportTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new StateTree<>(); + } + + @Override + public void init() { + this.current.then((validator) -> { + if(validator.validate( + (token) -> token.getValue().equals("import"))){ + + validator.validate( + (token) -> token.getValue().equals("static"), + (bag, token) -> bag.set("static", null)); + + while(validator.validate( + (token) -> !token.getValue().equals(";"), + (bag, token) -> { + Token current = bag.get(); + if(current == null) bag.set(token); + else bag.set(current.concat(token)); + }) + ); + + return validator.validate((token) -> token.getValue().equals(";")); + } + return false; + }).end((parent, bag) -> { + ((JavaFile)parent).addImport(new Import(bag.has("static"), bag.get())); + return parent; + }); + } +} diff --git a/src/dev/peerat/parser/java/tree/InterfaceTree.java b/src/dev/peerat/parser/java/tree/InterfaceTree.java index 871793b..99c682a 100644 --- a/src/dev/peerat/parser/java/tree/InterfaceTree.java +++ b/src/dev/peerat/parser/java/tree/InterfaceTree.java @@ -20,7 +20,6 @@ public class InterfaceTree extends SyntaxTree { @Override public void init() { - StateTree modifier = registery.getNode(ModifierTree.class); StateTree type = registery.getNode(TypeTree.class); StateTree clazz_container = registery.getNode(ClassContainerTree.class); // INTERFACE diff --git a/src/dev/peerat/parser/java/tree/JavaTree.java b/src/dev/peerat/parser/java/tree/JavaTree.java new file mode 100644 index 0000000..9e32b24 --- /dev/null +++ b/src/dev/peerat/parser/java/tree/JavaTree.java @@ -0,0 +1,47 @@ +package dev.peerat.parser.java.tree; + +import dev.peerat.parser.Token; +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.java.JavaFile; +import dev.peerat.parser.state.InitialStateTree; +import dev.peerat.parser.state.StateTree; +import dev.peerat.parser.tree.SyntaxTree; +import dev.peerat.parser.tree.SyntaxTreeRegistery; + +public class JavaTree extends SyntaxTree { + + public JavaTree(SyntaxTreeRegistery registery) { + super(registery); + this.current = new InitialStateTree<>(); + } + + @Override + public void init() { + InitialStateTree main = (InitialStateTree) this.current; + StateTree pack = main.then((validator) -> { + if(validator.validate( + (token) -> token.getValue().equals("package"))){ + + while(validator.validate( + (token) -> !token.getValue().equals(";"), + (bag, token) -> { + Token current = bag.get(); + if(current == null) bag.set(token); + else bag.set(current.concat(token)); + }) + ); + return validator.validate((token) -> token.getValue().equals(";")); + } + return false; + }).end((parent, bag) -> { + ((JavaFile)parent).setPackage(bag.get()); + return parent; + }); + +// base.multiple(pack); + main.multiple(registery.getNode(ImportTree.class)); + main.multiple(registery.getNode(AnnotationTree.class)); + main.multiple(registery.getNode(ClassBaseTree.class)); + } + +} diff --git a/src/dev/peerat/parser/java/tree/JavaTreeType.java b/src/dev/peerat/parser/java/tree/JavaTreeType.java index 77db4dc..cad98d4 100644 --- a/src/dev/peerat/parser/java/tree/JavaTreeType.java +++ b/src/dev/peerat/parser/java/tree/JavaTreeType.java @@ -4,7 +4,7 @@ import dev.peerat.parser.tree.TreeType; public enum JavaTreeType implements TreeType{ - ALL(null), + ALL(JavaTree.class), CLASS_BASE(ClassBaseTree.class), CLASS(ClassTree.class), INTERFACE(InterfaceTree.class), @@ -17,6 +17,7 @@ public enum JavaTreeType implements TreeType{ VALUE(ValueTree.class), TYPE(TypeTree.class), GENERIC(GenericTree.class), + IMPORT(ImportTree.class), MODIFIER(ModifierTree.class); private Class type; diff --git a/src/dev/peerat/parser/java/tree/OperationTree.java b/src/dev/peerat/parser/java/tree/OperationTree.java index fc00a91..465586f 100644 --- a/src/dev/peerat/parser/java/tree/OperationTree.java +++ b/src/dev/peerat/parser/java/tree/OperationTree.java @@ -128,10 +128,8 @@ public class OperationTree extends SyntaxTree { StateTree operation_if = operation .then((validator) -> validator.validate((token) -> token.getValue().equals("if"))) - .then((validator) -> validator.validate((token) -> token.getValue().equals("("))).then((v) -> { - System.out.println("inside IF"); - return true; - }).then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) + .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) + .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))).end((parent, bag) -> { System.out.println("if " + bag); IfOperation op = new IfOperation(bag.get()); @@ -264,7 +262,10 @@ public class OperationTree extends SyntaxTree { .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))).end((a, b) -> a); StateTree operation_name = operation - .then(new RedirectStateTree<>(value, (global, local) -> global.set(local.get()))); + .then(new RedirectStateTree<>(value, (global, local) -> { + global.set(local.get()); +// System.out.println(" "+global); + })); operation_name.then((validator) -> validator.validate((token) -> token.getValue().equals("="))) .then(new RedirectStateTree<>(value, (global, local) -> global.set("newer", local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) @@ -289,7 +290,7 @@ public class OperationTree extends SyntaxTree { return null; }); - function_container.then(variable); + function_container.redirect(variable).end(); function_container.then(operation); } diff --git a/src/dev/peerat/parser/java/tree/ValueTree.java b/src/dev/peerat/parser/java/tree/ValueTree.java index e7632a2..82e21d0 100644 --- a/src/dev/peerat/parser/java/tree/ValueTree.java +++ b/src/dev/peerat/parser/java/tree/ValueTree.java @@ -35,6 +35,8 @@ import dev.peerat.parser.tree.SyntaxTreeRegistery; public class ValueTree extends SyntaxTree { //TODO order tree by more used branch ? to not check a whole tree to go on the last branch... + //TODO PRIORIY OF OPERATION ? BECAUSE OF != null + ?: + public ValueTree(SyntaxTreeRegistery registery) { super(registery); this.current = new StateTree<>(); @@ -42,6 +44,7 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo @Override public void init(){ + StateTree generic = this.registery.getNode(GenericTree.class); StateTree type = this.registery.getNode(TypeTree.class); StateTree function_container = this.registery.getNode(FunctionContainerTree.class); StateTree class_container = this.registery.getNode(ClassContainerTree.class); @@ -115,27 +118,40 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo return true; }) .then((validator) -> validator.validate((token) -> token.getType().equals(TokenType.NAME), - (bag, token) ->{ - bag.get().nameValue(token); - })); + (bag, token) -> bag.get().nameValue(token))); value_name.end(ValueChainBuilder.build((builder) -> builder.dot(), false)); value_name.then(value_operation); - value_instance_array_value_end.equals(".", (bag, token) -> { bag.get().rebase(new ArrayValue(bag.>get("array").toArray(new Value[0]))); bag.remove("array"); }).then(value_name); + StateTree value_generic_call = unary_value.then((validator) -> { + validator.getBag().set(new ValueChainBuilder()); + return true; + }).redirect(generic, (global, local) -> global.get().generic(local.get())); + value_generic_call.then(value_name); - unary_value.then((validator) -> { + StateTree value_instance_array_dot = value_instance_array_value_end.equals(".", (bag, token) -> { bag.get().rebase(new ArrayValue(bag.>get("array").toArray(new Value[0]))); bag.remove("array"); }); + value_instance_array_dot.then(value_name); + value_instance_array_dot.then(value_generic_call); + + StateTree string_value = unary_value.then((validator) -> { validator.getBag().set(new ValueChainBuilder()); return true; }).then((validator) -> validator.validate( (token) -> token.getType().equals(TokenType.STRING) || token.getType().equals(TokenType.CHAR), - (bag, token) -> bag.get().constantValue(token))) - .end(ValueChainBuilder.build((builder) -> builder.buildStatic(), false)); + (bag, token) -> bag.get().constantValue(token))); + string_value.end(ValueChainBuilder.build((builder) -> builder.buildStatic(), false)); + string_value.then(value_operation); value_operation.equals(">", action(">")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); value_operation.equals("=", action("=")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); value_operation.equals("<",action("<")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + value_operation.equals("!",action("!")).equals("=",action("!=")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + value_operation.equals("=",action("=")).equals("=",action("==")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); value_operation.equals("<",action("<")).equals("<","action","<<").then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + value_operation.equals("+",action("+")).equals("=", action("+=")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); value_operation.equals("+",action("+")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + + value_operation.equals("instanceof", action("instanceof")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); + StateTree value_operation_bit_and = value_operation.equals("&",action("&")); value_operation_bit_and.then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); value_operation_bit_and.equals("&",action("&&")).then(redirectRight).end(ValueChainBuilder.build((builder) -> builder.buildOperation(), false)); @@ -162,15 +178,19 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo StateTree value_array_end = value_array_value.equals("]"); value_array_end.end(ValueChainBuilder.build(false)); value_array_end.then(value_array); - value_array_end.equals(".", (bag, token) -> bag.get().dot()).then(value_name); + StateTree value_array_dot = value_array_end.equals(".", (bag, token) -> bag.get().dot()); + value_array_dot.then(value_name); + value_array_dot.then(value_generic_call); value_instance_array_value_end.then(value_array); StateTree operation_call = value_name.equals(".", (bag, token) -> bag.get().dot()); operation_call.then(value_name); + operation_call.then(value_generic_call); StateTree operation_begin = value_name.equals("(", (bag, token) -> bag.get().parameter()); StateTree operation_end = operation_begin.equals(")", (bag, token) -> bag.get().parameter()); operation_end.then(operation_call); + operation_end.then(value_operation); operation_end.end(ValueChainBuilder.build((builder) -> builder.buildMethodCall(), false)); StateTree operation_value = operation_begin.redirect(this.current, (global, local) -> global.get().parameter(local.get())); operation_value.then(operation_end); @@ -204,7 +224,9 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo cast.end(ValueChainBuilder.build(false)); - cast.equals(".").then(value_name); + StateTree cast_dot = cast.equals("."); + cast_dot.then(value_name); + cast_dot.then(value_generic_call); cast.then(value_array); value_inside_type.then(value_inside); @@ -216,6 +238,13 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo value_inside.then(value_operation); value_parenthesis_close.end(); value_parenthesis_close.then(value_operation); + StateTree value_parenthesis_dot = value_parenthesis_close.equals(".", (bag, token) -> { + ValueChainBuilder builder = new ValueChainBuilder(); + builder.rebase(bag.get()); + bag.set(builder); + }); + value_parenthesis_dot.then(value_generic_call); + value_parenthesis_dot.then(value_name); StateTree value_lambda = value_parenthesis_close.then((validator) -> validator.validate((token) -> token.getValue().equals("-")) && validator.validate((token) -> token.getValue().equals(">"))); value_lambda.equals("{") @@ -231,7 +260,16 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo } private BiConsumer action(String action){ - return (bag, token) -> bag.get().action(action); + return (bag, token) -> { + if(!(bag.get() instanceof ValueChainBuilder)){ + ValueChainBuilder builder = new ValueChainBuilder(); + builder.rebase(bag.get()); + builder.action(action); + bag.set(builder); + return; + } + bag.get().action(action); + }; } private BiConsumer modifier(){ @@ -262,6 +300,8 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo private Token current; + private Token generic; + private Token modifier; private String action; @@ -295,6 +335,10 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo this.right = value; } + public void generic(Token token){ + this.generic = token; + } + public void modifier(Token token){ this.modifier = token; } @@ -349,16 +393,22 @@ public class ValueTree extends SyntaxTree { //TODO order tree by mo } public void buildOperation(){ + if(this.base != null && this.current != null) buildVariableAccess(); + if(this.lambda != null) extractLambda(); this.base = new BiValue(current == null ? base : new StaticValue(current), action, right); } public void buildMethodCall(){ if(this.current == null) return; - this.base = new MethodCallValue(this.base, null, this.current, this.parameters); + this.base = new MethodCallValue(this.base, this.generic, this.current, this.parameters); + this.generic = null; + this.current = null; + this.parameters = null; } public void buildVariableAccess(){ this.base = new VariableAccessValue(this.base, this.current); + this.current = null; } public void buildLambda(){ diff --git a/src/dev/peerat/parser/java/value/ArrayAccessValue.java b/src/dev/peerat/parser/java/value/ArrayAccessValue.java index f89fe53..eed9377 100644 --- a/src/dev/peerat/parser/java/value/ArrayAccessValue.java +++ b/src/dev/peerat/parser/java/value/ArrayAccessValue.java @@ -6,6 +6,7 @@ import java.util.function.Function; import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -47,5 +48,13 @@ public class ArrayAccessValue extends Value{ bag.merge(this.access.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + bag.merge(this.base.visit(visitor)); + bag.merge(this.access.visit(visitor)); + return bag; + } } diff --git a/src/dev/peerat/parser/java/value/ArrayValue.java b/src/dev/peerat/parser/java/value/ArrayValue.java index 5235aa8..8233e34 100644 --- a/src/dev/peerat/parser/java/value/ArrayValue.java +++ b/src/dev/peerat/parser/java/value/ArrayValue.java @@ -6,6 +6,7 @@ import java.util.function.Function; import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -41,6 +42,11 @@ public class ArrayValue extends Value{ return bag; } - + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + for(Value value : this.values) bag.merge(value.visit(visitor)); + return bag; + } } diff --git a/src/dev/peerat/parser/java/value/BiValue.java b/src/dev/peerat/parser/java/value/BiValue.java index 8062948..b4f66cb 100644 --- a/src/dev/peerat/parser/java/value/BiValue.java +++ b/src/dev/peerat/parser/java/value/BiValue.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.visitor.JavaVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -59,4 +60,9 @@ public class BiValue extends Value{ bag.merge(right.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + return new VisitorBag(); + } } diff --git a/src/dev/peerat/parser/java/value/CastValue.java b/src/dev/peerat/parser/java/value/CastValue.java index 0437720..9412aa5 100644 --- a/src/dev/peerat/parser/java/value/CastValue.java +++ b/src/dev/peerat/parser/java/value/CastValue.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -48,6 +49,15 @@ public class CastValue extends Value{ return bag; } + @Override + public String toString(){ + return "[CastValue] (("+type+") "+value+")"; + } + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/value/InstanceValue.java b/src/dev/peerat/parser/java/value/InstanceValue.java index 8601679..0f5989b 100644 --- a/src/dev/peerat/parser/java/value/InstanceValue.java +++ b/src/dev/peerat/parser/java/value/InstanceValue.java @@ -12,6 +12,7 @@ import dev.peerat.parser.java.Function.FunctionContainer; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.java.Variable; import dev.peerat.parser.java.Variable.VariableContainer; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -92,5 +93,11 @@ public class InstanceValue extends Value implements VariableContainer, FunctionC bag.merge(content.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/value/LambdaValue.java b/src/dev/peerat/parser/java/value/LambdaValue.java index 7b58768..5ca6488 100644 --- a/src/dev/peerat/parser/java/value/LambdaValue.java +++ b/src/dev/peerat/parser/java/value/LambdaValue.java @@ -13,6 +13,7 @@ import dev.peerat.parser.java.Variable.VariableContainer; import dev.peerat.parser.java.operation.Operation; import dev.peerat.parser.java.operation.Operation.OperationContainer; import dev.peerat.parser.java.value.Value.ValueContainer; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -81,6 +82,12 @@ public class LambdaValue extends Value implements OperationContainer, VariableCo return bag; } + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } + public static class LambdaParameter{ private Token type; diff --git a/src/dev/peerat/parser/java/value/MethodCallValue.java b/src/dev/peerat/parser/java/value/MethodCallValue.java index d42353f..387b7f0 100644 --- a/src/dev/peerat/parser/java/value/MethodCallValue.java +++ b/src/dev/peerat/parser/java/value/MethodCallValue.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -61,6 +62,12 @@ public class MethodCallValue extends Value{ for(Value value : parameters) bag.merge(value.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } @Override public String toString(){ diff --git a/src/dev/peerat/parser/java/value/ModifierValue.java b/src/dev/peerat/parser/java/value/ModifierValue.java index 3677d80..edbf1c8 100644 --- a/src/dev/peerat/parser/java/value/ModifierValue.java +++ b/src/dev/peerat/parser/java/value/ModifierValue.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -52,4 +53,10 @@ public class ModifierValue extends Value{ bag.merge(value.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/value/StaticValue.java b/src/dev/peerat/parser/java/value/StaticValue.java index 750fb08..84feb37 100644 --- a/src/dev/peerat/parser/java/value/StaticValue.java +++ b/src/dev/peerat/parser/java/value/StaticValue.java @@ -1,12 +1,11 @@ package dev.peerat.parser.java.value; import java.util.Collection; -import java.util.List; -import java.util.function.Function; import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -45,4 +44,11 @@ public class StaticValue extends Value{ VisitorBag bag = new VisitorBag(); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + bag.merge(visitor.visit(this.token)); + return bag; + } } diff --git a/src/dev/peerat/parser/java/value/TriValue.java b/src/dev/peerat/parser/java/value/TriValue.java index a70e2d1..d57fae3 100644 --- a/src/dev/peerat/parser/java/value/TriValue.java +++ b/src/dev/peerat/parser/java/value/TriValue.java @@ -6,6 +6,7 @@ import java.util.function.Function; import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -59,5 +60,11 @@ public class TriValue extends Value{ bag.merge(fail.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } } diff --git a/src/dev/peerat/parser/java/value/VariableAccessValue.java b/src/dev/peerat/parser/java/value/VariableAccessValue.java index 3aef464..cc567f2 100644 --- a/src/dev/peerat/parser/java/value/VariableAccessValue.java +++ b/src/dev/peerat/parser/java/value/VariableAccessValue.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -47,6 +48,12 @@ public class VariableAccessValue extends Value{ bag.merge(base.visit(visitor)); return bag; } + + @Override + public VisitorBag visit(TokenVisitor visitor){ + VisitorBag bag = new VisitorBag(); + return bag; + } @Override public String toString(){ diff --git a/src/dev/peerat/parser/java/visitor/JavaAnnotationClassVisitor.java b/src/dev/peerat/parser/java/visitor/JavaAnnotationClassVisitor.java index 09e3a50..ee40d68 100644 --- a/src/dev/peerat/parser/java/visitor/JavaAnnotationClassVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaAnnotationClassVisitor.java @@ -3,7 +3,7 @@ package dev.peerat.parser.java.visitor; import dev.peerat.parser.java.AnnotationClass; import dev.peerat.parser.visitor.VisitorBag; -public class JavaAnnotationClassVisitor extends JavaVisitor{ +public class JavaAnnotationClassVisitor extends JavaVisitor{ public JavaAnnotationClassVisitor(boolean propagate){ super(AnnotationClass.class, propagate); diff --git a/src/dev/peerat/parser/java/visitor/JavaAnnotationVisitor.java b/src/dev/peerat/parser/java/visitor/JavaAnnotationVisitor.java index 4c39095..bf07708 100644 --- a/src/dev/peerat/parser/java/visitor/JavaAnnotationVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaAnnotationVisitor.java @@ -11,12 +11,12 @@ import dev.peerat.parser.java.Annotation; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.visitor.VisitorBag; -public class JavaAnnotationVisitor extends JavaVisitor{ +public class JavaAnnotationVisitor extends JavaVisitor{ private Predicate nameFilter; private Predicate keyFilter; private BiPredicate valueFilter; - private Function> valueFilterVisitor; + private Function> valueFilterVisitor; public JavaAnnotationVisitor(boolean propagate){ super(Annotation.class, propagate); @@ -48,7 +48,7 @@ public class JavaAnnotationVisitor extends JavaVisitor{ } //unique ? - public JavaAnnotationVisitor valueFilter(Function> visitor){ + public JavaAnnotationVisitor valueFilter(Function> visitor){ System.out.println("filter value visitor"); this.valueFilterVisitor = visitor; return this; diff --git a/src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java b/src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java index 679d8e1..383f64b 100644 --- a/src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaClassBaseVisitor.java @@ -8,7 +8,7 @@ import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaClassBaseVisitor extends JavaVisitor{ +public class JavaClassBaseVisitor extends JavaVisitor{ private Visitor validator; diff --git a/src/dev/peerat/parser/java/visitor/JavaElementVisitor.java b/src/dev/peerat/parser/java/visitor/JavaElementVisitor.java new file mode 100644 index 0000000..a7d10fb --- /dev/null +++ b/src/dev/peerat/parser/java/visitor/JavaElementVisitor.java @@ -0,0 +1,22 @@ +package dev.peerat.parser.java.visitor; + +import dev.peerat.parser.java.JavaElement; +import dev.peerat.parser.visitor.VisitorBag; + +public class JavaElementVisitor extends JavaVisitor{ + + public JavaElementVisitor(boolean propagate){ + super(JavaElement.class, propagate); + } + + @Override + public VisitorBag visitElement(JavaElement element){ + VisitorBag bag = new VisitorBag(); + + if(!visitToken(bag, element)) return bag; + + bag.compute(element); + return bag; + } + +} diff --git a/src/dev/peerat/parser/java/visitor/JavaEnumerationVisitor.java b/src/dev/peerat/parser/java/visitor/JavaEnumerationVisitor.java index 48b9cbf..c851f72 100644 --- a/src/dev/peerat/parser/java/visitor/JavaEnumerationVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaEnumerationVisitor.java @@ -3,7 +3,7 @@ package dev.peerat.parser.java.visitor; import dev.peerat.parser.java.Enumeration; import dev.peerat.parser.visitor.VisitorBag; -public class JavaEnumerationVisitor extends JavaVisitor{ +public class JavaEnumerationVisitor extends JavaVisitor{ public JavaEnumerationVisitor(boolean propagate){ super(Enumeration.class,propagate); diff --git a/src/dev/peerat/parser/java/visitor/JavaFileVisitor.java b/src/dev/peerat/parser/java/visitor/JavaFileVisitor.java index 7af2551..683a39c 100644 --- a/src/dev/peerat/parser/java/visitor/JavaFileVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaFileVisitor.java @@ -7,7 +7,7 @@ import dev.peerat.parser.java.JavaFile; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaFileVisitor extends JavaVisitor{ +public class JavaFileVisitor extends JavaVisitor{ private boolean checkPackage; private boolean checkNoPackage; @@ -53,7 +53,10 @@ public class JavaFileVisitor extends JavaVisitor{ if(this.checkPackage && element.getPackage() == null) return bag; else if(this.checkNoPackage && element.getPackage() != null) return bag; - if(this.pack != null && element.getPackage() != null && !this.pack.test(element.getPackage().getValue())) return bag; + if(this.pack != null){ + if(element.getPackage() == null) return bag; + if(!this.pack.test(element.getPackage().getValue())) return bag; + } if(this.imports != null && validates(bag, element.getImports(), this.imports)) return bag; if(this.classes != null){ diff --git a/src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java b/src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java index c971f79..bf74183 100644 --- a/src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaFunctionVisitor.java @@ -1,19 +1,33 @@ package dev.peerat.parser.java.visitor; +import java.util.function.Predicate; + import dev.peerat.parser.java.Function; import dev.peerat.parser.visitor.VisitorBag; -public class JavaFunctionVisitor extends JavaVisitor{ - +public class JavaFunctionVisitor extends JavaModifiableVisitor{ + + //TODO MOD + annotation + + private Predicate namePredicate; + public JavaFunctionVisitor(boolean propagate){ super(Function.class, propagate); } + public JavaFunctionVisitor named(Predicate predicate){ + this.namePredicate = predicate; //TODO CONCAT + return this; + } + @Override public VisitorBag visitElement(Function element){ VisitorBag bag = new VisitorBag(); - + if(this.namePredicate != null){ + if(element.getName() == null) return bag; + if(!this.namePredicate.test(element.getName().getValue())) return bag; + } bag.compute(element); return bag; diff --git a/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java b/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java index 823d540..66e06e2 100644 --- a/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaImportVisitor.java @@ -5,7 +5,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.Import; import dev.peerat.parser.visitor.VisitorBag; -public class JavaImportVisitor extends JavaVisitor{ +public class JavaImportVisitor extends JavaVisitor{ //TODO CONCAT PREDICATE diff --git a/src/dev/peerat/parser/java/visitor/JavaInterfaceVisitor.java b/src/dev/peerat/parser/java/visitor/JavaInterfaceVisitor.java index 88fadb0..ef0b872 100644 --- a/src/dev/peerat/parser/java/visitor/JavaInterfaceVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaInterfaceVisitor.java @@ -3,7 +3,7 @@ package dev.peerat.parser.java.visitor; import dev.peerat.parser.java.Interface; import dev.peerat.parser.visitor.VisitorBag; -public class JavaInterfaceVisitor extends JavaVisitor{ +public class JavaInterfaceVisitor extends JavaVisitor{ public JavaInterfaceVisitor(boolean propagate){ super(Interface.class, propagate); diff --git a/src/dev/peerat/parser/java/visitor/JavaModifiableVisitor.java b/src/dev/peerat/parser/java/visitor/JavaModifiableVisitor.java index 1ed8849..bd736ba 100644 --- a/src/dev/peerat/parser/java/visitor/JavaModifiableVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaModifiableVisitor.java @@ -5,7 +5,7 @@ import java.util.function.Predicate; import dev.peerat.parser.java.JavaElement; import dev.peerat.parser.visitor.Visitor; -public abstract class JavaModifiableVisitor extends JavaVisitor{ +public abstract class JavaModifiableVisitor extends JavaVisitor{ protected Predicate modifierFilter; protected Visitor annotationVisitor; //TODO possibility to combine visitor too diff --git a/src/dev/peerat/parser/java/visitor/JavaVisitor.java b/src/dev/peerat/parser/java/visitor/JavaVisitor.java index 0f50ee6..9bd1469 100644 --- a/src/dev/peerat/parser/java/visitor/JavaVisitor.java +++ b/src/dev/peerat/parser/java/visitor/JavaVisitor.java @@ -14,44 +14,14 @@ import dev.peerat.parser.java.visitor.value.JavaStaticValueVisitor; import dev.peerat.parser.java.visitor.value.JavaTriValueVisitor; import dev.peerat.parser.java.visitor.value.JavaValueVisitor; import dev.peerat.parser.java.visitor.value.JavaVariableAccessValueVisitor; +import dev.peerat.parser.visitor.TokenVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; -public abstract class JavaVisitor extends Visitor{ - - //TODO current system don't do litteraly ALL, juste DIRECT SUB ELEMENT - - public static JavaVisitor base(Visitor visitor){ - return new JavaVisitor(null,true){ - - @Override - public boolean canVisit(Class type){ -// System.out.println("base can visit ? "+type); - return visitor.canVisit(type); - } - - @Override - public VisitorBag visitElement(T element){ - return visitor.visit(element); - } - }; - } - - private static JavaVisitor javaElement(boolean propagate){ - return new JavaVisitor(JavaElement.class, propagate){ +public abstract class JavaVisitor extends Visitor{ - @Override - public VisitorBag visitElement(JavaElement element){ - VisitorBag bag = new VisitorBag(); - bag.compute(element); - return bag; - } - - }; - } - - public static JavaVisitor allJavaElement(){ - return javaElement(true); + public static JavaElementVisitor allJavaElement(){ + return new JavaElementVisitor(true); } public static JavaFileVisitor allFile(){ @@ -153,8 +123,8 @@ public abstract class JavaVisitor extends Visitor javaElement(){ - return javaElement(false); + public static JavaElementVisitor javaElement(){ + return new JavaElementVisitor(false); } public static JavaFileVisitor file(){ @@ -251,6 +221,7 @@ public abstract class JavaVisitor extends Visitor type; private boolean propagate; + protected TokenVisitor tokenVisitor; public JavaVisitor(Class type, boolean propagate){ this.type = type; @@ -268,10 +239,25 @@ public abstract class JavaVisitor extends Visitor{ +public class JavaOperationVisitor extends JavaVisitor{ public JavaOperationVisitor(boolean propagate){ super(Operation.class, propagate); diff --git a/src/dev/peerat/parser/java/visitor/value/JavaArrayAccessValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaArrayAccessValueVisitor.java index 0c9cc2a..12eb898 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaArrayAccessValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaArrayAccessValueVisitor.java @@ -7,7 +7,7 @@ import dev.peerat.parser.visitor.Operator; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaArrayAccessValueVisitor extends JavaVisitor{ +public class JavaArrayAccessValueVisitor extends JavaVisitor{ private Visitor basePredicate; private Visitor accessPredicate; diff --git a/src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java index ba2d056..b533514 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaArrayValueVisitor.java @@ -4,7 +4,7 @@ import dev.peerat.parser.java.value.ArrayValue; import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.java.visitor.JavaVisitor; -public class JavaArrayValueVisitor extends JavaVisitor { +public class JavaArrayValueVisitor extends JavaVisitor { public JavaArrayValueVisitor(boolean propagate){ super(ArrayValue.class, propagate); diff --git a/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java index 6a45abb..1eab0c6 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaBiValueVisitor.java @@ -9,7 +9,7 @@ import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaBiValueVisitor extends JavaVisitor { +public class JavaBiValueVisitor extends JavaVisitor { private Visitor leftPredicate; private Predicate actionPredicate; diff --git a/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java index f206262..df8fb2f 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaCastValueVisitor.java @@ -7,7 +7,7 @@ import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.java.value.Value; import java.util.function.Predicate; -public class JavaCastValueVisitor extends JavaVisitor { +public class JavaCastValueVisitor extends JavaVisitor { private Predicate typePredicate; private Visitor valuePredicate; diff --git a/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java index b8d2d93..eb3d663 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaInstanceValueVisitor.java @@ -6,7 +6,7 @@ import dev.peerat.parser.java.value.InstanceValue; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaInstanceValueVisitor extends JavaVisitor { +public class JavaInstanceValueVisitor extends JavaVisitor { private Predicate namePredicate; diff --git a/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java index 73f6588..26b7432 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaLambdaValueVisitor.java @@ -2,7 +2,7 @@ package dev.peerat.parser.java.visitor.value; import dev.peerat.parser.java.value.LambdaValue; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaLambdaValueVisitor extends JavaVisitor{ +public class JavaLambdaValueVisitor extends JavaVisitor{ public JavaLambdaValueVisitor(boolean propagate){ super(LambdaValue.class, propagate); diff --git a/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java index 452dffc..fb3e777 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaMethodCallValueVisitor.java @@ -6,7 +6,7 @@ import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.Token; import java.util.function.Predicate; -public class JavaMethodCallValueVisitor extends JavaVisitor{ +public class JavaMethodCallValueVisitor extends JavaVisitor{ public JavaMethodCallValueVisitor(boolean propagate){ super(MethodCallValue.class, propagate); } diff --git a/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java index ef8fa2e..eaf27ee 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaModifierValueVisitor.java @@ -7,7 +7,7 @@ import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.java.value.Value; import java.util.function.Predicate; -public class JavaModifierValueVisitor extends JavaVisitor { +public class JavaModifierValueVisitor extends JavaVisitor { private Predicate modifierPredicate; private Visitor valuePredicate; diff --git a/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java index 214082d..7498846 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaStaticValueVisitor.java @@ -6,7 +6,7 @@ import dev.peerat.parser.java.value.StaticValue; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaStaticValueVisitor extends JavaVisitor { +public class JavaStaticValueVisitor extends JavaVisitor { private Predicate tokenPredicate; public JavaStaticValueVisitor(boolean propagate) { diff --git a/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java index bd7ba9e..90e3a94 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaTriValueVisitor.java @@ -6,7 +6,7 @@ import dev.peerat.parser.visitor.VisitorBag; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.java.value.Value; -public class JavaTriValueVisitor extends JavaVisitor { +public class JavaTriValueVisitor extends JavaVisitor { private Visitor checkPredicate; private Visitor successPredicate; private Visitor failPredicate; diff --git a/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java index 18fb5fe..a82bdee 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaValueVisitor.java @@ -4,7 +4,7 @@ import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaValueVisitor extends JavaVisitor{ +public class JavaValueVisitor extends JavaVisitor{ public JavaValueVisitor(boolean propagate){ super(Value.class, propagate); @@ -12,6 +12,8 @@ public class JavaValueVisitor extends JavaVisitor{ @Override public VisitorBag visitElement(Value element){ - return null; + VisitorBag bag = new VisitorBag(); + bag.compute(element); + return bag; } } \ No newline at end of file diff --git a/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java b/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java index 98de71b..ec9bfef 100644 --- a/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java +++ b/src/dev/peerat/parser/java/visitor/value/JavaVariableAccessValueVisitor.java @@ -4,7 +4,7 @@ import dev.peerat.parser.java.value.VariableAccessValue; import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.VisitorBag; -public class JavaVariableAccessValueVisitor extends JavaVisitor { +public class JavaVariableAccessValueVisitor extends JavaVisitor { public JavaVariableAccessValueVisitor(boolean propagate) { super(VariableAccessValue.class, propagate); } diff --git a/src/dev/peerat/parser/visitor/Example.java b/src/dev/peerat/parser/visitor/Example.java index e1d955d..c4ea5cc 100644 --- a/src/dev/peerat/parser/visitor/Example.java +++ b/src/dev/peerat/parser/visitor/Example.java @@ -1,16 +1,13 @@ package dev.peerat.parser.visitor; -import static dev.peerat.parser.java.visitor.JavaVisitor.*; -import static dev.peerat.parser.visitor.Operator.*; +import static dev.peerat.parser.java.visitor.JavaVisitor.allClass; +import static dev.peerat.parser.java.visitor.JavaVisitor.allJavaElement; +import static dev.peerat.parser.visitor.Operator.collect; +import static dev.peerat.parser.visitor.Visitor.token; -import java.util.List; -import java.util.Map; - -import dev.peerat.parser.java.Import; import dev.peerat.parser.java.JavaFile; import dev.peerat.parser.java.JavaParser; import dev.peerat.parser.java.JavaProject; -import dev.peerat.parser.java.Class; public class Example { @@ -18,15 +15,18 @@ public class Example { JavaParser parser = new JavaParser(); JavaFile container = new JavaFile(); - parser.parse("package dev.peerat.test; import a; import b; public class C{} public class D{}", + parser.parse("package dev.peerat.test; import a; import b; public class C{ public class D{ public void test(){} } } public class E{}", container); JavaProject project = new JavaProject(); project.addFile(container); - System.out.println(project.visit( - allFile().clazz(key(allClass())).imp(value(allImport())) - ).toList()); + project.visit( + collect(allClass()) + ).toList().stream().map((c) -> c.getName().getValue()).forEach(System.out::println); + + + System.out.println(container.visit(collect(allJavaElement().token(token().validate((token) -> token.getValue().equals("test"))))).toList()); // Map> map = project.visit( // and( diff --git a/src/dev/peerat/parser/visitor/TokenVisitor.java b/src/dev/peerat/parser/visitor/TokenVisitor.java index 90b8e67..49a7238 100644 --- a/src/dev/peerat/parser/visitor/TokenVisitor.java +++ b/src/dev/peerat/parser/visitor/TokenVisitor.java @@ -7,6 +7,7 @@ import dev.peerat.parser.TokenType; public class TokenVisitor extends Visitor{ + private Predicate token; private Predicate name; private Predicate type; private Predicate line; @@ -47,11 +48,17 @@ public class TokenVisitor extends Visitor{ this.character = predicate; return this; } + + public TokenVisitor validate(Predicate predicate){ + this.token = predicate; + return this; + } @Override public VisitorBag visit(Token element){ VisitorBag bag = new VisitorBag(); + if(this.token != null && !this.token.test(element)) return bag; 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; diff --git a/src/dev/peerat/parser/visitor/Visitor.java b/src/dev/peerat/parser/visitor/Visitor.java index 6d1524a..539aff5 100644 --- a/src/dev/peerat/parser/visitor/Visitor.java +++ b/src/dev/peerat/parser/visitor/Visitor.java @@ -2,15 +2,13 @@ package dev.peerat.parser.visitor; import java.util.Collection; -import dev.peerat.parser.Token; - public abstract class Visitor{ - public static Visitor allToken(){ + public static TokenVisitor allToken(){ return new TokenVisitor(true); } - public static Visitor token(){ + public static TokenVisitor token(){ return new TokenVisitor(false); } diff --git a/src/dev/peerat/parser/visitor/VisitorBag.java b/src/dev/peerat/parser/visitor/VisitorBag.java index 6239749..643b03a 100644 --- a/src/dev/peerat/parser/visitor/VisitorBag.java +++ b/src/dev/peerat/parser/visitor/VisitorBag.java @@ -18,13 +18,18 @@ public class VisitorBag{ this.collect = new ArrayList<>(0); } + @Override + public String toString(){ + return "[VisitorBag computed:"+computed+", collect:"+collect+"]"; + } + 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 = VALIDATED_BAG; + if(this.computed == null && bag.isValidated()) this.computed = VALIDATED_BAG; } public Object computed(){ diff --git a/test/dev/peerat/parser/java/ValueTypesTests.java b/test/dev/peerat/parser/java/ValueTypesTests.java index 231bb29..32b4c77 100644 --- a/test/dev/peerat/parser/java/ValueTypesTests.java +++ b/test/dev/peerat/parser/java/ValueTypesTests.java @@ -3,8 +3,8 @@ package dev.peerat.parser.java; import static org.junit.Assert.assertNull; import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.List; -import java.util.function.Function; +import java.util.Collection; +import java.util.function.Predicate; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -12,6 +12,7 @@ import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import dev.peerat.parser.Parser; +import dev.peerat.parser.SyntaxMissMatchException; import dev.peerat.parser.java.tree.JavaTreeType; import dev.peerat.parser.java.value.ArrayAccessValue; import dev.peerat.parser.java.value.ArrayValue; @@ -26,7 +27,6 @@ import dev.peerat.parser.java.value.TriValue; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.java.value.Value.ValueContainer; import dev.peerat.parser.java.value.VariableAccessValue; -import dev.peerat.parser.java.visitor.JavaVisitor; import dev.peerat.parser.visitor.Visitor; import dev.peerat.parser.visitor.VisitorBag; @@ -46,7 +46,7 @@ public class ValueTypesTests { return container.getValue(); } - private static class Container extends JavaElement implements ValueContainer{ + private static class Container implements JavaElement, ValueContainer{ private Value value; @@ -60,10 +60,13 @@ public class ValueTypesTests { } @Override - public E find(Function finder){return null;} - + public E find(Predicate finder) { + return null; + } + @Override - public void findAll(Function finder, List list){} + public void findAll(Predicate finder, Collection collector) { + } @Override public VisitorBag visit(Visitor visitor){return null;} @@ -366,4 +369,23 @@ public class ValueTypesTests { dev.peerat.parser.java.Function func = assertInstance(v.getElements().get(0), dev.peerat.parser.java.Function.class); assertEquals(1, func.getAnnotations().size()); } + + @Test + public void onRandomTest() throws Exception{ + try{ + System.out.println(parse("def_anno_base.then((validator) -> validator.validate((token) -> token.getValue().equals(\"{\")))\r\n" + + " .end((parent, bag) -> {\r\n" + + " AnnotationClass current = new AnnotationClass((((AnnotableBuffer) parent).getAnnotationBuffer()),\r\n" + + " bag.get(\"modifier\") == null ? 0 : bag.get(\"modifier\"),\r\n" + + " bag.get(\"name\"));\r\n" + + " if (parent instanceof ClassContainer)\r\n" + + " ((ClassContainer) parent).addClass(current);\r\n" + + " return current;\r\n" + + " }).multiple(clazz_container)\r\n" + + " .unique((validator) -> validator.validate((token) -> token.getValue().equals(\"}\"))).end((a, b) -> a)")); + }catch(SyntaxMissMatchException e){ + System.out.println(e.locateEndOfParsing()); + throw e; + } + } }