Как вы сказали, это семантическая ошибка / нарушение ограничений.
От C11 6.5.16p2
Ограничения
Оператор присваивания должен иметь изменяемое значение lvalue в качестве своего левого операнда.
Синтаксического описания C недостаточно, чтобы отличить lvalues от non-lvalues.
Фактический результат, в котором появляется оператор присваивания, C11 6.5.16p1 :
unary-expression assignment-operator assignment-expression
И unary-expression
включает, помимо всего прочего, возможность иметь любое выражение в скобках.
Таким образом, простой синтаксический анализатор, следующий за грамматикой, действительно будет генерировать правильноеразбирать деревья для этих недопустимых выражений, и требуется дальнейший анализ, чтобы увидеть, соответствуют ли они ограничениям в стандарте.
Даже самые простые случаи, такие как
foo = 5;
, могут или не могутбыть действительным - в зависимости от того, является ли foo
изменяемым lvalue и , может ли 5
назначаться изменяемому значению типа foo
без приведения ...
ОДНАКО , есть одна маленькая вещь.Производство
unary-expression assignment-operator assignment-expression
допускает только одинарное исключение с левой стороны.Это не позволяет a + b
появляться на LHS без скобок!Кажется, что-то странное происходит со всеми компиляторами Си, которые я пробовал (GCC, MSVC, clang).Может случиться так, что все они используют грамматику C ++, а затем отсеивают невозможное.В C ++
a + b
может возвращать изменяемую ссылку, и, следовательно, должно быть разрешено появляться в левой части.