summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc/utils/parserutils/splitter/TwoLevelSplitter.java
diff options
context:
space:
mode:
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc/utils/parserutils/splitter/TwoLevelSplitter.java')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/parserutils/splitter/TwoLevelSplitter.java110
1 files changed, 110 insertions, 0 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/splitter/TwoLevelSplitter.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/splitter/TwoLevelSplitter.java
new file mode 100644
index 0000000..38f303d
--- /dev/null
+++ b/BJC-Utils2/src/main/java/bjc/utils/parserutils/splitter/TwoLevelSplitter.java
@@ -0,0 +1,110 @@
+package bjc.utils.parserutils.splitter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Implementation of a splitter that runs in two passes.
+ *
+ * This is useful because {@link SimpleTokenSplitter} doesn't like handling both
+ * <= and = without mangling them.
+ *
+ * The first pass splits on compound operators, which are built up from simple
+ * operators.
+ *
+ * The second pass removes simple operators.
+ *
+ * @author EVE
+ *
+ */
+public class TwoLevelSplitter implements TokenSplitter {
+ private SimpleTokenSplitter high;
+ private SimpleTokenSplitter low;
+
+ /**
+ * Create a new two level splitter.
+ */
+ public TwoLevelSplitter() {
+ high = new SimpleTokenSplitter();
+ low = new SimpleTokenSplitter();
+ }
+
+ @Override
+ public String[] split(String inp) {
+ List<String> ret = new ArrayList<>();
+
+ String[] partials = high.split(inp);
+
+ for(String partial : partials) {
+ String[] finals = low.split(partial);
+
+ for(String fin : finals) {
+ ret.add(fin);
+ }
+ }
+
+ return ret.toArray(new String[ret.size()]);
+ }
+
+ /**
+ * Adds compound operators to split on.
+ *
+ * @param delims
+ * The compound operators to split on.
+ */
+ public void addCompoundDelim(String... delims) {
+ for(String delim : delims) {
+ high.addDelimiter(delim);
+
+ low.addNonMatcher(Pattern.quote(delim));
+ }
+ }
+
+ /**
+ * Adds simple operators to split on.
+ *
+ * @param delims
+ * The simple operators to split on.
+ */
+ public void addSimpleDelim(String... delims) {
+ for(String delim : delims) {
+ low.addDelimiter(delim);
+ }
+ }
+
+ /**
+ * Adds repeated compound operators to split on.
+ *
+ * @param delims
+ * The repeated compound operators to split on.
+ */
+ public void addCompoundMulti(String... delims) {
+ for(String delim : delims) {
+ high.addMultiDelimiter(delim);
+
+ low.addNonMatcher("(?:" + delim + ")+");
+ }
+ }
+
+ /**
+ * Adds simple compound operators to split on.
+ *
+ * @param delims
+ * The repeated simple operators to split on.
+ */
+ public void addSimpleMulti(String... delims) {
+ for(String delim : delims) {
+ low.addMultiDelimiter(delim);
+ }
+ }
+
+ /**
+ * Ready the splitter for use.
+ */
+ public void compile() {
+ high.compile();
+
+ low.compile();
+ }
+}