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 {
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;
public void done() {
if (rootCodeBag != null) {
+ if (debugMemory) { fleet.dumpMem(); }
+ System.out.println(rootCodeBag);
rootCodeBag.dispatch(fleet);
fleet.go();
+ if (debugMemory) { fleet.dumpMem(); }
}
}
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")) {
}
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;
}
}
} 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;