summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/templates
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/rgens/parser/templates')
-rw-r--r--src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java74
-rw-r--r--src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java19
-rw-r--r--src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java30
3 files changed, 110 insertions, 13 deletions
diff --git a/src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java b/src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java
index 8a99188..64db166 100644
--- a/src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java
+++ b/src/main/java/bjc/rgens/parser/templates/GrammarTemplate.java
@@ -2,25 +2,58 @@ package bjc.rgens.parser.templates;
import bjc.rgens.parser.ConfigSet;
import bjc.rgens.parser.GenerationState;
+import bjc.rgens.parser.LoadOptions;
+
+import bjc.utils.data.ITree;
+import bjc.utils.data.Tree;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
+/**
+ * Represents a grammar template.
+ *
+ * @author Ben Culkin
+ */
public class GrammarTemplate {
+ /**
+ * The config set the template belongs to.
+ */
public ConfigSet belongsTo;
+ /**
+ * The name of the template.
+ */
public String name;
+ /**
+ * The elements in the template.
+ */
public final List<TemplateElement> elements;
+ /**
+ * Whether or not to do spacing of elements.
+ */
public boolean doSpacing = true;
+ /**
+ * Create a new grammar template.
+ *
+ * @param elements
+ * The elements that belong to the template.
+ */
public GrammarTemplate(List<TemplateElement> elements) {
this.elements = elements;
}
+ /**
+ * Generate the template.
+ *
+ * @param state
+ * The state for generating a template.
+ */
public void generate(GenerationState state) {
for(TemplateElement element : elements) {
element.generate(state);
@@ -30,7 +63,18 @@ public class GrammarTemplate {
}
}
- public static GrammarTemplate readTemplate(Reader rdr) {
+ /**
+ * Read a template from an input source.
+ *
+ * @param rdr
+ * The reader to get input from.
+ *
+ * @param errs
+ * The errors/information to generate during loading.
+ *
+ * @return The generated template.
+ */
+ public static GrammarTemplate readTemplate(Reader rdr, ITree<String> errs) {
List<TemplateElement> elements = new ArrayList<>();
GrammarTemplate template = new GrammarTemplate(elements);
@@ -42,34 +86,46 @@ public class GrammarTemplate {
String ln = scn.nextLine();
lno += 1;
+ ITree<String> kid = new Tree<>(String.format("INFO: Line %d", lno));
switch(ln.charAt(0)) {
case '#':
// Ignore comments
break;
case '/':
- handlePragma(elements, template, ln.substring(1));
+ handlePragma(elements, template, ln.substring(1), kid);
break;
default:
- handleLine(elements, template, ln);
+ handleLine(elements, template, ln, kid);
}
- }
+ if (kid.size() > 0) {
+ errs.addChild(kid);
+ }
+ }
return template;
}
- private static void handleLine(List<TemplateElement> elements, GrammarTemplate template, String ln) {
+ private static void handleLine(List<TemplateElement> elements, GrammarTemplate template, String ln, ITree<String> errs) {
if(ln.matches("^.*?\\$@.+?@\\$.*$")) {
/*
* Handle live templates
*/
- elements.add(new LiveTemplateElement(ln));
+ elements.add(new LiveTemplateElement(ln, errs));
} else {
- elements.add(new LiteralTemplateElement(ln));
+ elements.add(new LiteralTemplateElement(ln, errs));
}
}
- private static void handlePragma(List<TemplateElement> elements, GrammarTemplate template, String ln) {
-
+ private static void handlePragma(List<TemplateElement> elements, GrammarTemplate template, String ln, ITree<String> errs) {
+ /*
+ * @TODO 2/8/2019 Ben Culkin :TemplatePragmas
+ * Implement template pragmas.
+ *
+ * Implement template pragmas. Mainly, this means that the 'choose'
+ * based ones need to be implemented based off of the provided sample
+ * template.
+ */
+ errs.addChild("ERROR: Template pragmas are not yet implemented");
}
}
diff --git a/src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java b/src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java
index ca4b32f..2f0a571 100644
--- a/src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java
+++ b/src/main/java/bjc/rgens/parser/templates/LiteralTemplateElement.java
@@ -1,16 +1,33 @@
package bjc.rgens.parser.templates;
+import bjc.utils.data.ITree;
+
import bjc.rgens.parser.GenerationState;
+/**
+ * Represents a literal text element.
+ *
+ * @author Ben Culkin
+ */
public class LiteralTemplateElement extends TemplateElement {
+ /**
+ * The literal value of the element.
+ */
public final String val;
- public LiteralTemplateElement(String val) {
+ /**
+ * Create a new literal template element.
+ *
+ * @param val
+ * The string to insert.
+ */
+ public LiteralTemplateElement(String val, ITree<String> errs) {
super(true);
this.val = val;
}
+ @Override
public void generate(GenerationState state) {
state.appendContents(val);
}
diff --git a/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java b/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java
index 8dbde05..0aa3bd0 100644
--- a/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java
+++ b/src/main/java/bjc/rgens/parser/templates/LiveTemplateElement.java
@@ -1,7 +1,10 @@
package bjc.rgens.parser.templates;
import bjc.utils.data.BooleanToggle;
+import bjc.utils.data.ITree;
+import bjc.utils.data.Tree;
import bjc.utils.funcdata.FunctionalList;
+import bjc.utils.funcdata.IList;
import bjc.rgens.parser.GenerationState;
import bjc.rgens.parser.RGrammarParser;
@@ -14,12 +17,30 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+/**
+ * A template element that can contain rule elements.
+ *
+ * @author Ben Culkin.
+ */
public class LiveTemplateElement extends TemplateElement {
+ // Pattern for matching elements (any number of characters bracketed by '$@' and '@$')
private static final Pattern INSERT_PAT = Pattern.compile("\\$@(.+?)@\\$");
+ /**
+ * The sub-elements of this element.
+ */
public final List<List<CaseElement>> elements;
- public LiveTemplateElement(String val) {
+ /**
+ * Create a new template element.
+ *
+ * @param val
+ * The string to parse this element from.
+ *
+ * @param errs
+ * A tree to add errors &amp; information to.
+ */
+ public LiveTemplateElement(String val, ITree<String> errs) {
super(true);
elements = new ArrayList<>();
@@ -31,10 +52,12 @@ public class LiveTemplateElement extends TemplateElement {
mat.appendReplacement(sb, "");
String body = mat.group(1);
- FunctionalList<CaseElement> elms = (FunctionalList<CaseElement>)RGrammarParser.parseElementString(body).getLeft();
+ List<CaseElement> elms = new ArrayList<>();
+
+ int weight = RGrammarParser.parseElementString(body, elms, errs);
elements.add(Arrays.asList(new LiteralCaseElement(sb.toString())));
- elements.add(elms.getInternal());
+ elements.add(elms);
sb = new StringBuffer();
}
@@ -43,6 +66,7 @@ public class LiveTemplateElement extends TemplateElement {
elements.add(Arrays.asList(new LiteralCaseElement(sb.toString())));
}
+ @Override
public void generate(GenerationState state) {
BooleanToggle bt = new BooleanToggle(false);