Boolean query syntax

The complete grammar for expressing Boolean queries, in a BNF-like format, is included in this topic.

The following sample code expresses Boolean queries, in a BNF-like format:
orexpr:	  andexpr ;
				| andexpr OR orexpr ;
andexpr:	  parenexpr ;
				| parenexpr andexpr ;
				| parenexpr AND andexpr ;
				| parenexpr andnotexpr ;
andnotexpr:	  AND NOT orexpr ;
				| NOT orexpr ;
parenexpr:	  LPAREN orexpr RPAREN ;
				| terms ;
terms:	 word_or_phrase KEY_RESTRICT keyexpr ;
				| word_or_phrase NEAR/NUM word_or_phrase ;
				| word_or_phrase ONEAR/NUM word_or_phrase ;
				| multiple_word_or_phrase ;
multiple_word_or_phrase:	  word_or_phrase ;
				| word_or_phrase multiple_word_or_phrase ;
keyexpr:	 LPAREN nr_orexpr RPAREN ;
				| word_or_phrase ;
nr_orexpr:	  nr_andexpr ;
				| nr_andexpr OR nr_orexpr ;
nr_andexpr:	  nr_parenexpr ;
				| nr_parenexpr nr_andexpr ;
				| nr_parenexpr AND nr_andexpr ;
				| nr_parenexpr nr_andnotexpr ;
nr_andnotexpr:	  AND NOT nr_orexpr ;
				| NOT nr_orexpr ;
nr_notexpr:	  nr_parenexpr ;
				| NOT nr_parenexpr ;
nr_parenexpr:	  LPAREN nr_orexpr RPAREN ;
				| nr_terms ;
nr_terms:	 multiple_word_or_phrase ;
word_or_phrase:	  word ;
				| phrase ;

AND:     '[Aa]' '[Nn]' '[Dd]' ;
OR:      '[Oo]' '[Rr]' ;
NOT:     '[Nn]' '[Oo]' '[Tt]' ;
NEAR:    '[Nn]' '[Ee]' '[Aa]' '[Rr]' ;
ONEAR:   '[Oo]' '[Nn]' '[Ee]' '[Aa]' '[Rr]' ;

NUM:     '[0-9] ;
				| NUM NUM ;
LPAREN:  '(' ;
RPAREN:  ')' ;
KEY_RESTRICT:	':' ;