X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fcommons%2Fstring%2Ftokenizer%2FTokenizer.java;h=e92ccd791ce88893ea49610dd4e21391731c8e71;hb=798a165906826270924f0d5d58cfa04cf6bdc113;hp=4855c188e57a48142a255db1deb0ac57f694125c;hpb=fb5f728420aaf7bd108d39db12e2fec8113f9e77;p=svjatoslav_commons.git 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 4855c18..e92ccd7 100755 --- a/src/main/java/eu/svjatoslav/commons/string/tokenizer/Tokenizer.java +++ b/src/main/java/eu/svjatoslav/commons/string/tokenizer/Tokenizer.java @@ -12,8 +12,10 @@ package eu.svjatoslav.commons.string.tokenizer; import java.util.ArrayList; import java.util.List; import java.util.Stack; +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; public class Tokenizer { @@ -31,6 +33,7 @@ public class Tokenizer { public Tokenizer setSource(String source){ this.source = source; currentIndex = 0; + tokenIndexes.clear(); return this; } @@ -46,7 +49,7 @@ public class Tokenizer { return this; } - public void expectNextToken(final String value) + public void expectAndConsumeNextToken(final String value) throws InvalidSyntaxException { final TokenizerMatch match = getNextToken(); if (!value.equals(match.token)) @@ -56,46 +59,52 @@ public class Tokenizer { public TokenizerMatch getNextToken() { tokenIndexes.push(currentIndex); - final StringBuilder result = new StringBuilder(); - - while (true) { - if (currentIndex >= source.length()) - return null; - - boolean accumulateCurrentChar = true; - - for (final Terminator terminator : terminators) - if (sequenceMatches(terminator.startSequence)) - - if (terminator.termination == DROP) { - currentIndex += terminator.startSequence.length(); - - if (terminator.endSequence != null) - skipUntilSequence(terminator.endSequence); - - if (result.length() > 0) - return new TokenizerMatch(result.toString(), - terminator); - else { - accumulateCurrentChar = false; - break; - } - } else if (result.length() > 0) - return new TokenizerMatch(result.toString(), terminator); - else { - currentIndex += terminator.startSequence.length(); - return new TokenizerMatch(terminator.startSequence, - terminator); - } - if (accumulateCurrentChar) { - result.append(source.charAt(currentIndex)); + StringBuilder token = new StringBuilder(); + + while (true){ + if (isTokenTermination()){ + Terminator tokenTerminator = findTokenTerminator(); + + if (tokenTerminator.termination == PRESERVE){ + if (hasAccumulatedToken(token)){ + // already assembled some token + return new TokenizerMatch(token.toString(), "", tokenTerminator); + } else { + currentIndex++; + return new TokenizerMatch(tokenTerminator.startSequence, "", tokenTerminator); + } + } else if (tokenTerminator.termination == DROP){ + if (hasAccumulatedToken(token)){ + currentIndex++; + return new TokenizerMatch(token.toString(), "", tokenTerminator); + } else { + currentIndex++; + } + } + } else { + token.append(source.charAt(currentIndex)); currentIndex++; } } } + private boolean hasAccumulatedToken(StringBuilder token) { + return token.length() > 0; + } + + private boolean isTokenTermination() { + return findTokenTerminator() != null; + } + + public Terminator findTokenTerminator() { + for (Terminator terminator : terminators) + if (terminator.matches(source, currentIndex)) + return terminator; + return null; + } + public boolean consumeIfNextToken(final String token) { if (token.equals(getNextToken().token)) return true; @@ -111,21 +120,13 @@ public class Tokenizer { } public boolean peekIsOneOf(String ... possibilities){ - TokenizerMatch nextToken = peekNextToken(); - - for (String possibility : possibilities) - if (possibility.equals(nextToken)) - return true; - - return false; + String nextToken = peekNextToken().token; + return Stream.of(possibilities).anyMatch(possibility -> possibility.equals(nextToken)); } public void peekExpectNoneOf(String ... possibilities) throws InvalidSyntaxException { - TokenizerMatch nextToken = peekNextToken(); - - for (String possibility : possibilities) - if (possibility.equals(nextToken)) - throw new InvalidSyntaxException("Not expected \"" + nextToken + "\" here."); + if (peekIsOneOf(possibilities)) + throw new InvalidSyntaxException("Not expected \"" + peekNextToken().token + "\" here."); }