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 --- src/main/java/bjc/rgens/parser/RGrammarParser.java | 44 ++++++++++++---------- 1 file changed, 24 insertions(+), 20 deletions(-) (limited to 'src/main/java/bjc/rgens/parser/RGrammarParser.java') 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