在哪里可以找到实现编译器所需的完整 C 语法?

Where can I find the full syntax of C that is necessary to implement a compiler?

我的目标不是编写 C 编译器,但我确实需要 C 编程语言的完整语法。这将使我能够更轻松地编写程序来格式化、管理和分析 C 程序和库。为了实现这一目标,我别无选择,只能掌握该语言的整个语法。

语法应清楚说明什么是有效的,什么是无效的。考虑以下代码行:

int (x) = 0;

一个 C 程序员看到这个语句可能会犹豫它的有效性,直到他尝试编译它,他可能不知道它实际上是有效的 C。当然,很容易看出它等同于 int x = 0;x 两边的圆括号是多余的,但对于第一次看到它的程序员来说是否允许它并不清楚。

这是我需要的有关语言完整语法的详细程度。对于一个实现者来说,用它来编写一个可以编译任何 C 代码的编译器就足够了,即使我的意图不是编写一个编译器,但我的项目需要完整的语法细节。

在标准中。您必须购买它或使用 draft. The Annex A 描述语言的词汇语法。

最后的C standard lists the complete grammar

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 )

然后 int x = 0; 中的 xdirect-declarator 并且语法允许在其周围使用括号(产生式 direct-declarator ::= ( declarator ))。