Здравствуйте.
Я не могу никак понять то ли EBNF, то ли конкретно
данную грамматику.
Предположим, мы хотим узнать, из каких компонентов состоит declaration в C. Видим:
declaration
: declaration_specifiers ';'
| declaration_specifiers init_declarator_list ';'
;
declaration_specifiers
: storage_class_specifier
| storage_class_specifier declaration_specifiers
| type_specifier
| type_specifier declaration_specifiers
| type_qualifier
| type_qualifier declaration_specifiers
;
type_specifier
: VOID
| CHAR
| SHORT
| INT
| LONG
| FLOAT
| DOUBLE
| SIGNED
| UNSIGNED
| struct_or_union_specifier
| enum_specifier
| TYPE_NAME
;
Если я правильно понял, то, согласно такому описанию, конструкции наподобие
void;
также являются declarations, хотя по факту данная конструкция является невалидной по стандартам C. В чём проблема? Где я что-то не понял? Подскажите, пожалуйста.
Здравствуйте, FrozenHeart, Вы писали:
FH>Здравствуйте.
FH>Я не могу никак понять то ли EBNF, то ли конкретно данную грамматику.
FH>Предположим, мы хотим узнать, из каких компонентов состоит declaration в C. Видим:
| Скрытый текст |
| FH>declaration
FH> : declaration_specifiers ';'
FH> | declaration_specifiers init_declarator_list ';'
FH> ;
FH>declaration_specifiers
FH> : storage_class_specifier
FH> | storage_class_specifier declaration_specifiers
FH> | type_specifier
FH> | type_specifier declaration_specifiers
FH> | type_qualifier
FH> | type_qualifier declaration_specifiers
FH> ;
FH>type_specifier
FH> : VOID
FH> | CHAR
FH> | SHORT
FH> | INT
FH> | LONG
FH> | FLOAT
FH> | DOUBLE
FH> | SIGNED
FH> | UNSIGNED
FH> | struct_or_union_specifier
FH> | enum_specifier
FH> | TYPE_NAME
FH> ;
|
| |
FH>Если я правильно понял, то, согласно такому описанию, конструкции наподобие
FH>FH>void;
FH>
FH>также являются declarations, хотя по факту данная конструкция является невалидной по стандартам C. В чём проблема? Где я что-то не понял? Подскажите, пожалуйста.
Язык C задается не только грамматикой, вот, например, цитата из C99 6.7/2
A declaration shall declare at least a declarator (other than the parameters of a function or
the members of a structure or union), a tag, or the members of an enumeration.
Очевидно, 'void;' этому условию не удовлетворяет.
Согласен, но ведь по приведённой мной ссылке находится грамматика для YACC, а он, по идее, ничего кроме того описания в качестве входных данных не имеет. Следовательно, эта самая грамматика и должна, я так понимаю, учитывать все подобные моменты, разве нет?