在哪里可以找到实现编译器所需的完整 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 代码的编译器就足够了,即使我的意图不是编写一个编译器,但我的项目需要完整的语法细节。
最后的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;
中的 x
是 direct-declarator
并且语法允许在其周围使用括号(产生式 direct-declarator ::= ( declarator )
)。
我的目标不是编写 C 编译器,但我确实需要 C 编程语言的完整语法。这将使我能够更轻松地编写程序来格式化、管理和分析 C 程序和库。为了实现这一目标,我别无选择,只能掌握该语言的整个语法。
语法应清楚说明什么是有效的,什么是无效的。考虑以下代码行:
int (x) = 0;
一个 C 程序员看到这个语句可能会犹豫它的有效性,直到他尝试编译它,他可能不知道它实际上是有效的 C。当然,很容易看出它等同于 int x = 0;
和 x
两边的圆括号是多余的,但对于第一次看到它的程序员来说是否允许它并不清楚。
这是我需要的有关语言完整语法的详细程度。对于一个实现者来说,用它来编写一个可以编译任何 C 代码的编译器就足够了,即使我的意图不是编写一个编译器,但我的项目需要完整的语法细节。
最后的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;
中的 x
是 direct-declarator
并且语法允许在其周围使用括号(产生式 direct-declarator ::= ( declarator )
)。