Policy ::=
    RepStmt, [RepStmt],
    CbtStmt?,
    [SelectStmt],
    [FilterStmt],
;

RepStmt ::=
    'REP', Number1, (* number of object replicas *)
    ('AS', Ident)?  (* optional selector name *)
;

CbtStmt ::= 'CBF', Number1 (* container backup factor *)
;

SelectStmt ::=
    'SELECT', Number1,    (* number of nodes to select without container backup factor *)
    ('IN', Clause?, Ident)?, (* bucket name *)
    FROM, (Ident | '*'),  (* filter reference or whole netmap *)
    ('AS', Ident)?        (* optional selector name *)
;

Clause ::=
      'SAME'     (* nodes from the same bucket *)
    | 'DISTINCT' (* nodes from distinct buckets *)
;

FilterStmt ::=
    'FILTER', AndChain, ['OR', AndChain],
    'AS', Ident (* obligatory filter name *)
;

AndChain ::=
    Expr, ['AND', Expr]
;

Expr ::=
      '@' Ident		   (* filter reference *)
    | Ident, Op, Value (* attribute filter *)
;

Op ::= 'EQ' | 'NE' | 'GE' | 'GT' | 'LT' | 'LE'
;

Value ::= Ident | Number | String
;

Number1 ::= Digit1 [Digit];
Number ::= Digit [Digit];

Digit1 ::= '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ;
Digit ::= '0' | Digit1;