added #import, broke demo into two files
[fleet.git] / src / edu / berkeley / fleet / FleetParser.java
index 78934e3..1e32059 100644 (file)
@@ -58,20 +58,21 @@ public class FleetParser {
     }
 
     public static void go(Reader r) throws Exception {
+        Fleet fleet = new Fleet();
+        FleetParser fp = new FleetParser(fleet);
+        fp.walk((Tree<String>)parse(r));
+        fp.done();
+    }
+
+    public static Tree<String> parse(Reader r) throws Exception {
         InputStream grammarStream =
             FleetParser.class.getClassLoader().getResourceAsStream("fleet.g");
-
         Parser metaGrammarParser   = new CharParser(MetaGrammar.newInstance());
         Tree<String> parsedGrammar = metaGrammarParser.parse(new CharInput(grammarStream)).expand1();
-        Union   grammar            = Grammar.create(parsedGrammar, "s",
-                                                    new Grammar.Bindings() { });
+        Union   grammar            = Grammar.create(parsedGrammar, "s", new Grammar.Bindings() { });
         Parser  parser             = new CharParser(grammar);
         Tree tree = parser.parse(new CharInput(r)).expand1();
-        //System.out.println(tree);
-        Fleet fleet = new Fleet();
-        FleetParser fp = new FleetParser(fleet);
-        fp.walk((Tree<String>)tree);
-        fp.done();
+        return tree;
     }
 
     private Fleet fleet;
@@ -100,8 +101,9 @@ public class FleetParser {
             for(Tree<String> tc : t.child(0))
                 walk(tc);
             CodeBag cb = new CodeBag(null, null);
-            for(Tree<String> statement : t.child(1))
-                fillCodeBag(statement, cb);
+            if (t.size()>1)
+                for(Tree<String> statement : t.child(1))
+                    fillCodeBag(statement, cb);
             rootCodeBag = cb;
    
         } else if (head.equals("Import")) {
@@ -119,6 +121,13 @@ public class FleetParser {
             if (!good)
                 throw new RuntimeException("couldn't find a ship called \""+classname+"\"");
 
+        } else if (head.equals("Include")) {
+            try {
+                walk(parse(new InputStreamReader(new FileInputStream(string(t.child(0))))));
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            
         } else if (head.equals("Memory")) {
             if (fleet.mem.length != 0)
                 throw new RuntimeException("multiple memory directives found");