// // 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 //