Грамматика необходима, но не достаточна для описания действительной программы на Си. Для этого вам нужно ограничения от стандарта тоже. Более простым примером этого будет 0++
, который соответствует синтаксису выражения C, но, безусловно, не является допустимым фрагментом программы ...
C11 6.9.1p2 :
- Идентификатор, объявленный в определении функции (который является именем функции) должен иметь тип функции, как указано в части объявления определения функции. [162]
Сноска 162 объясняет, что намерение ограничения заключается в том, что typedef
нельзя использовать , то есть
typedef int F(void);
F f { /* ... */ }
не будет действительным, даже если такое typedef
может использоваться для функции объявление , т.е.
F f;
объявит функцию
int f(void);
Но само существование этого ограничения также доказывает, что грамматика BNF сама по себе недостаточна в этом случае. Следовательно, вы правы в том, что грамматика будет рассматривать такой фрагмент как определение функции.