on filter

An on filter is a left clause and a right clause with the word on between them. Each of the clauses must be set filters.
  on-filter := left-clause 'on' right-clause
  left-clause := set-filter
  right-clause := set-filter
The set associated with an on filter in a position is the intersection of the sets associated with its left clause and right clause in that position. For example,
  B on between (A A)
matches any square in a position that has white Bishop on it between two white pieces. The left clause of the on filter is B which is a piece designator filter and is associated with the set of squares that has a white Bishop on it. The right clause is between (A A) which is a between filter and is associated with the set of squares between two white pieces.

on filters may be chained:

    B on between (A A) on attack (a A)
will match the set of squares in a position that has a white Bishop on it between two white pieces and that is attacked by a black piece. This is technically a single on filter whose left clause is the piece designator filter B and whose right clause is the on filter whose left clause is the between filter between (A A) and whose right clause is the attack filter attack (a A).

Examples