Выглядит странно, что вы хотите отменить приоритет умножения над сложением, но в любом случае, если вам нужна грамматика таким образом, то правильным будет BNF (вы сделали опечатку в третьем произведении)
<assign> -> id = <expr>
<id> -> A | B | C
<expr> -> <expr> * <term> | <term>
<term> -> <term> + <factor> | <factor>
<factor> -> ( <expr> ) | <id>
Что подходит для синтаксического анализатора LR (снизу вверх).
Для синтаксического анализатора LL (сверху вниз) приведенная выше грамматика вызовет рекурсию влево на <expr>
и <term>
.Чтобы обойти эту проблему, вы должны использовать эту грамматику для анализаторов LL:
<assign> -> id = <expr>
<id> -> A | B | C
<expr> -> <term> * <expr> | <term>
<term> -> <factor> + <term> | <factor>
<factor> -> ( <expr> ) | <id>