代码之家  ›  专栏  ›  技术社区  ›  machine_1

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

  •  4
  • machine_1  · 技术社区  · 6 年前

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

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

    int (x) = 0;
    

    C程序员看了这条语句可能会对它的有效性犹豫不决,直到他试图编译它,他可能不知道它实际上是有效的C。当然,很容易看出它与 int x = 0; 以及围绕 x 是多余的,但是对于第一次看到它的程序员来说,它是否被允许并不清楚。

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

    2 回复  |  直到 6 年前
        1
  •  6
  •   Petr Skocik    6 年前

    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 )
    

    然后 x 在里面 int x = 0; direct-declarator direct-declarator ::= ( declarator )

        2
  •  1
  •   KamilCuk    6 年前

    在标准中。你必须买它,或者和它一起工作 draft . 这个 Annex A