Пытаясь понять грамматику C - PullRequest
0 голосов
/ 01 мая 2019

Я начал свой путь с рекурсивных синтаксических анализаторов и изучал грамматику C, пытаясь понять, как она работает, чтобы воспроизвести ее в моем коде.

Затем я увидел это:

assignmentExpression
:   conditionalExpression
|   unaryExpression assignmentOperator assignmentExpression
|   DigitSequence // for
;

и эта часть, в частности:

unaryExpression assignmentOperator assignmentExpression

При моем (плохом и, вероятно, неправильном) понимании унарное выражение может быть константой (если вы следуете остальной части грамматики), тогда это выглядит так 1 = 1 действительно, что, очевидно, неправильно.Я искал синтаксические анализаторы C, даже исходный код GCC, и функции assignmentExpression никогда не имели никакого кода, связанного с частью unaryExpression.

Так что я действительно запутался;Я, наверное, упускаю что-то очень важное здесь.

1 Ответ

4 голосов
/ 01 мая 2019

C не полностью описывается своей грамматикой;действительная программа на С должна соответствовать грамматике, но она также должна соответствовать многим другим правилам, например правилам, относящимся к системе типов.

Итак, вы правы: 1 = 1 соответствует правилу, которое вы 'мы процитировали, но в любом случае это недопустимо, потому что левая сторона не является lvalue.

(Обратите внимание, что некоторые компиляторы могут фактически трактовать 1 = 1 как синтаксическую ошибку, потому что они могут бросить некоторые из этих другихограничения в применяемой ими грамматике. Это разрешено; спецификация дает компиляторам большую гибкость в том, как они реализуют вещи, при условии, что они правильно обрабатывают допустимые программы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...