Где я могу найти полный синтаксис C, который необходим для реализации компилятора? - PullRequest
0 голосов
/ 27 января 2019

Моя цель не состоит в том, чтобы писать компилятор C, однако мне требуется полный синтаксис языка программирования C. Это позволит мне писать программы для более удобного форматирования, управления и анализа программ и библиотек на Си. Для этого у меня нет другого выбора, кроме как получить полный синтаксис языка.

Синтаксис должен четко указывать, что является действительным, а что нет. Рассмотрим следующую строку кода:

int (x) = 0;

Программист переменного тока, взглянув на это утверждение, может сомневаться в его достоверности, и пока он не попытается скомпилировать его, он может не знать, что это действительно допустимый C. Конечно, легко сказать, что оно эквивалентно int x = 0; и что заключенные в скобки вокруг x являются избыточными, но для программиста, который впервые его видит, неясно, разрешено это или нет.

Это уровень детализации, который мне требуется в отношении полного синтаксиса языка. Разработчику должно быть достаточно использовать его для написания компилятора, который может скомпилировать любой код на Си, даже если я не собираюсь писать компилятор, но для моего проекта требуются полные синтаксические сведения.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

В стандарте C перечислены полная грамматика в конце.

В http://www.lysator.liu.se/c/ANSI-C-grammar-y.html он находится в форме, компилируемой yacc / bison.

int (x) = 0;

действительно, потому что при объединении

(6.7) declaration:
                declaration-specifiers init-declarator-listopt ;
                static_assert-declaration
(6.7) declaration-specifiers:
                storage-class-specifier declaration-specifiersopt
                type-specifier declaration-specifiersopt
                type-qualifier declaration-specifiersopt
                function-specifier declaration-specifiersopt
                alignment-specifier declaration-specifiersopt
(6.7) init-declarator-list:
                init-declarator
                init-declarator-list , init-declarator
(6.7) init-declarator:
                declarator
                declarator = initializer

с

(6.7.6) declarator:
               pointeropt direct-declarator
(6.7.6) direct-declarator:
                identifier
                ( declarator )
                direct-declarator [ type-qualifier-listopt assignment-expressionopt ]
                direct-declarator [ static type-qualifier-listopt assignment-expression ]
                direct-declarator [ type-qualifier-list static assignment-expression ]
                direct-declarator [ type-qualifier-listopt * ]
                direct-declarator ( parameter-type-list )
                direct-declarator ( identifier-listopt )

затем x в int x = 0; равно direct-declarator, и грамматика допускает скобки вокруг него (производство direct-declarator ::= ( declarator )).

0 голосов
/ 27 января 2019

в стандарте. Вы должны купить его или работать с черновиком . Приложение A описывает лексическую грамматику языка.

...