}
public static @bind.as("LiteralMove") Statement move(String value, Port[] dest) {
- return new LiteralMove(Integer.parseInt(value), dest);
+ return new Move(Integer.parseInt(value), dest);
+ }
+ public static @bind.as("LiteralCountMove") Statement move(String value, String count,
+ Port[] dest) {
+ return new Move(Integer.parseInt(value), dest, Integer.parseInt(count));
}
- public static @bind.as("->*") Statement smove(Port source, Port[] dest) {
- //return new SMove(source, dest);
- return null;
+ public static @bind.as("-(*)->") Statement smove(Port source, Port[] dest) {
+ return new Move(source, dest, Integer.MAX_VALUE);
+ }
+ public static @bind.as("-(") Statement smove(Port source, String count, Port[] dest) {
+ return new Move(source, dest, Integer.parseInt(count));
}
public static @bind.as("<-") Statement gets(Port dest, Port source) {
public static @bind.as("ShipName") String shipname(String name, String index) { return index==null?name:name+index; }
public static @bind.as("PortName") String portname(String name, String index) { return index==null?name:name+index; }
+ public static @bind.as("Name") String name(String a, String b) { return a+b; }
public static interface Source { }
public static interface Destination { }
public static class Move implements Statement {
Port source;
Port[] dest;
- public Move(Port source, Port[] dest) { this.source = source; this.dest = dest; }
- public void dispatch(Fleet fleet) {
- Ship.Outbox ob = fleet.getOutbox(source.ship, source.port);
- for(Port d : dest) {
- Ship.Inbox ib = fleet.getInbox(d.ship, d.port);
- ob.addDestination(ib);
- Log.println("instr: " + ob + " -> " + ib);
- }
- }
- public String toString() {
- StringBuffer sb = new StringBuffer();
- sb.append(source + " -> ");
- sb.append(dest[0]);
- for(int i=1; i<dest.length; i++) {
- sb.append(", " + dest[i]);
- }
- return sb.toString();
- }
- }
-
- public static class LiteralMove implements Statement {
+ int count;
int val;
- Port[] dest;
- public LiteralMove(int val, Port[] dest) { this.val = val; this.dest = dest; }
+ public Move(Port source, Port[] dest) { this(source, dest, 1); }
+ public Move(Port source, Port[] dest, int count) { this(0, source, dest, count); }
+ public Move(int val, Port[] dest) { this(val, dest, 1); }
+ public Move(int val, Port[] dest, int count) { this(val, null, dest, count); }
+ public Move(int val, Port source, Port[] dest, int count) {
+ this.source = source;
+ this.dest = dest;
+ this.count = count;
+ this.val = val;
+ }
public void dispatch(Fleet fleet) {
- for(Port d : dest) {
- Ship.Inbox ib = fleet.getInbox(d.ship, d.port);
- ib.add(val);
- Log.println("instr: " + val + " -> " + ib);
- }
+ Ship.Outbox ob = source==null ? null : fleet.getOutbox(source.ship, source.port);
+ int repcount = count;
+ if (repcount == 0 || repcount == Integer.MAX_VALUE) repcount = 1;
+ for(int i=0; i<repcount; i++)
+ for(Port d : dest) {
+ Ship.Inbox ib = fleet.getInbox(d.ship, d.port);
+ if (ob==null) {
+ ib.add(val);
+ Log.println("instr: " + val + " -> " + ib);
+ } else {
+ if (count==0) ob.addTokenDestination(ib);
+ else if (count==Integer.MAX_VALUE) ob.addStandingDestination(ib);
+ else ob.addDestination(ib);
+ Log.println("instr: " + ob + " -> " + ib);
+ }
+ }
}
public String toString() {
StringBuffer sb = new StringBuffer();
- sb.append(val + " -> ");
+ sb.append((source==null ? (val+"") : source+"") + " -"+(count<=1?"":("("+count+")"))+"-> ");
sb.append(dest[0]);
for(int i=1; i<dest.length; i++) {
sb.append(", " + dest[i]);