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