summaryrefslogtreecommitdiff
path: root/RGens/src/main
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2017-03-17 06:23:21 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2017-03-17 06:23:21 -0400
commit55e3425759faf94abcd8e1c06c53a09908f72d91 (patch)
treeb637c18091ab708af7fbba20ec495ec531c6f1d1 /RGens/src/main
parent0ea49dd4a52358f053c9be7138c392b16de05899 (diff)
Continue work on new parser.
Continued work on the new parser. new-syntax.txt is a description of the parser grammar in itself.
Diffstat (limited to 'RGens/src/main')
-rw-r--r--RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java27
-rw-r--r--RGens/src/main/java/bjc/rgens/newparser/new-syntax.txt10
2 files changed, 34 insertions, 3 deletions
diff --git a/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java b/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java
index d60c6d4..e31bb03 100644
--- a/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java
+++ b/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java
@@ -63,6 +63,7 @@ public class RGrammarParser {
public RGrammar readGrammar(InputStream is) throws GrammarException {
LineNumberReader lnReader = new LineNumberReader(new InputStreamReader(is));
+ int blockNo = 0;
try (Scanner scn = new Scanner(lnReader)) {
scn.useDelimiter("\\n\\.?\\n");
@@ -70,6 +71,7 @@ public class RGrammarParser {
while (scn.hasNext()) {
String block = scn.next();
+ blockNo += 1;
if (block.startsWith("pragma")) {
handlePragmaBlock(block, build);
@@ -80,31 +82,50 @@ public class RGrammarParser {
}
}
} catch (GrammarException gex) {
- throw new GrammarException(String.format("Error at line %d", lnReader.getLineNumber()), gex);
+ throw new GrammarException(String.format("Error in block %d at line %d of stream", blockNo, lnReader.getLineNumber()), gex);
}
return null;
}
+ /*
+ * Handle reading a block of pragmas
+ */
private void handlePragmaBlock(String block, RGrammarBuilder build) throws GrammarException {
LineNumberReader lnReader = new LineNumberReader(new StringReader(block));
+ int pragmaNo = 0;
try (Scanner deblocker = new Scanner(lnReader)) {
deblocker.useDelimiter("\\n(?!\\t)");
while (deblocker.hasNext()) {
String pragma = deblocker.next();
+ pragmaNo += 1;
if (!pragma.startsWith("pragma")) {
- throw new GrammarException(String.format("Illegal line at line %d of pragma block: %s",
+ throw new GrammarException(String.format("Illegal line: %s",
lnReader.getLineNumber(), pragma));
+ } else {
+ handlePragma(pragma.substring(7), build);
}
}
+ } catch (GrammarException gex) {
+ throw new GrammarException(String.format("Error in pragma %d at line %d", pragmaNo, lnReader.getLineNumber()), gex);
}
}
+ private void handlePragma(String pragma, RGrammarBuilder build) {
+
+ }
+
+ /*
+ * Handle a block of rules.
+ */
private void handleRuleBlock(String block, RGrammarBuilder build) {
- // TODO Auto-generated method stub
+ LineNumberReader lnReader = new LineNumberReader(new StringReader(block));
+ try(Scanner scn = new Scanner(lnReader)) {
+
+ }
}
}
diff --git a/RGens/src/main/java/bjc/rgens/newparser/new-syntax.txt b/RGens/src/main/java/bjc/rgens/newparser/new-syntax.txt
new file mode 100644
index 0000000..19f2066
--- /dev/null
+++ b/RGens/src/main/java/bjc/rgens/newparser/new-syntax.txt
@@ -0,0 +1,10 @@
+[grammar] → ([block] (/\n\.\n?/ [block])*)?
+
+[block] → [pragma-block]
+ → [rule-block]
+
+[pragma-block] → [pragma] (/\n(?!\t)/ [pragma])*
+
+[rule-block] → [rule-decl] [rule-case] (/\n\t/ [rule-case])*
+
+[pragma] → pragma [pragma-name] [pragma-body]