DOC ::= (VAR_DECL | RULE)* RULE ::= TARGET rarrow DEPS BLOCK TARGET ::= LITERAL+ DEPS ::= LITERAL* BLOCK ::= obrace CMD_LST cbrace CMD_LST ::= (CMD (comma CMD)* comma?)? CMD ::= LITERAL* LITERAL ::= | ident | var | generic | ARRAY | INDEX VAR_DECL ::= var assign (LITERAL | ARRAY | INDEX) ARRAY ::= opar LITERAL* cpar INDEX ::= | (var|ARRAY) osquare ident (assign ident)? csquare