summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/templates
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-05 22:09:23 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-05 22:09:23 -0300
commit05c9922b30cd0dcd2a452673c2e155215d074b19 (patch)
tree80f2cc1cfd239761f3d74d20159f780c1673781b /src/main/java/bjc/rgens/parser/templates
parentf25d1062a56a81b17348b799e6d4d7e1dc12a1cc (diff)
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
Diffstat (limited to 'src/main/java/bjc/rgens/parser/templates')
-rw-r--r--src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java75
-rw-r--r--src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java17
-rw-r--r--src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java60
-rw-r--r--src/main/java/bjc/rgens/parser/templates/TemplateElement.java27
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);
+}