mac*_*e_1 4 c syntax implementation parsing lexical-analysis
我的目标不是编写C编译器,但我确实需要C编程语言的完整语法.这将允许我编写程序来更轻松地格式化,管理和分析C程序和库.为了达到这个目的,我除了能够掌握语言的整个语法之外别无选择.
语法应清楚地说明什么是有效的和什么是无效的.考虑以下代码行:
int (x) = 0;
Run Code Online (Sandbox Code Playgroud)
看到这个声明的AC程序员可能对它的有效性犹豫不决,直到他试图编译它,他可能不知道它实际上是有效的C.当然,很容易说它等同于int x = 0;
并且周围的括号括起来.x
是多余的,但对于第一次看到它是否被允许的程序员来说,这是不明确的.
这是关于语言的完整语法我需要的详细程度.实现者必须足以使用它来编写可编译任何C代码的编译器,即使我的目的不是编写编译器,但我的项目需要完整的语法细节.
在http://www.lysator.liu.se/c/ANSI-C-grammar-y.html,它的形式由yacc/bison编辑.
int (x) = 0;
Run Code Online (Sandbox Code Playgroud)
是有效的,因为当你结合
(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
Run Code Online (Sandbox Code Playgroud)
同
(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 )
Run Code Online (Sandbox Code Playgroud)
然后x
在int x = 0;
is direct-declarator
和语法允许括号围绕它(生产direct-declarator ::= ( declarator )
).