diff options
| -rw-r--r-- | src/main/java/bjc/rgens/parser/FlatRuleCase.java | 19 | ||||
| -rw-r--r-- | src/main/java/bjc/rgens/parser/NormalRuleCase.java | 22 | ||||
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/RGrammar.java | 30 | ||||
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/RGrammarBuilder.java | 6 | ||||
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/RGrammarParser.java | 2 | ||||
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/RegexRuleCase.java | 6 | ||||
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/RuleCase.java | 6 | ||||
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/elements/CaseElement.java | 16 |
8 files changed, 66 insertions, 41 deletions
diff --git a/src/main/java/bjc/rgens/parser/FlatRuleCase.java b/src/main/java/bjc/rgens/parser/FlatRuleCase.java new file mode 100644 index 0000000..58f3d54 --- /dev/null +++ b/src/main/java/bjc/rgens/parser/FlatRuleCase.java @@ -0,0 +1,19 @@ +package bjc.rgens.parser; + +import bjc.utils.funcdata.IList; + +import bjc.rgens.parser.elements.CaseElement; + +public class FlatRuleCase extends RuleCase { + public FlatRuleCase(IList<CaseElement> elms) { + super(CaseType.SPACEFLATTEN, elms); + } + + @Override + public void generate(GenerationState state) { + for(CaseElement elm : elementList) { + elm.generate(state); + } + } +} + diff --git a/src/main/java/bjc/rgens/parser/NormalRuleCase.java b/src/main/java/bjc/rgens/parser/NormalRuleCase.java new file mode 100644 index 0000000..19fa8af --- /dev/null +++ b/src/main/java/bjc/rgens/parser/NormalRuleCase.java @@ -0,0 +1,22 @@ +package bjc.rgens.parser; + +import bjc.utils.funcdata.IList; + +import bjc.rgens.parser.elements.CaseElement; + +public class NormalRuleCase extends RuleCase { + public NormalRuleCase(IList<CaseElement> elms) { + super(CaseType.NORMAL, elms); + } + + @Override + public void generate(GenerationState state) { + for(CaseElement elm : elementList) { + elm.generate(state); + + if(elm.type.spacing) { + state.contents.append(" "); + } + } + } +} diff --git a/src/main/java/bjc/rgens/parser/RGrammar.java b/src/main/java/bjc/rgens/parser/RGrammar.java index 9d17171..4e21279 100755 --- a/src/main/java/bjc/rgens/parser/RGrammar.java +++ b/src/main/java/bjc/rgens/parser/RGrammar.java @@ -221,41 +221,13 @@ public class RGrammar { */ public void generateCase(RuleCase start, GenerationState state) { try { - switch (start.type) { - case NORMAL: - for (CaseElement elm : start.getElements()) { - generateElement(elm, state); - - if (elm.type != CaseElement.ElementType.VARDEF) { - state.contents.append(" "); - } - } - break; - case SPACEFLATTEN: - for (CaseElement elm : start.getElements()) { - generateElement(elm, state); - } - break; - default: - String msg = String.format("Unknown case type '%s'", start.type); - throw new GrammarException(msg); - } + start.generate(state); } catch (GrammarException gex) { String msg = String.format("Error in generating case (%s)", start); throw new GrammarException(msg, gex); } } - /* Generate a case element. */ - private void generateElement(CaseElement elm, GenerationState state) { - try { - elm.generate(state); - } catch (GrammarException gex) { - String msg = String.format("Error in generating case element (%s)", elm); - throw new GrammarException(msg, gex); - } - } - /** * Get the initial rule of this grammar. * diff --git a/src/main/java/bjc/rgens/parser/RGrammarBuilder.java b/src/main/java/bjc/rgens/parser/RGrammarBuilder.java index f34a418..fc679f1 100755 --- a/src/main/java/bjc/rgens/parser/RGrammarBuilder.java +++ b/src/main/java/bjc/rgens/parser/RGrammarBuilder.java @@ -167,7 +167,7 @@ public class RGrammarBuilder { * Is this correct, or should we be mirroring the * existing case type? */ - newCases.add(new RuleCase(NORMAL, newCase)); + newCases.add(new NormalRuleCase(newCase)); } @@ -220,7 +220,7 @@ public class RGrammarBuilder { * Is this correct, or should we be mirroring the * existing case type? */ - newCases.add(new RuleCase(NORMAL, newCase)); + newCases.add(new NormalRuleCase(newCase)); } @@ -243,7 +243,7 @@ public class RGrammarBuilder { IList<RuleCase> newCaseList = new FunctionalList<>(); for(RuleCase cse : caseList) { - newCaseList.add(new RuleCase(SPACEFLATTEN, cse.getElements())); + newCaseList.add(new FlatRuleCase(cse.getElements())); } rules.get(ruleName).replaceCases(newCaseList); diff --git a/src/main/java/bjc/rgens/parser/RGrammarParser.java b/src/main/java/bjc/rgens/parser/RGrammarParser.java index 506256d..5a09ca8 100755 --- a/src/main/java/bjc/rgens/parser/RGrammarParser.java +++ b/src/main/java/bjc/rgens/parser/RGrammarParser.java @@ -347,7 +347,7 @@ public class RGrammarParser { caseParts.add(CaseElement.createElement(partToAdd)); } - rul.addCase(new RuleCase(RuleCase.CaseType.NORMAL, caseParts)); + rul.addCase(new NormalRuleCase(caseParts)); } /* Handle a where block (a block with local rules). */ diff --git a/src/main/java/bjc/rgens/parser/RegexRuleCase.java b/src/main/java/bjc/rgens/parser/RegexRuleCase.java index 5e03cd6..3a8a8ad 100755 --- a/src/main/java/bjc/rgens/parser/RegexRuleCase.java +++ b/src/main/java/bjc/rgens/parser/RegexRuleCase.java @@ -10,7 +10,7 @@ public class RegexRuleCase extends RuleCase { private Pattern patt; public RegexRuleCase(IList<CaseElement> elements, String pattern) { - super(RuleCase.CaseType.REGEX); + super(CaseType.REGEX, elements); elementList = elements; @@ -29,4 +29,8 @@ public class RegexRuleCase extends RuleCase { public Pattern getPattern() { return patt; } + + public void generate(GenerationState state) { + + } } diff --git a/src/main/java/bjc/rgens/parser/RuleCase.java b/src/main/java/bjc/rgens/parser/RuleCase.java index 9c0a856..bb82ff2 100755 --- a/src/main/java/bjc/rgens/parser/RuleCase.java +++ b/src/main/java/bjc/rgens/parser/RuleCase.java @@ -13,7 +13,7 @@ import bjc.utils.funcdata.IList; * * @author EVE */ -public class RuleCase { +public abstract class RuleCase { /** * The possible types of a case. * @@ -25,7 +25,7 @@ public class RuleCase { /** A case that doesn't insert spaces. */ SPACEFLATTEN, /** A case that applies a regex after generation. */ - REGEX + REGEX; } /** The type of this case. */ @@ -75,6 +75,8 @@ public class RuleCase { elementList = elements; } + public abstract void generate(GenerationState state); + /** * Get the element list value of this type. * diff --git a/src/main/java/bjc/rgens/parser/elements/CaseElement.java b/src/main/java/bjc/rgens/parser/elements/CaseElement.java index cc04781..54c673f 100755 --- a/src/main/java/bjc/rgens/parser/elements/CaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/CaseElement.java @@ -16,18 +16,24 @@ public abstract class CaseElement { */ public static enum ElementType { /** An element that represents a literal string. */ - LITERAL, + LITERAL(true), /** An element that represents a rule reference. */ - RULEREF, + RULEREF(true), /** An element that represents a random range. */ - RANGE, + RANGE(true), /** An element that represents a variable that stores a string. */ - VARDEF, + VARDEF(false), /** * An element that represents a variable that stores the result of generating a * rule. */ - EXPVARDEF; + EXPVARDEF(false); + + public final boolean spacing; + + private ElementType(boolean spacing) { + this.spacing = spacing; + } } /* Regexps for marking rule types. */ |
