// 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]* "*/" w = [\r\n ]* ws = (w | Comment)* -> ~[\r\n ] s = ws! Program ws! Program = Program:: (Directive ws!)* CodeBagBody 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 Move = Source ^"->" Destination /ws | Source ^"->*" Destination /ws | Port ^":=" Source /ws Destination = Port +/ (ws! "," ws!) Source = Port | CodeBag CodeBagBody = CodeBag:: (Statement +/ ws) CodeBag = NamedCodeBag:: name:(name ws! ":" ws!)? "{" ws! statements:(Statement +/ ws) ws! "}" (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]++