summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/elements/DependantRuleReference.java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-05-29 19:15:57 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-05-29 19:15:57 -0300
commite7c2ce4ba9bd684a6722baf9ce58e91dfacc8eb3 (patch)
tree1cd57eb89854d557e410663bd3e8387ca9a28969 /src/main/java/bjc/rgens/parser/elements/DependantRuleReference.java
parentfe9799607f6b2f256a94ff8357ac1dbde001974a (diff)
Refactor to split RuleCaseElement
The various types of RuleCaseElement are now their own things.
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/DependantRuleReference.java')
-rw-r--r--src/main/java/bjc/rgens/parser/elements/DependantRuleReference.java48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/DependantRuleReference.java b/src/main/java/bjc/rgens/parser/elements/DependantRuleReference.java
new file mode 100644
index 0000000..5eccf8e
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/elements/DependantRuleReference.java
@@ -0,0 +1,48 @@
+package bjc.rgens.parser.elements;
+
+import bjc.rgens.parser.GrammarException;
+import bjc.rgens.parser.GenerationState;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DependantRuleReference extends RuleCaseElement {
+ private static Pattern NAMEVAR_PATTERN = Pattern.compile("\\$(\\w+)");
+
+ public DependantRuleReference(String vl) {
+ super(vl, ReferenceType.DEPENDENT);
+ }
+
+ @Override
+ public void generate(GenerationState state) {
+ String refBody = val.substring(1, val.length() - 1);
+
+ /* Handle dependent rule names. */
+ StringBuffer nameBuffer = new StringBuffer();
+
+ Matcher nameMatcher = NAMEVAR_PATTERN.matcher(refBody);
+
+ while (nameMatcher.find()) {
+ String var = nameMatcher.group(1);
+
+ if (!state.vars.containsKey(var)) {
+ String msg = String.format("No variable '%s' defined", var);
+ throw new GrammarException(msg);
+ }
+
+ String name = state.vars.get(var);
+
+ if (name.contains(" ")) {
+ throw new GrammarException("Variables substituted into names cannot contain spaces");
+ } else if (name.equals("")) {
+ throw new GrammarException("Variables substituted into names cannot be empty");
+ }
+
+ nameMatcher.appendReplacement(nameBuffer, name);
+ }
+
+ nameMatcher.appendTail(nameBuffer);
+
+ doGenerate(String.format("[%s]", nameBuffer.toString()), state);
+ }
+}