Грамматика 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".

Другие вопросы по тегам