diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-06-08 19:06:14 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-06-08 19:06:14 -0300 |
| commit | 33a165f0b0055d2bdf9a1fcaa639b31a7f87d9a6 (patch) | |
| tree | b208a7cd5b3c73ac13ba63a71b32059b90eb3275 /src/main/java/bjc/rgens/parser/elements/vars | |
| parent | 44a8d9d2d56a311293ec86ea40df7126748300a1 (diff) | |
Major refactoring
A major refactoring to the internals of how things work. I believe that
nothing is broken
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/vars')
6 files changed, 33 insertions, 30 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java index 7a8910c..a4bb730 100644 --- a/src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java +++ b/src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java @@ -7,9 +7,9 @@ import bjc.rgens.parser.Rule; public class ARefVariableElement extends VariableElement { public String value; - private boolean forbidSpaces; + public ARefVariableElement(String val) { + super(false); - public ARefVariableElement(boolean forbidSpaces, String val) { value = val; } @@ -26,10 +26,6 @@ public class ARefVariableElement extends VariableElement { String res = newState.contents.toString(); - if(forbidSpaces && res.contains(" ")) { - throw new GrammarException("Spaces not allowed in this context (rule-var %s)"); - } - state.contents.append(res); } } diff --git a/src/main/java/bjc/rgens/parser/elements/vars/LiteralVariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/LiteralVariableElement.java index 080f849..cf33c66 100644 --- a/src/main/java/bjc/rgens/parser/elements/vars/LiteralVariableElement.java +++ b/src/main/java/bjc/rgens/parser/elements/vars/LiteralVariableElement.java @@ -5,7 +5,9 @@ import bjc.rgens.parser.GenerationState; public class LiteralVariableElement extends VariableElement { public String val; - public LiteralVariableElement(String val) { + public LiteralVariableElement(boolean forbidSpaces, String val) { + super(forbidSpaces); + this.val = val; } diff --git a/src/main/java/bjc/rgens/parser/elements/vars/RRefVariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/RRefVariableElement.java index 6bf332f..d731d64 100644 --- a/src/main/java/bjc/rgens/parser/elements/vars/RRefVariableElement.java +++ b/src/main/java/bjc/rgens/parser/elements/vars/RRefVariableElement.java @@ -7,17 +7,13 @@ import bjc.rgens.parser.Rule; public class RRefVariableElement extends VariableElement { public String value; - private boolean forbidSpaces; - public RRefVariableElement(boolean forbidSpaces, String val) { + super(forbidSpaces); + value = val; } public void generate(GenerationState state) { - if(!state.rlVars.containsKey(value)) { - throw new GrammarException("No rule variable named " + value); - } - Rule rl = state.findRule(value, true); GenerationState newState = state.newBuf(); diff --git a/src/main/java/bjc/rgens/parser/elements/vars/TRefVariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/TRefVariableElement.java index b10af87..a33d78c 100644 --- a/src/main/java/bjc/rgens/parser/elements/vars/TRefVariableElement.java +++ b/src/main/java/bjc/rgens/parser/elements/vars/TRefVariableElement.java @@ -10,14 +10,13 @@ import bjc.rgens.parser.templates.GrammarTemplate; * finish when template vars are implemented. */ public class TRefVariableElement extends VariableElement { - /* public String value; - private boolean forbidSpaces; - public TRefVariableElement(boolean forbidSpaces, String val) { + super(forbidSpaces); + value = val; - }*/ + } public void generate(GenerationState state) { /* diff --git a/src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java index c6921ba..b19f785 100644 --- a/src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java +++ b/src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java @@ -6,12 +6,10 @@ import bjc.rgens.parser.GrammarException; public class VRefVariableElement extends VariableElement { public final String nam; - private final boolean forbidSpaces; - public VRefVariableElement(boolean forbidSpaces, String nam) { - this.nam = nam; + super(forbidSpaces); - this.forbidSpaces = forbidSpaces; + this.nam = nam; } public void generate(GenerationState state) { diff --git a/src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java index 7a4260f..19c1e2c 100644 --- a/src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java +++ b/src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java @@ -1,5 +1,7 @@ package bjc.rgens.parser.elements.vars; +import bjc.utils.funcutils.StringUtils; + import bjc.rgens.parser.GenerationState; import bjc.rgens.parser.GrammarException; @@ -7,23 +9,29 @@ import java.util.ArrayList; import java.util.List; public abstract class VariableElement { + public boolean forbidSpaces; + + protected VariableElement(boolean forbidSpacing) { + forbidSpaces = forbidSpacing; + } + public abstract void generate(GenerationState state); - public static List<VariableElement> parseVariableElements(String varElm) { - boolean forbidSpaces = varElm.contains("-"); + public static List<VariableElement> parseElementString(String varElm) { + boolean forbidSpaces = StringUtils.levelContains(varElm, "-", "+"); String[] parts; if(forbidSpaces) { - parts = varElm.split("(?<=[+-])|(?=[+-])"); + parts = StringUtils.levelSplit(varElm, true, "-", "+").toArray(new String[0]); } else { parts = new String[] { varElm }; } - return parseVariableElements(forbidSpaces, parts); + return parseElementString(forbidSpaces, parts); } - public static List<VariableElement> parseVariableElements(boolean forbidSpaces, String... parts) { + public static List<VariableElement> parseElementString(boolean forbidSpaces, String... parts) { List<VariableElement> elms = new ArrayList<>(parts.length); VariableElement prevElement = null; @@ -34,22 +42,26 @@ public abstract class VariableElement { if(part.startsWith("$")) { elm = new VRefVariableElement(forbidSpaces, part.substring(1)); } else if (part.startsWith("@")) { - elm = new ARefVariableElement(forbidSpaces, part.substring(1)); + if(forbidSpaces) + throw new GrammarException("Arrays references aren't allowed in rule names"); + + elm = new ARefVariableElement(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) { + if(prevElement != null && prevElement instanceof LiteralVariableElement) { /* Aggregate chain literals together */ - ((LiteralVariableElement)prevElement).val += elm; + ((LiteralVariableElement)prevElement).val += part; } else { - elm = new LiteralVariableElement(part); + elm = new LiteralVariableElement(forbidSpaces, part); } } if(elm != null) { elms.add(elm); + prevElement = elm; } } |
