--- /dev/null
+//
+// The FLEET Assembly Language Grammar
+// As specified in document 2005-ucies06
+//
+
+// comments are included where the grammar had to go beyond the strict
+// "letter of the law" in ies06
+
+//
+// Note that this is the *entire, complete* formal specification of
+// the grammar. An equivalent lex+yacc grammar and support code would
+// be several times as long.
+//
+
+Comment !::= "//" ~[\n]* "\n"
+ | "/*" ~[\n]* "*/"
+
+ws ::= w**
+w ::= [\r\n ]
+ | Comment
+
+Statement ::= Move ";"? /ws
+ | "{" Statement* "}"
+ | Port "RENAMES" Port "ENDRENAME" ";" /ws
+
+Move ::= Source ^"->" Destination /ws
+ | Destination ^":=" Source /ws
+
+Destination ::= Port +/ (ws "," ws)
+Source ::= Port
+ | CodeBag
+
+CodeBag ::= CodeBagName? "{" Statement* "}" ";"? /ws
+
+// Note: this deviates from ies06
+location ::= shipname ("." portname)?
+shipname ::= name index?
+portname ::= name index?
+name ::= [A-Za-z] [A-Za-z0-9\[\]\.]*
+index ::= "[" [0-9]+ "]"
+ | [0-9]+
+
+
+//
+// The syntax should be rather self-explanatory; here are some of the
+// grammatical operators you may not have seen before:
+//
+// ^ marks the "key" token; this is used only after parsing
+// / separated-by; all preceding elements are separated by the following element
+// +/ one-or-more-with-separator; for example, "a"+/"," matches "a,a,a"
+// */ zero-or-more-with-separator
+// & intersection; a&b matches a string only if a matches it and b matches it
+// &~ negated intersection; a&~b matches a string only if a matches it and b DOES NOT match it
+//