added #import, broke demo into two files
[fleet.git] / src / edu / berkeley / fleet / FleetParser.java
index 85fc297..1e32059 100644 (file)
@@ -10,6 +10,10 @@ import java.util.*;
 import java.io.*;
 import static edu.berkeley.fleet.Instruction.IgnoreCopyTake.*;
 
+/**
+ *  @author Adam Megacz <megacz@cs.berkeley.edu>
+ *  @author Thomas Kho <tkho@eecs.berkeley.edu>
+ */
 public class FleetParser {
 
     public static void main(String[] s) throws Exception {
@@ -33,36 +37,48 @@ public class FleetParser {
                     DataInbox.defaultInstruction = null;
                     continue;
                 }
+            } else if (s[i].startsWith("--memory=")) {
+                String val = s[i].substring(s[i].indexOf('=')+1);
+                if (val.equals("hide")) {
+                    debugMemory = false;
+                    continue;
+                } else if (val.equals("show")) {
+                    debugMemory = true;
+                    continue;
+                }
             }
             System.out.println("Fleeterpreter usage:");
             System.out.println("");
             System.out.println("  --color={on|off}");
             System.out.println("  --inboxes={configured|unconfigured}");
+            System.out.println("  --memory={hide|show}");
             System.exit(-1);
         }
         go(new InputStreamReader(System.in));
     }
 
     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;
     private ArrayList<String> imports = new ArrayList<String>();
     private CodeBag rootCodeBag;
+    private static boolean debugMemory = true;
 
     public FleetParser(Fleet fleet) {
         this.fleet = fleet;
@@ -70,8 +86,11 @@ public class FleetParser {
 
     public void done() {
         if (rootCodeBag != null) {
+            if (debugMemory) { fleet.dumpMem(); }
+            System.out.println(rootCodeBag);
             rootCodeBag.dispatch(fleet);
             fleet.go();
+            if (debugMemory) { fleet.dumpMem(); }
         }
     }
 
@@ -82,9 +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);
-            System.out.println(cb);
+            if (t.size()>1)
+                for(Tree<String> statement : t.child(1))
+                    fillCodeBag(statement, cb);
             rootCodeBag = cb;
    
         } else if (head.equals("Import")) {
@@ -101,6 +120,22 @@ 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");
+            Tree<String> m = t.child(0);
+            int[] mem = new int[m.size()];
+            for(int i=0; i<mem.length; i++)
+                mem[i] = Integer.parseInt(string(m.child(i)));
+            fleet.mem = mem;
         }
     }
 
@@ -154,6 +189,9 @@ public class FleetParser {
             } else if ("CodeBagRef".equals(t.child(1).head())) {
                 cb.add(new Literal.CodeBagRef(name(t.child(1).child(0)), cb, d));
 
+            } else if ("ShipSpecific".equals(t.child(1).head())) {
+                cb.add(new Literal.ShipSpecific(string(t.child(1).child(0)), d, count));
+
             } else {
                 PortReference s = portReference(t.child(1));
                 Instruction inst = null;