summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/v2/Define.java
diff options
context:
space:
mode:
Diffstat (limited to 'dice-lang/src/bjc/dicelang/v2/Define.java')
-rw-r--r--dice-lang/src/bjc/dicelang/v2/Define.java93
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);
+ }
+ }
+}