// 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 Program = Statement+ /ws Statement = Move ";"? /ws | "{" Statement* "}" | Port "RENAMES" Port "ENDRENAME" ";" /ws // | "#define" Port Port /ws Move = Source ^"->" Destination /ws | Source ^"=>" Destination /ws | Destination ^":=" Source /ws Destination = Port +/ (ws "," ws) Source = Port | CodeBag CodeBag = CodeBagName? "{" Statement* "}" ";"? /ws // Note: this deviates from ies06 Port = 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 //