diff options
| author | bjculkin <bjculkin@mix.wvu.edu> | 2017-03-21 15:42:22 -0400 |
|---|---|---|
| committer | bjculkin <bjculkin@mix.wvu.edu> | 2017-03-21 15:42:22 -0400 |
| commit | ccb2510fadf19e5e1cda63d948fd482e25fc799d (patch) | |
| tree | 0873c7693afb5aefcd1618a65933f795d6a72835 /RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java | |
| parent | ec144248bf199d8c3c0667a93ace78eb65a38de2 (diff) | |
Add export rules to grammars
Diffstat (limited to 'RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java')
| -rw-r--r-- | RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java b/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java index b74c5f7..64d7b54 100644 --- a/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java +++ b/RGens/src/main/java/bjc/rgens/newparser/RGrammarParser.java @@ -49,6 +49,14 @@ public class RGrammarParser { build.setInitialRule(body); }); + + pragmas.put("export-rule", (body, build, level) -> { + String[] exports = body.split(" "); + + for(String export : exports) { + build.addExport(export); + } + }); } /** @@ -99,6 +107,7 @@ public class RGrammarParser { */ if(block.equals("")) return; if(block.equals("\n")) return; + if(block.equals("\r\n")) return; int typeSep = block.indexOf(' '); @@ -176,7 +185,11 @@ public class RGrammarParser { String pragmaBody = pragma.substring(bodySep + 1); if(pragmas.containsKey(pragmaName)) { - pragmas.get(pragmaName).accept(pragmaBody, build, level); + try { + pragmas.get(pragmaName).accept(pragmaBody, build, level); + } catch(GrammarException gex) { + throw new GrammarException(String.format("Error in '%s' pragma", pragmaName), gex); + } } else { throw new GrammarException(String.format("Unknown pragma named '%s'", pragmaName)); } @@ -211,7 +224,7 @@ public class RGrammarParser { * single case. */ handleRuleDecl(build, ruleBlock); - + build.finishRule(); } } catch(GrammarException gex) { @@ -231,7 +244,8 @@ public class RGrammarParser { if(declSep == -1) { /* - * The old syntax allowed it to work with just a space. + * TODO remove support for the old syntax when all of + * the files are converted. */ declSep = declContents.indexOf(' '); @@ -240,9 +254,6 @@ public class RGrammarParser { "A rule must be given at least one case in its declaration, and" + "seperated from that case by \u2192"); } - - System.out.println( - "WARNING: Rule declarations must now be seperated from the initial case by \u2192."); } String ruleName = declContents.substring(0, declSep).trim(); @@ -264,7 +275,14 @@ public class RGrammarParser { build.beginCase(); for(String csepart : cse.split(" ")) { - build.addCasePart(csepart); + String partToAdd = csepart.trim(); + + /* + * Ignore empty parts + */ + if(partToAdd.equals("")) continue; + + build.addCasePart(partToAdd); } build.finishCase(); |
