В программировании на С требуется L-значение - это семантическая ошибка или синтаксическая ошибка? - PullRequest
0 голосов
/ 18 декабря 2018
1. int main(void) 
2. { 
3.   int a =5, b = 6, c; 
4.   a + b = c; // lvalue required error
5.   2 = a ;     //lvalue required error
6. } 

4-я и 5-я строки кода считаются синтаксической ошибкой или семантической ошибкой?По моему мнению, эти строки должны выдавать синтаксическую ошибку, но я обнаружил, что контекстно-свободная грамматика может генерировать их.

1 Ответ

0 голосов
/ 18 декабря 2018

Как вы сказали, это семантическая ошибка / нарушение ограничений.

От 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

может возвращать изменяемую ссылку, и, следовательно, должно быть разрешено появляться в левой части.

...