Это не проблема приоритета, это проблема типа, и поэтому она должна быть обработана средством проверки типов.
У вас может возникнуть желание разделить вашу грамматику на такие правила, как integerExpression
и booleanExpression
, и, безусловно, возможно создать грамматику, отклоняющую 1 and 2
таким образом. Но этот подход делает вашу грамматику излишне сложной и достигнет своих пределов, когда ваш язык станет еще немного более мощным. Например, когда вы вводите переменные, вы хотите разрешить a and b
тогда и только тогда, когда a
и b
являются булевыми переменными, но это не то, что вы можете сказать, просто взглянув на выражение. Поэтому в этом сценарии (и во многих других) вам понадобится код Java (или язык, который вы используете) для проверки типов в любом случае.
Итак, в заключение вы должны оставить грамматику как есть и отклонить 1 and 2
в средстве проверки типов.