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.java48
1 files changed, 38 insertions, 10 deletions
diff --git a/dice-lang/src/bjc/dicelang/v2/Define.java b/dice-lang/src/bjc/dicelang/v2/Define.java
index 2ecbc69..3ee2f37 100644
--- a/dice-lang/src/bjc/dicelang/v2/Define.java
+++ b/dice-lang/src/bjc/dicelang/v2/Define.java
@@ -4,15 +4,21 @@ import bjc.utils.data.CircularIterator;
import java.util.Iterator;
import java.util.function.UnaryOperator;
-import java.util.regex.Pattern;
import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import static bjc.dicelang.v2.Errors.ErrorKey.*;
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;
@@ -31,9 +37,26 @@ public class Define implements UnaryOperator<String> {
subType = isSub;
if(predicte != null) {
- predicate = Pattern.compile(predicte);
+ 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;
}
- searcher = Pattern.compile(searchr);
+
+ inError = false;
if(subType) {
if(replacrs.iterator().hasNext()) {
@@ -50,6 +73,8 @@ public class Define implements UnaryOperator<String> {
}
public String apply(String tok) {
+ if(inError) return tok;
+
if(predicate != null) {
if(!predicate.matcher(tok).matches()) {
return tok;
@@ -59,6 +84,8 @@ public class Define implements UnaryOperator<String> {
String strang = doPass(tok);
if(doRecur) {
+ int recurCount = 0;
+
if(strang.equals(tok)) {
return strang;
} else {
@@ -66,7 +93,14 @@ public class Define implements UnaryOperator<String> {
do {
strang = doPass(tok);
- } while(!strang.equals(oldStrang));
+
+ 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;
+ }
}
}
@@ -81,16 +115,10 @@ public class Define implements UnaryOperator<String> {
while(searcherMatcher.find()) {
if(replacers == null) {
- System.out.println("\t\tTRACE: running null replacer on substring "
- + tok.substring(searcherMatcher.start(), searcherMatcher.end()));
-
searcherMatcher.appendReplacement(sb,"");
} else {
String replac = replacers.next();
- System.out.println("\t\tTRACE: running replacer " + replac + " on substring "
- + tok.substring(searcherMatcher.start(), searcherMatcher.end()));
-
searcherMatcher.appendReplacement(sb, replacers.next());
}
}