X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=tests%2Ffleet.g;h=3f70ddf0b464c54171da8dceb3a6caef15b88ee2;hp=4d66b4dca16ac8b22dab9bfefe8689695aeef506;hb=f22d53e6ae3581e6c2dc096fd0cf93c18e2d2538;hpb=6d848551d1b490f15b63432e3a1d52a4a3240655 diff --git a/tests/fleet.g b/tests/fleet.g index 4d66b4d..3f70ddf 100644 --- a/tests/fleet.g +++ b/tests/fleet.g @@ -8,47 +8,37 @@ // the grammar. An equivalent lex+yacc grammar and support code would // be several times as long. -Comment !::= "//" ~[\n]* "\n" +Comment = "//" ~[\n]* "\n" | "/*" ~[\n]* "*/" -ws ::= w** -w ::= [\r\n ] - | Comment +w = [\r\n ]* +ws = (w | Comment)* -> ~[\r\n ] -Program ::= Statement+ /ws +s = !ws Program !ws +Program = CodeBag:: statements:(Statement +/ ws) -Statement ::= Move ";"? /ws - | "{" Statement* "}" - | Port "RENAMES" Port "ENDRENAME" ";" /ws -// | "#define" Port Port /ws +Statement = Move !((ws ";")?) + | CodeBag + | ^"#define" Port Port /ws -Move ::= Source ^"->" Destination /ws - | Source ^"=>" Destination /ws - | Destination ^":=" Source /ws +Move = Source ^"->" Destination /ws + | Source ^"->*" Destination /ws + | Port ^":=" Source /ws -Destination ::= Port +/ (ws "," ws) -Source ::= Port +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]+ "]" +CodeBag = CodeBag:: + name:(name !ws ":" !ws)? + "{" + !ws statements:(Statement +/ ws) !ws + "}" + (!ws ";")? + +Port = Port:: shipname ("." portname)* +shipname = ShipName:: name index? +portname = PortName:: name index? +name = [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 -//