speed up separate parsing
[fleet.git] / src / edu / berkeley / fleet / assembler / Parser.java
index 98fbed3..39deda3 100644 (file)
@@ -36,15 +36,19 @@ public class Parser {
         return new CodeBag(name);
     }
 
-    Tree<String> parse(Reader r) throws Exception {
+    private static Union grammar;
+    private static synchronized Union getGrammar() throws Exception {
+        if (grammar != null) return grammar;
         InputStream grammarStream =
             Parser.class.getClassLoader().getResourceAsStream("edu/berkeley/fleet/assembler/fleet.g");
         CharParser metaGrammarParser   = new CharParser(MetaGrammar.newInstance());
         Tree<String> parsedGrammar     = metaGrammarParser.parse(new CharInput(grammarStream)).expand1();
-        Union   grammar                = Grammar.create(parsedGrammar, "s", new Grammar.Bindings() { });
-        CharParser  parser             = new CharParser(grammar);
-        Tree tree = parser.parse(new CharInput(r)).expand1();
-        return tree;
+        grammar                = Grammar.create(parsedGrammar, "s", new Grammar.Bindings() { public Object repeatTag() { return ""; } });
+        return grammar;
+    }
+
+    Tree<String> parse(Reader r) throws Exception {
+        return new CharParser(getGrammar()).parse(new CharInput(r)).expand1();
     }
 
     public void parse(Reader r, OutputStream out) throws Exception {