From 05c9922b30cd0dcd2a452673c2e155215d074b19 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Tue, 5 Jun 2018 22:09:23 -0300 Subject: Templates pt. 3 Templates should now work, though there is no syntax to reference them from rules yet In addition, several internal things have been changed so as to improve code quality --- .../rgens/parser/templates/GrammarTemplate.java | 75 ++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java (limited to 'src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java') 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 elements; + + public boolean doSpacing = true; + + public GrammarTemplate(List 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 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 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 elements, GrammarTemplate template, String ln) { + + } +} -- cgit v1.2.3