summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RGrammarBuilder.java26
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RGrammarParser.java44
2 files changed, 46 insertions, 24 deletions
diff --git a/src/main/java/bjc/rgens/parser/RGrammarBuilder.java b/src/main/java/bjc/rgens/parser/RGrammarBuilder.java
index f1d0938..1bc849b 100755
--- a/src/main/java/bjc/rgens/parser/RGrammarBuilder.java
+++ b/src/main/java/bjc/rgens/parser/RGrammarBuilder.java
@@ -179,20 +179,38 @@ public class RGrammarBuilder {
affixWith(ruleName, prefixes, AffixType.PREFIX);
}
- private static enum AffixType {
+ /**
+ * Prefix and suffix a given case element to every case of a specific rule.
+ *
+ * @param ruleName
+ * The rule to prefix and suffix.
+ *
+ * @param prefix
+ * The prefix/suffix to add.
+ *
+ * @throws IllegalArgumentException
+ * If the rule name is either invalid or not defined by this
+ * grammar, or if the prefix/suffix is invalid.
+ */
+ public void circumfixWith(String ruleName, IList<CaseElement> prefixes) {
+ affixWith(ruleName, prefixes, AffixType.CIRCUMFIX);
+ }
+
+ public static enum AffixType {
+ CIRCUMFIX,
SUFFIX,
PREFIX;
public boolean isSuffix() {
- return this == SUFFIX;
+ return this != PREFIX;
}
public boolean isPrefix() {
- return this == PREFIX;
+ return this != SUFFIX;
}
}
- private void affixWith(String ruleName, IList<CaseElement> affixes, AffixType type) {
+ public void affixWith(String ruleName, IList<CaseElement> affixes, AffixType type) {
if (ruleName == null) {
throw new NullPointerException("Rule name must not be null");
} else if (ruleName.equals("")) {
diff --git a/src/main/java/bjc/rgens/parser/RGrammarParser.java b/src/main/java/bjc/rgens/parser/RGrammarParser.java
index ba1bd8d..3fe4886 100755
--- a/src/main/java/bjc/rgens/parser/RGrammarParser.java
+++ b/src/main/java/bjc/rgens/parser/RGrammarParser.java
@@ -25,6 +25,7 @@ import java.util.Map;
import java.util.Set;
import static bjc.rgens.parser.RGrammarLogging.*;
+import static bjc.rgens.parser.RGrammarBuilder.AffixType;
/**
* Reads {@link RGrammar} from a input stream.
*
@@ -182,30 +183,17 @@ public class RGrammarParser {
//build.regexizeRule(name, patt);
});
- pragmas.put("suffix-with", (body, build, level) -> {
- int idx = body.indexOf(" ");
-
- if (idx == -1) {
- String msg = "Suffix-with pragma takes at least two arguments, the name of the rule to suffix, then what to suffix it with\n\tThis can be more than one token, to get them suffixed as a group";
-
- throw new GrammarException(msg);
- }
-
- build.suffixWith(body.substring(0, idx), parseElementString(body.substring(idx + 1)).getLeft());
- });
-
pragmas.put("prefix-with", (body, build, level) -> {
- int idx = body.indexOf(" ");
-
- if (idx == -1) {
- String msg = "Prefix-with pragma takes at least two arguments, the name of the rule to prefix, then what to prefix it with\n\tThis can be more than one token, to get them prefixed as a group";
-
- throw new GrammarException(msg);
- }
+ doAffixWith(body, build, level, AffixType.PREFIX);
+ });
- build.prefixWith(body.substring(0, idx), parseElementString(body.substring(idx + 1)).getLeft());
+ pragmas.put("suffix-with", (body, build, level) -> {
+ doAffixWith(body, build, level, AffixType.SUFFIX);
});
+ pragmas.put("circumfix-with", (body, build, level) -> {
+ doAffixWith(body, build, level, AffixType.CIRCUMFIX);
+ });
/*
* @NOTE 9/4/18
*
@@ -254,6 +242,22 @@ public class RGrammarParser {
});
}
+ private static void doAffixWith(String body, RGrammarBuilder build, int level, AffixType afxType) {
+ int idx = body.indexOf(" ");
+
+ if (idx == -1) {
+ String msg = "Affixing pragma %s-with takes at least two arguments, the name of the rule to affix, then what to affix it with\n\tThis can be more than one token, to get them affixed as a group";
+
+ throw new GrammarException(String.format(msg, afxType.toString().toLowerCase()));
+ }
+
+ String rName = body.substring(0, idx);
+
+ IList<CaseElement> elms = parseElementString(body.substring(idx + 1)).getLeft();
+
+ build.affixWith(rName, elms, afxType);
+ }
+
private static void doAutoVar(String body, RGrammarBuilder build, int level, boolean isRule) {
List<String> bits = StringUtils.levelSplit(body, " ");