Зачем указывать отдельную продукцию для оператора присваивания с символом `=` вместо символа `AssignmentOperator`

Грамматика EcmaScript для AssignmentExpression определяет следующее:

AssignmentExpression :
    ConditionalExpression
    YieldExpression
    ArrowFunction
    AsyncArrowFunction
    LeftHandSideExpression = AssignmentExpression                     <-------------- here
    LeftHandSideExpression AssignmentOperator AssignmentExpression

AssignmentOperator : one of
    *= /= %= += -= <<= >>= >>>= &= ^= |= **=

Мне интересно, что является обоснованием определения LeftHandSideExpression = AssignmentExpression как отдельное производство вместо простого включения = в AssignmentOperator?

1 ответ

Решение

Грамматика была бы полностью эквивалентна, если бы два производства были объединены.

Тем не менее, в спецификации есть несколько мест, где эти два произведения рассматриваются по-разному. Например, в разделе "Статическая семантика" сразу после грамматики, а затем в разделе "Назначение деструктурирования", который применяется только к = производство.

Если бы эти два произведения были одним, фразы, относящиеся к ним, должны были бы быть более неловкими, например: "LeftHandSideExpression AssignmentOperator AssignmentExpression когда AssignmentOperator является =".

Итак, предположительно, эти два произведения были записаны по отдельности, поэтому проще и менее запутанно говорить о них отдельно в тексте.