From f9752a872ad68a47b872eccb953332d372052cac Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Thu, 16 Feb 2017 08:36:43 -0500 Subject: Preprocessor and better strings --- dice-lang/src/bjc/dicelang/v2/Define.java | 93 +++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 dice-lang/src/bjc/dicelang/v2/Define.java (limited to 'dice-lang/src/bjc/dicelang/v2/Define.java') diff --git a/dice-lang/src/bjc/dicelang/v2/Define.java b/dice-lang/src/bjc/dicelang/v2/Define.java new file mode 100644 index 0000000..4617931 --- /dev/null +++ b/dice-lang/src/bjc/dicelang/v2/Define.java @@ -0,0 +1,93 @@ +package bjc.dicelang.v2; + +import bjc.utils.data.CircularIterator; + +import java.util.Iterator; +import java.util.function.UnaryOperator; +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +public class Define implements UnaryOperator { + public static enum Type { + LINE, TOKEN + } + + int priority; + + boolean doRecur; + boolean subType; + + Pattern predicate; + Pattern searcher; + + Iterator replacers; + String replacer; + + public Define(int priorty, boolean isSub, boolean recur, + String predicte, String searchr, Iterable replacrs) { + priority = priorty; + doRecur = recur; + subType = isSub; + + if(predicte != null) { + predicate = Pattern.compile(predicte); + } + searcher = Pattern.compile(searchr); + + if(subType) { + if(replacrs.iterator().hasNext()) { + replacers = new CircularIterator<>(replacrs); + } else { + replacers = null; + } + } else { + Iterator itr = replacrs.iterator(); + + if(itr.hasNext()) replacer = itr.next(); + else replacer = ""; + } + } + + public String apply(String tok) { + if(predicate != null) { + if(!predicate.matcher(tok).matches()) { + return tok; + } + } + + String strang = doPass(tok); + + if(doRecur) { + if(strang.equals(tok)) { + return strang; + } else { + String oldStrang = strang; + + do { + strang = doPass(tok); + } while(!strang.equals(oldStrang)); + } + } + + return strang; + } + + private String doPass(String tok) { + Matcher searcherMatcher = searcher.matcher(tok); + + if(subType) { + StringBuffer sb = new StringBuffer(); + + while(searcherMatcher.find()) { + if(replacers == null) searcherMatcher.appendReplacement(sb,""); + else searcherMatcher.appendReplacement(sb, replacers.next()); + } + + searcherMatcher.appendTail(sb); + + return sb.toString(); + } else { + return searcherMatcher.replaceAll(replacer); + } + } +} -- cgit v1.2.3