summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/Define.java
diff options
context:
space:
mode:
authorbjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu>2017-03-01 10:13:41 -0500
committerbjculkin <bjculkin@WIT-136XG42.wvu-ad.wvu.edu>2017-03-01 10:13:41 -0500
commit36e0911c6ec27707a74f0b90b1052a16374243ea (patch)
tree08ca7723b0c0a6a7f3ce1830c59e5211e46168b8 /dice-lang/src/bjc/dicelang/Define.java
parent6ed83507953322c35a456d64d89f8f4f9cb0a6a1 (diff)
Package reorganization
Diffstat (limited to 'dice-lang/src/bjc/dicelang/Define.java')
-rw-r--r--dice-lang/src/bjc/dicelang/Define.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/dice-lang/src/bjc/dicelang/Define.java b/dice-lang/src/bjc/dicelang/Define.java
new file mode 100644
index 0000000..2967af6
--- /dev/null
+++ b/dice-lang/src/bjc/dicelang/Define.java
@@ -0,0 +1,125 @@
+package bjc.dicelang;
+
+import bjc.utils.data.CircularIterator;
+
+import static bjc.dicelang.Errors.ErrorKey.*;
+
+import java.util.Iterator;
+import java.util.function.UnaryOperator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+public class Define implements UnaryOperator<String> {
+ public static enum Type { LINE, TOKEN }
+
+ public static final int MAX_RECURS = 10;
+
+ public final int priority;
+ public final boolean inError;
+
+ private boolean doRecur;
+ private boolean subType;
+
+ private Pattern predicate;
+ private Pattern searcher;
+
+ private Iterator<String> replacers;
+ private String replacer;
+
+ public Define(int priorty,
+ boolean isSub, boolean recur, boolean isCircular,
+ String predicte, String searchr, Iterable<String> replacrs) {
+ priority = priorty;
+ doRecur = recur;
+ subType = isSub;
+
+ if(predicte != null) {
+ try {
+ predicate = Pattern.compile(predicte);
+ } catch (PatternSyntaxException psex) {
+ Errors.inst.printError(EK_DFN_PREDSYN, psex.getMessage());
+ inError = true;
+ return;
+ }
+ }
+
+ try {
+ searcher = Pattern.compile(searchr);
+ } catch (PatternSyntaxException psex) {
+ Errors.inst.printError(EK_DFN_SRCSYN, psex.getMessage());
+ inError = true;
+ return;
+ }
+
+ inError = false;
+
+ if(subType) {
+ if(replacrs.iterator().hasNext()) {
+ replacers = new CircularIterator<>(replacrs, isCircular);
+ } else {
+ replacers = null;
+ }
+ } else {
+ Iterator<String> itr = replacrs.iterator();
+
+ if(itr.hasNext()) replacer = itr.next();
+ else replacer = "";
+ }
+ }
+
+ public String apply(String tok) {
+ if(inError) return tok;
+
+ if(predicate != null) {
+ if(!predicate.matcher(tok).matches()) {
+ return tok;
+ }
+ }
+
+ String strang = doPass(tok);
+
+ if(doRecur) {
+ int recurCount = 0;
+
+ if(strang.equals(tok)) {
+ return strang;
+ } else {
+ String oldStrang = strang;
+
+ do {
+ strang = doPass(tok);
+ recurCount += 1;
+ } while(!strang.equals(oldStrang) && recurCount < MAX_RECURS);
+
+ if(recurCount >= MAX_RECURS) {
+ Errors.inst.printError(EK_DFN_RECUR, Integer.toString(MAX_RECURS), tok, strang);
+ return strang;
+ }
+ }
+ }
+
+ 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 {
+ String replac = replacers.next();
+ searcherMatcher.appendReplacement(sb, replac);
+ }
+ }
+
+ searcherMatcher.appendTail(sb);
+ return sb.toString();
+ } else {
+ return searcherMatcher.replaceAll(replacer);
+ }
+ }
+}