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=ba1590db9e8152bf8f64e1072b708b9d960fb10e;hp=1905d9a14220c96783efcd1e2e7dfe589fce8127;hb=fac4a7627b6496ff15c113adf6eaf2929520c043;hpb=9bf004ce4e9b5edff36c65fcc8cc0f303390d7fc 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 1905d9a..ba1590d 100755 --- a/src/main/java/eu/svjatoslav/commons/string/tokenizer/Tokenizer.java +++ b/src/main/java/eu/svjatoslav/commons/string/tokenizer/Tokenizer.java @@ -1,6 +1,6 @@ /* * Svjatoslav Commons - shared library of common functionality. - * Copyright ©2012-2014, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * Copyright ©2012-2017, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu * * This program is free software; you can redistribute it and/or * modify it under the terms of version 3 of the GNU Lesser General Public License @@ -13,26 +13,37 @@ import java.util.ArrayList; import java.util.List; import java.util.Stack; +import static eu.svjatoslav.commons.string.tokenizer.Terminator.TerminationStrategy.DROP; + public class Tokenizer { final Stack tokenIndexes = new Stack<>(); private final List terminators = new ArrayList<>(); - private final String source; + private String source; private int currentIndex = 0; public Tokenizer(final String source) { this.source = source; } - public void addTerminator(final String startSequence, - final boolean ignoreTerminator) { - terminators.add(new Terminator(startSequence, ignoreTerminator)); + public Tokenizer(){} + + public Tokenizer setSource(String source){ + this.source = source; + currentIndex = 0; + return this; } - public void addTerminator(final String startSequence, - final String endSequence, final boolean ignoreTerminator) { - terminators.add(new Terminator(startSequence, endSequence, - ignoreTerminator)); + public Tokenizer addTerminator(final String startSequence, + final Terminator.TerminationStrategy terminationStrategy) { + terminators.add(new Terminator(startSequence, terminationStrategy)); + return this; + } + + public Tokenizer addTerminator(final String startSequence, + final String endSequence, final Terminator.TerminationStrategy terminationStrategy) { + terminators.add(new Terminator(startSequence, endSequence, terminationStrategy)); + return this; } public void expectNextToken(final String value) @@ -56,7 +67,7 @@ public class Tokenizer { for (final Terminator terminator : terminators) if (sequenceMatches(terminator.startSequence)) - if (terminator.ignoreTerminator) { + if (terminator.termination == DROP) { currentIndex += terminator.startSequence.length(); if (terminator.endSequence != null) @@ -85,7 +96,7 @@ public class Tokenizer { } - public boolean probeNextToken(final String token) { + public boolean consumeIfNextToken(final String token) { if (token.equals(getNextToken().token)) return true; @@ -93,6 +104,23 @@ public class Tokenizer { return false; } + public TokenizerMatch peekNextToken(){ + TokenizerMatch result = getNextToken(); + unreadToken(); + return result; + } + + public boolean peekIsOneOf(String [] ... possibilities){ + TokenizerMatch nextToken = peekNextToken(); + + for (String[] possibility : possibilities) + if (possibility.equals(nextToken)) + return true; + + return false; + } + + public boolean sequenceMatches(final String sequence) { if ((currentIndex + sequence.length()) > source.length()) return false;