summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-07 20:37:51 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-07 20:37:51 -0300
commit44a8d9d2d56a311293ec86ea40df7126748300a1 (patch)
treecc53c34a97a403ddb4a8d112f09124ee42c4507a /src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java
parent7422af49fa5c4da57323abe676a99468d401c44b (diff)
Refactoring
The main refactoring here is removing the type field from the various classes, but there are a few other smaller ones. This also contains the grounds for a refactoring on variable use
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java')
-rw-r--r--src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java
new file mode 100644
index 0000000..7a4260f
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java
@@ -0,0 +1,59 @@
+package bjc.rgens.parser.elements.vars;
+
+import bjc.rgens.parser.GenerationState;
+import bjc.rgens.parser.GrammarException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class VariableElement {
+ public abstract void generate(GenerationState state);
+
+ public static List<VariableElement> parseVariableElements(String varElm) {
+ boolean forbidSpaces = varElm.contains("-");
+
+ String[] parts;
+
+ if(forbidSpaces) {
+ parts = varElm.split("(?<=[+-])|(?=[+-])");
+ } else {
+ parts = new String[] { varElm };
+ }
+
+ return parseVariableElements(forbidSpaces, parts);
+ }
+
+ public static List<VariableElement> parseVariableElements(boolean forbidSpaces, String... parts) {
+ List<VariableElement> elms = new ArrayList<>(parts.length);
+
+ VariableElement prevElement = null;
+
+ for (String part : parts) {
+ VariableElement elm = null;
+
+ if(part.startsWith("$")) {
+ elm = new VRefVariableElement(forbidSpaces, part.substring(1));
+ } else if (part.startsWith("@")) {
+ elm = new ARefVariableElement(forbidSpaces, part.substring(1));
+ } else if (part.startsWith("%")) {
+ elm = new RRefVariableElement(forbidSpaces, part.substring(1));
+ } else if (part.startsWith("/")) {
+ throw new GrammarException("Template variables aren't implemented yet");
+ } else {
+ if(prevElement instanceof LiteralVariableElement) {
+ /* Aggregate chain literals together */
+ ((LiteralVariableElement)prevElement).val += elm;
+ } else {
+ elm = new LiteralVariableElement(part);
+ }
+ }
+
+ if(elm != null) {
+ elms.add(elm);
+ prevElement = elm;
+ }
+ }
+
+ return elms;
+ }
+}