From 33a165f0b0055d2bdf9a1fcaa639b31a7f87d9a6 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Fri, 8 Jun 2018 19:06:14 -0300 Subject: Major refactoring A major refactoring to the internals of how things work. I believe that nothing is broken --- .../parser/elements/vars/VariableElement.java | 30 +++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'src/main/java/bjc/rgens/parser/elements/vars/VariableElement.java') 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 parseVariableElements(String varElm) { - boolean forbidSpaces = varElm.contains("-"); + public static List 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 parseVariableElements(boolean forbidSpaces, String... parts) { + public static List parseElementString(boolean forbidSpaces, String... parts) { List 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; } } -- cgit v1.2.3