我该在哪里找到实现编译器所必需的C语言完整语法?

4

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

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

int (x) = 0;

一位C程序员看到这个语句可能会对其有效性产生疑虑,除非他尝试编译它,否则他可能不知道它实际上是有效的C代码。当然,很容易看出它等同于int x = 0;,并且括号中的x是多余的,但对于第一次看到它的程序员来说,它是否允许使用并不清楚。
我需要关于语言完整语法的详细信息。它必须足够详细,以便实现者可以使用它编写编译器,可以编译任何C代码,即使我的意图不是编写编译器,但对于我的项目而言,仍需要完整的语法细节。

2
请求链接的话题不在讨论范围内,但您需要的是C语言标准 - dbush
@dbush 在标准中有没有提到可以写类似 int (x) = 0; 这样的语句? - machine_1
我不确定这是否完整,但我通过在Google上搜索“C的BNF语法”找到了https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm。您可以随时下载C编译器源代码,并可能会有lex的输入文件。正如其他人所说,仍需要完整的草案... - Bob Shaffer
@machine_1 第6.7.6节,特别是第6段。 - dbush
2个回答

5

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 )

int x = 0; 中,x直接声明符,语法允许在它周围加上括号(产生式为 direct-declarator ::= ( declarator ))。


1
在标准中,您必须购买它或使用draft附录A描述了该语言的词法语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接