Просматривая грамматику BNF в C, я подумал, что странно, что производственное правило для объявления выглядит следующим образом (согласно https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
Зачем использовать *
квантификатор (имеется в виду ноль или более вхождений) для init-declarator
? Это позволяет синтаксически допустимым операторам типа int;
или void;
быть, даже если они семантически недействительны. Разве они не могли просто использовать +
квантификатор (одно или несколько вхождений) вместо *
правила производства?
Я попытался скомпилировать простую программу, чтобы увидеть, что выводит компилятор, и все, что он делает, это выдает предупреждение.
Входные данные:
int main(void) {
int;
}
Вывод:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
int
в качестве типа возврата для main
и не используйте ()
в качестве списка типов параметров в функциях, но (void)
вместо этого.