Added possibility to skip token stream until the end
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / string / tokenizer / Tokenizer.java
index 722e17a..c80aeb1 100755 (executable)
@@ -19,21 +19,22 @@ import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrat
 
 public class Tokenizer {
 
-    final Stack<Integer> tokenIndexes = new Stack<>();
+    private final Stack<Integer> tokenIndexes = new Stack<>();
     private final List<Terminator> terminators = new ArrayList<>();
     private String source;
     private int currentIndex = 0;
 
-    int cachedTerminatorIndex = -1;
-    Terminator cachedTerminator;
+    private int cachedTerminatorIndex = -1;
+    private Terminator cachedTerminator;
 
     public Tokenizer(final String source) {
         this.source = source;
     }
 
-    public Tokenizer(){}
+    public Tokenizer() {
+    }
 
-    public Tokenizer setSource(String source){
+    public Tokenizer setSource(String source) {
         this.source = source;
         currentIndex = 0;
         tokenIndexes.clear();
@@ -64,15 +65,14 @@ public class Tokenizer {
     }
 
 
-
     public TokenizerMatch getNextToken() throws InvalidSyntaxException {
         tokenIndexes.push(currentIndex);
 
         StringBuilder tokenAccumulator = new StringBuilder();
 
-        while (true){
+        while (true) {
 
-            if (currentIndex >= source.length()){ // reached end of input
+            if (currentIndex >= source.length()) { // reached end of input
                 if (hasAccumulatedToken(tokenAccumulator))
                     return new TokenizerMatch(tokenAccumulator.toString(), null, null);
                 else
@@ -89,7 +89,7 @@ public class Tokenizer {
 
             if (terminator.termination == PRESERVE)
                 return buildPreservedToken(tokenAccumulator, terminator);
-            else if (terminator.termination == DROP){
+            else if (terminator.termination == DROP) {
                 skipUntilTerminatorEnd(terminator);
 
                 if (hasAccumulatedToken(tokenAccumulator))
@@ -147,7 +147,7 @@ public class Tokenizer {
         return getOrFindTokenTerminator() == null;
     }
 
-    public boolean hasMoreTokens(){
+    public boolean hasMoreTokens() {
         return currentIndex < source.length();
     }
 
@@ -184,18 +184,23 @@ public class Tokenizer {
         return result;
     }
 
-    public boolean peekIsOneOf(String ... possibilities) throws InvalidSyntaxException {
+    public boolean peekIsOneOf(String... possibilities) throws InvalidSyntaxException {
         String nextToken = peekNextToken().token;
         return Stream.of(possibilities).anyMatch(possibility -> possibility.equals(nextToken));
     }
 
-    public void peekExpectNoneOf(String ... possibilities) throws InvalidSyntaxException {
+    public void peekExpectNoneOf(String... possibilities) throws InvalidSyntaxException {
         if (peekIsOneOf(possibilities))
             throw new InvalidSyntaxException("Not expected \"" + peekNextToken().token + "\" here.");
     }
-    
+
     public void unreadToken() {
         currentIndex = tokenIndexes.pop();
     }
 
+    public void skipUntilDataEnd() {
+        tokenIndexes.push(currentIndex);
+        currentIndex = source.length();
+    }
+
 }