1 // The FLEET Assembly Language Grammar
4 // Note that this is the *entire, complete* formal specification of
5 // the grammar. An equivalent lex+yacc grammar and support code would
6 // be several times as long.
8 Comment = "//" ~[\n]* "\n"
10 ws = ([\r\n ] | Comment)* -> ~[\r\n ]
13 Program = Program:: Directive+/ws
14 | Program:: (Directive+/ws) ws! CodeBagBody
16 Statement = Fiber:: Source ws! ":" ws! (Instruction +/ ws)
17 | Literal:: int ":" "sendto" Port /ws
18 | NamedCodeBag:: name ":" "{" CodeBagBody "}" /ws
20 Instruction = Instruction:: (Brack:: "[" (int|(Star::"*"))? ("r")? "]" ws!)? (Command +/ (ws! "," ws!) ws! ";"!)
21 Command = Kill:: "kill"
25 | SendTo:: "sendto" ws! Port
27 | Ack:: "ack" ws! Port
33 Port = Port:: shipname "." portname
36 CodeBagBody = Statement +/ (ws (";" ws)?!)
37 CodeBag = CodeBagRef:: CodeBagName
38 | AnonymousCodeBag:: "{" CodeBagBody "}" /ws
43 name = Name:: [A-Za-z] [A-Za-z0-9\[\]_]**
44 index = "[" [0-9]+ "]" | [0-9]+
46 ShipSpecific = ShipSpecific:: "\"" ~[\"]++ "\""
48 // the following are not part of the official FLEET syntax and are
49 // specific to Adam's interpreter.
51 Directive = Memory:: "#memory" "{" (int +/ (ws! "," ws!)) "}" /ws
52 | Import:: "#import" [A-Za-z_.]++ /ws
53 | Include:: "#include" ("\"" (~[\"])+ "\"") /ws
54 | Ship:: "#ship" shipname ":" [0-9A-Za-z_.]++ /ws