summaryrefslogtreecommitdiff
path: root/RGens/src/main/java/bjc/rgens/newparser
diff options
context:
space:
mode:
authorstudent <student@student-OptiPlex-9020>2017-03-17 10:49:27 -0400
committerstudent <student@student-OptiPlex-9020>2017-03-17 10:49:27 -0400
commit0ea49dd4a52358f053c9be7138c392b16de05899 (patch)
tree802e275aaf279480ee8626136f56bfa1fbab6845 /RGens/src/main/java/bjc/rgens/newparser
parent36cf3a0f0604ef43ce838ff6e9a7fc4e7c299522 (diff)
Move things around, and start on new parser.
Diffstat (limited to 'RGens/src/main/java/bjc/rgens/newparser')
-rw-r--r--RGens/src/main/java/bjc/rgens/newparser/RGrammar.java5
-rw-r--r--RGens/src/main/java/bjc/rgens/newparser/RGrammarBuilder.java7
-rw-r--r--RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java110
3 files changed, 122 insertions, 0 deletions
diff --git a/RGens/src/main/java/bjc/rgens/newparser/RGrammar.java b/RGens/src/main/java/bjc/rgens/newparser/RGrammar.java
new file mode 100644
index 0000000..9b47bd6
--- /dev/null
+++ b/RGens/src/main/java/bjc/rgens/newparser/RGrammar.java
@@ -0,0 +1,5 @@
+package bjc.rgens.newparser;
+
+public class RGrammar {
+
+}
diff --git a/RGens/src/main/java/bjc/rgens/newparser/RGrammarBuilder.java b/RGens/src/main/java/bjc/rgens/newparser/RGrammarBuilder.java
new file mode 100644
index 0000000..3b48a2a
--- /dev/null
+++ b/RGens/src/main/java/bjc/rgens/newparser/RGrammarBuilder.java
@@ -0,0 +1,7 @@
+package bjc.rgens.newparser;
+
+public class RGrammarBuilder {
+ public RGrammar toRGrammar() {
+ return null;
+ }
+}
diff --git a/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java b/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java
new file mode 100644
index 0000000..d60c6d4
--- /dev/null
+++ b/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java
@@ -0,0 +1,110 @@
+package bjc.rgens.newparser;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.io.StringReader;
+import java.util.Scanner;
+
+/**
+ * Reads {@link RGrammar} from a input stream.
+ *
+ * @author student
+ *
+ */
+public class RGrammarParser {
+ /**
+ * The exception thrown when something goes wrong while parsing a grammar.
+ *
+ * @author student
+ *
+ */
+ public static class GrammarException extends Exception {
+ /*
+ * Serialization ID.
+ */
+ private static final long serialVersionUID = -7287427479316953668L;
+
+ /**
+ * Create a new grammar exception with the specified message.
+ *
+ * @param msg
+ * The message for this exception.
+ */
+ public GrammarException(String msg) {
+ super(msg);
+ }
+
+ /**
+ * Create a new grammar exception with the specified message and cause.
+ *
+ * @param msg
+ * The message for this exception.
+ *
+ * @param cause
+ * The cause of this exception.
+ */
+ public GrammarException(String msg, Exception cause) {
+ super(msg, cause);
+ }
+ }
+
+ /**
+ * Read a {@link RGrammar} from an input stream.
+ *
+ * @param is
+ * The input stream to read from.
+ *
+ * @return The grammar represented by the stream.
+ *
+ * @throws GrammarException
+ * Thrown if the grammar has a syntax error.
+ */
+ public RGrammar readGrammar(InputStream is) throws GrammarException {
+ LineNumberReader lnReader = new LineNumberReader(new InputStreamReader(is));
+
+ try (Scanner scn = new Scanner(lnReader)) {
+ scn.useDelimiter("\\n\\.?\\n");
+
+ RGrammarBuilder build = new RGrammarBuilder();
+
+ while (scn.hasNext()) {
+ String block = scn.next();
+
+ if (block.startsWith("pragma")) {
+ handlePragmaBlock(block, build);
+ } else if (block.startsWith("[")) {
+ handleRuleBlock(block, build);
+ } else {
+ throw new GrammarException(String.format("Unknown block: %s", lnReader.getLineNumber(), block));
+ }
+ }
+ } catch (GrammarException gex) {
+ throw new GrammarException(String.format("Error at line %d", lnReader.getLineNumber()), gex);
+ }
+
+ return null;
+ }
+
+ private void handlePragmaBlock(String block, RGrammarBuilder build) throws GrammarException {
+ LineNumberReader lnReader = new LineNumberReader(new StringReader(block));
+
+ try (Scanner deblocker = new Scanner(lnReader)) {
+ deblocker.useDelimiter("\\n(?!\\t)");
+
+ while (deblocker.hasNext()) {
+ String pragma = deblocker.next();
+
+ if (!pragma.startsWith("pragma")) {
+ throw new GrammarException(String.format("Illegal line at line %d of pragma block: %s",
+ lnReader.getLineNumber(), pragma));
+ }
+ }
+ }
+ }
+
+ private void handleRuleBlock(String block, RGrammarBuilder build) {
+ // TODO Auto-generated method stub
+
+ }
+}