почему `int test {}` является определением функции в языке C BNF - PullRequest
6 голосов
/ 22 марта 2019

Я заинтересован в известном синтаксисе C в форме Бэкуса-Наура и некоторое время изучал, что меня смущает то, что какой-то синтаксис выглядит неправильно для меня, но считается правильным в соответствии с BNF .

Например, int test {}, что это? Я думаю, что это плохой синтаксис в C, но правда в том, что BNF считает это определением функции:

int -> type_const -> type_spec -> decl_specs
test-> id -> direct_declarator -> declarator
'{' '}' -> compound_stat
decl_specs declarator compound_stat -> function_definition

Я пробовал это с зубром, он считал ввод int test {} правильной формой, но я попробовал это на компиляторе C, он не скомпилируется.

Итак, есть вопросы:

  1. int test {} правильный синтаксис или нет?
  2. Если это правильный синтаксис, что это значит и почему компилятор его не распознал?
  3. Если это неправильный синтаксис, могу ли я сказать, что BNF не является строгим? И означает ли это, что современный компилятор C не придерживается этого BNF?

Ответы [ 2 ]

4 голосов
/ 22 марта 2019

Грамматика необходима, но не достаточна для описания действительной программы на Си. Для этого вам нужно ограничения от стандарта тоже. Более простым примером этого будет 0++, который соответствует синтаксису выражения C, но, безусловно, не является допустимым фрагментом программы ...

C11 6.9.1p2 :

  1. Идентификатор, объявленный в определении функции (который является именем функции) должен иметь тип функции, как указано в части объявления определения функции. [162]

Сноска 162 объясняет, что намерение ограничения заключается в том, что typedef нельзя использовать , то есть

typedef int F(void);
F f { /* ... */ }

не будет действительным, даже если такое typedef может использоваться для функции объявление , т.е.

F f;

объявит функцию

int f(void);

Но само существование этого ограничения также доказывает, что грамматика BNF сама по себе недостаточна в этом случае. Следовательно, вы правы в том, что грамматика будет рассматривать такой фрагмент как определение функции.

1 голос
/ 22 марта 2019

Форма BNF - это точный способ описания синтаксиса языка, то есть того, что нужно сделать, чтобы получить дерево синтаксического анализа, начиная с необработанного ввода.

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

Если вы изучаете грамматику языка C, будьте осторожны, поскольку она не контекстно-зависимая, а контекстно-зависимая, что означает решение о выбореПравило или другое зависит от того, что находится вокруг этой точки на входе.

Прочтите о lexer hack, чтобы узнать, как правильно интерпретировать форму Бэкуса-Наура грамматики Си.

...