X-Git-Url: http://www2.svjatoslav.eu/gitweb/?p=svjatoslav_commons.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fcommons%2Fstring%2Ftokenizer%2FTokenizer.java;h=cc2036949557778171a48380e1b991226518bb73;hp=b716989269dba2d37c586d17cda890b7de39ea1b;hb=67f7af91a79bc2ff50071389b6333a28755a4bff;hpb=37f0e9901f9ecaea7a28cba616e247415ebb9ea0 diff --git a/src/main/java/eu/svjatoslav/commons/string/tokenizer/Tokenizer.java b/src/main/java/eu/svjatoslav/commons/string/tokenizer/Tokenizer.java index b716989..cc20369 100755 --- a/src/main/java/eu/svjatoslav/commons/string/tokenizer/Tokenizer.java +++ b/src/main/java/eu/svjatoslav/commons/string/tokenizer/Tokenizer.java @@ -11,12 +11,22 @@ import java.util.stream.Stream; import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.DROP; import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.PRESERVE; +import static java.lang.System.out; public class Tokenizer { + /** + * Stack of token indexes. This allows to walk back in history and un-consume the token. + */ private final Stack tokenIndexes = new Stack<>(); + + /** + * Terminators that will be searched for by given tokenizer within given source string. + */ private final List terminators = new ArrayList<>(); - private String source; + + private String source; // string to be tokenized + private int currentIndex = 0; private int cachedTerminatorIndex = -1; @@ -45,6 +55,11 @@ public class Tokenizer { return this; } + public Tokenizer addTerminator(Terminator terminator) { + terminators.add(terminator); + return this; + } + public Tokenizer addTerminator(final String startSequence, final String endSequence, final Terminator.TerminationStrategy terminationStrategy) { terminators.add(new Terminator(startSequence, endSequence, terminationStrategy)); @@ -59,9 +74,7 @@ public class Tokenizer { + "\" but got \"" + match.token + "\" instead."); } - /** - * * @return next @TokenizerMatch or null if end of input is reached. * @throws InvalidSyntaxException */ @@ -154,7 +167,7 @@ public class Tokenizer { return getOrFindTokenTerminator() == null; } - public boolean hasMoreTokens() { + public boolean hasMoreContent() { return currentIndex < source.length(); } @@ -205,6 +218,26 @@ public class Tokenizer { currentIndex = tokenIndexes.pop(); } + /** + * For debugging + */ + public void enlistRemainingTokens(){ + int redTokenCount = 0; + + try { + while (hasMoreContent()) { + out.println(getNextToken().toString()); + redTokenCount++; + } + } catch (InvalidSyntaxException e){ + out.println("There is syntax exception"); + } + + // restore pointer to original location + for (int i = 0; i< redTokenCount; i++ ) unreadToken(); + } + + public void skipUntilDataEnd() { tokenIndexes.push(currentIndex); currentIndex = source.length();