w = [\r\n ]*
ws = (w | Comment)* -> ~[\r\n ]
-s = !ws Program !ws
-Program = CodeBag:: statements:(Statement +/ ws)
+s = ws! Program ws!
+Program = Program::
+ (Directive ws!)*
+ CodeBagBody
-Statement = Move !((ws ";")?)
+Directive = Memory:: "#memory" "{" (int +/ (ws! "," ws!)) "}" /ws
+ | Import:: "#import" [A-Za-z_.]++ /ws
+ | Ship:: "#ship" shipname ":" [A-Za-z_\.]++ /ws
+
+
+Statement = Move ((ws ";")?)!
| CodeBag
- | ^"#define" Port Port /ws
+// | ^"#define" Port Port /ws
Move = Source ^"->" Destination /ws
| Source ^"->*" Destination /ws
| Port ^":=" Source /ws
-Destination = Port +/ (!ws "," !ws)
+Destination = Port +/ (ws! "," ws!)
Source = Port
| CodeBag
-
-CodeBag = CodeBag::
- name:(name !ws ":" !ws)?
+CodeBagBody = CodeBag:: (Statement +/ ws)
+CodeBag = NamedCodeBag::
+ name:(name ws! ":" ws!)?
"{"
- !ws statements:(Statement +/ ws) !ws
+ ws! statements:(Statement +/ ws) ws!
"}"
- (!ws ";")?
-
-Port = Port:: shipname ("." portname)*
-shipname = ShipName:: name index?
-portname = PortName:: name index?
-name = [A-Za-z0-9\[\]\.]**
+ (ws! ";")?!
+
+//Port = Port:: shipname ("." portname)*
+Port = Port:: shipname "." portname
+ | Port:: shipname
+shipname = ShipName:: name (index?)
+portname = PortName:: name (index?)
+name = [A-Za-z0-9\[\]]**
index = "[" [0-9]+ "]"
| [0-9]+
+int = [0-9]++
+