Грамматика C генерирует недопустимое выражение
Я читаю книгу namad "Ретаргетируемый компилятор C: дизайн и реализация". В этой книге грамматика языка C выглядит так:
expression:
assignment-expression { , assignment-expression }
assignment-expression:
conditional-expression
unary-expression assign-operator assignment-expression
assign-operator:
one of= += -= *= /= %= <<= >>= &= A= I=
conditional-expression:
binary-expression [ ? expression : conditional-expression ]
binary-expression:
unary-expression { binary-operator unary-expression }
binary-operator:
one of || && '|' A & == ! = < > <= >= << >> + - * | %
unary-expression:
postfix-expression
unary-opera tor unary-expression
'(' type-name ')' unary-expression
sizeof unary-expression
sizeof '(' type-name ')'
unary-operator:
one of ++ -- & * + - - !
postfix-expression:
primary-expression { postfix-operator }
postfix-operator:
'[' expression ']'
'(' [ assignment-expression { , assignment-expression } ] ')'
. identifier
-> identifier
++
--
primary-expression:
identifier
constant
string-literal
'(' expression ')'
выражение: выражение-присваивание
затем я помещаю "выражение присваивания оператора присваивания унарного выражения" для выражения присваивания
я выбираю "sizeof '(' type-name ')'" для унарного выражения
затем я выбираю "=" для оператора присваивания
затем я выбрал "условное-выражение" для выражения-присваивания
тогда я получаю вот так:
условное-выражение -> двоичное-выражение -> унарное-выражение -> постфиксное-выражение -> первичное-выражение -> идентификатор
Итак, я могу создать такое выражение: "sizeof(int) = 7"
но это выражение невозможно на языке C. есть проблема или я неправильно сформулировал это выражение?
1 ответ
То, что что-то грамматически правильно, не означает, что это правильно с логической точки зрения. Выражение
sizeof(int) = 7
может быть грамматически правильным, но не имеет особого смысла. Так что ваш компилятор вместо того, чтобы проливать
error: syntax error
токенизирует и правильно интерпретирует утверждение и сообщит вам
error: cannot assign to result of sizeof
.
По теме вас может заинтересовать Приложение A.1 "Лексическая грамматика в проекте стандарта C11".