diff options
| author | bculkin2442 <bjculkin@mix.wvu.edu> | 2017-02-16 08:36:43 -0500 |
|---|---|---|
| committer | bculkin2442 <bjculkin@mix.wvu.edu> | 2017-02-16 08:36:43 -0500 |
| commit | f9752a872ad68a47b872eccb953332d372052cac (patch) | |
| tree | cb315abfb68c00cc6b2a3b6e6ca4072f4e2305e8 /dice-lang/src/bjc/dicelang/v2/Define.java | |
| parent | 0c3270b408116d3a8d2f1558acb4222eaa808e7b (diff) | |
Preprocessor and better strings
Diffstat (limited to 'dice-lang/src/bjc/dicelang/v2/Define.java')
| -rw-r--r-- | dice-lang/src/bjc/dicelang/v2/Define.java | 93 |
1 files changed, 93 insertions, 0 deletions
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<String> { + public static enum Type { + LINE, TOKEN + } + + int priority; + + boolean doRecur; + boolean subType; + + Pattern predicate; + Pattern searcher; + + Iterator<String> replacers; + String replacer; + + public Define(int priorty, boolean isSub, boolean recur, + String predicte, String searchr, Iterable<String> 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<String> 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); + } + } +} |
