From 1116d8450c0115ebb8a4201d130d2de6d5b1a107 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Wed, 5 Sep 2018 17:19:41 -0300 Subject: Simplify affix application This simplifies the internal way affixes are applied, as well as adding a new circumfix-with pragma --- .../java/bjc/rgens/parser/RGrammarBuilder.java | 26 +++++++++++-- src/main/java/bjc/rgens/parser/RGrammarParser.java | 44 ++++++++++++---------- 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 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 affixes, AffixType type) { + public void affixWith(String ruleName, IList 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 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 bits = StringUtils.levelSplit(body, " "); -- cgit v1.2.3