EBNF и грамматика C
От: FrozenHeart  
Дата: 11.02.14 18:18
Оценка:
Здравствуйте.

Я не могу никак понять то ли 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. В чём проблема? Где я что-то не понял? Подскажите, пожалуйста.
avalon/1.0.433
Re: EBNF и грамматика C
От: k.o. Россия  
Дата: 11.02.14 18:38
Оценка:
Здравствуйте, 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;' этому условию не удовлетворяет.
Re[2]: EBNF и грамматика C
От: FrozenHeart  
Дата: 11.02.14 19:27
Оценка:
Согласен, но ведь по приведённой мной ссылке находится грамматика для YACC, а он, по идее, ничего кроме того описания в качестве входных данных не имеет. Следовательно, эта самая грамматика и должна, я так понимаю, учитывать все подобные моменты, разве нет?
avalon/1.0.433
Re[3]: EBNF и грамматика C
От: watchmaker  
Дата: 11.02.14 19:52
Оценка: +1
Здравствуйте, FrozenHeart, Вы писали:

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


Нет. Когда требуется проверить корректность программы, то недостаточно ограничится только лексическим и синтаксическим анализам текста. За ними идёт семантический анализатор — он уже и выносит вердикт, принадлежит ли приведённый текст языку или нет.
Многие требования семантики практически невозможно, либо крайне сложно уложить в такую формальную процедуру как проверка на соответствие БНФ.

Конкретно в твоём же примере (с "void;") эту проверку можно осуществить и на этапе синтаксического анализа, но это потребует существенного усложнения грамматики — семантическому анализатору её сделать намного проще, поэтому она в нём и делается, а не на более ранних этапах анализа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.