Я бы посоветовал взглянуть на примеры грамматик на сайте antlr. Ява грамматика делает то, что вы хотите.
Обычно вы можете сделать что-то вроде этого:
expr : andexpr;
andexpr : orexpr (AND andexpr)*;
orexpr : notexpr (OR orexpr)*;
notexpr : atom | NOT expr;
Ключ в том, что каждое выражение может заканчиваться атомом.