diff options
Diffstat (limited to 'src/main/java/bjc/rgens/parser/templates')
4 files changed, 179 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java b/src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java new file mode 100644 index 0000000..a257fbd --- /dev/null +++ b/src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java @@ -0,0 +1,75 @@ +package bjc.rgens.parser.templates; + +import bjc.rgens.parser.ConfigSet; +import bjc.rgens.parser.GenerationState; + +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class GrammarTemplate { + public ConfigSet belongsTo; + + public String name; + + public final List<TemplateElement> elements; + + public boolean doSpacing = true; + + public GrammarTemplate(List<TemplateElement> elements) { + this.elements = elements; + } + + public void generate(GenerationState state) { + for(TemplateElement element : elements) { + element.generate(state); + + if(doSpacing && element.type.spacing) + state.contents.append("\n"); + } + } + + public static GrammarTemplate readTemplate(Reader rdr) { + List<TemplateElement> elements = new ArrayList<>(); + GrammarTemplate template = new GrammarTemplate(elements); + + Scanner scn = new Scanner(rdr); + scn.useDelimiter("\\R"); + + int lno = 0; + while(scn.hasNextLine()) { + String ln = scn.nextLine(); + lno += 1; + + switch(ln.charAt(0)) { + case '#': + // Ignore comments + break; + case '/': + handlePragma(elements, template, ln.substring(1)); + break; + default: + handleLine(elements, template, ln); + } + } + + + return template; + } + + private static void handleLine(List<TemplateElement> elements, GrammarTemplate template, String ln) { + if(ln.matches("^.*?\\$@.+?@\\$.*$")) { + /* + * Handle live templates + */ + elements.add(new LiveTemplateElement(ln)); + } else { + elements.add(new LiteralTemplateElement(ln)); + } + } + + private static void handlePragma(List<TemplateElement> elements, GrammarTemplate template, String ln) { + + } +} diff --git a/src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java b/src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java new file mode 100644 index 0000000..19ebbc2 --- /dev/null +++ b/src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java @@ -0,0 +1,17 @@ +package bjc.rgens.parser.templates; + +import bjc.rgens.parser.GenerationState; + +public class LiteralTemplateElement extends TemplateElement { + public final String val; + + public LiteralTemplateElement(String val) { + super(ElementType.LITERAL); + + this.val = val; + } + + public void generate(GenerationState state) { + state.contents.append(val); + } +} diff --git a/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java b/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java new file mode 100644 index 0000000..2487c83 --- /dev/null +++ b/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java @@ -0,0 +1,60 @@ +package bjc.rgens.parser.templates; + +import bjc.utils.data.BooleanToggle; +import bjc.utils.funcdata.FunctionalList; + +import bjc.rgens.parser.GenerationState; +import bjc.rgens.parser.RGrammarParser; +import bjc.rgens.parser.elements.CaseElement; +import bjc.rgens.parser.elements.LiteralCaseElement; + +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class LiveTemplateElement extends TemplateElement { + private static final Pattern INSERT_PAT = Pattern.compile("\\$@(.+?)@\\$"); + + public final List<List<CaseElement>> elements; + + public LiveTemplateElement(String val) { + super(ElementType.TEMPLATE); + + elements = new ArrayList<>(); + + Matcher mat = INSERT_PAT.matcher(val); + StringBuffer sb = new StringBuffer(); + + while(mat.find()) { + mat.appendReplacement(sb, ""); + String body = mat.group(1); + + FunctionalList<CaseElement> elms = (FunctionalList<CaseElement>)RGrammarParser.parseElementString(body).getLeft(); + + elements.add(Arrays.asList(new LiteralCaseElement(sb.toString()))); + elements.add(elms.getInternal()); + + sb = new StringBuffer(); + } + + mat.appendTail(sb); + elements.add(Arrays.asList(new LiteralCaseElement(sb.toString()))); + } + + public void generate(GenerationState state) { + BooleanToggle bt = new BooleanToggle(false); + + for(List<CaseElement> elmList : elements) { + boolean doSpacing = bt.get(); + + for(CaseElement elm : elmList) { + elm.generate(state); + + if(doSpacing && elm.type.spacing) + state.contents.append(" "); + } + } + } +} diff --git a/src/main/java/bjc/rgens/parser/templates/TemplateElement.java b/src/main/java/bjc/rgens/parser/templates/TemplateElement.java new file mode 100644 index 0000000..dc123f3 --- /dev/null +++ b/src/main/java/bjc/rgens/parser/templates/TemplateElement.java @@ -0,0 +1,27 @@ +package bjc.rgens.parser.templates; + +import bjc.rgens.parser.GenerationState; + +public abstract class TemplateElement { + public static enum ElementType { + LITERAL(true), + TEMPLATE(true), + PRAGMA(false); + + public final boolean spacing; + + private ElementType(boolean spacing) { + this.spacing = spacing; + } + } + + public final ElementType type; + + public GrammarTemplate belongsTo; + + protected TemplateElement(ElementType type) { + this.type = type; + } + + public abstract void generate(GenerationState state); +} |
