LINUX.ORG.RU

Помогите прочитать сишную грамматику

 ,


2

1

Не могу распарсить вот это:

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
	;

init_declarator_list
	: init_declarator
	| init_declarator_list ',' init_declarator
	;

init_declarator
	: declarator
	| declarator '=' initializer
	;

storage_class_specifier
	: TYPEDEF
	| EXTERN
	| STATIC
	| AUTO
	| REGISTER
	;

type_specifier
	: VOID
	| CHAR
	| SHORT
	| INT
	| LONG
	| FLOAT
	| DOUBLE
	| SIGNED
	| UNSIGNED
	| struct_or_union_specifier
	| enum_specifier
	| TYPE_NAME
	;
Как по ним составить все возможные варианты объявлений? Приведите примеры ппожалуйста.

Deleted

Как по ним составить все возможные варианты объявлений?

Плясать надо начинать от declaration, там будет ветвление на два варианта: просто declaration_specifiers и declaration_specifiers c init_declarator_list, потом ветвить каждый из этих вариантов — и так до скончания времён. Не очень понял, зачем это понадобилось.

CARS ★★★★
()

Удваиваю Книгу Дракона дико. В крайнем случае можно брошюрку Вирта почитать, но там многих интересных вещей нет. А тебе зачем?

Lilly
()
Ответ на: комментарий от Kotolegokot

синтаксически корректная. семантически некорректная.

или ты думал, что грамматика описывает весь язык?

prog.c:1:1: error: duplicate ‘typedef’
anonymous
()

man BNF, это очень просто на самом деле.

crowbar
()

Ты не можешь это понять или написать парсер?

Как по ним составить все возможные варианты объявлений?

Написать программу, которой скармливаешь это и она высирает все возможные варианты, исходя из того что ты ей дал?

Или просто программу которая высрет все возможные варианты, исходя из конкретно этой грамматики?

Kuzy ★★★
()

Это не сишная грамматика, тут нихрена нет по сути. Более-менее вменяемую грамматику (которая корректно распарсит почти любой подсунутый тобой исходник) можно найти в ANTLR: https://github.com/antlr/grammars-v4/blob/master/c/C.g4

Reinar
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.