【編譯原理】C語言完整文法(包括預處理器文法)
說明:
????以下內容基于ISO C89標準。其中,一行開頭的 | 表示或者的意思,[]里面的內容是可選的。不是行頭的 | 都是 字符 '|' 的意思,如果文法中用到字符 [ ],則使用 '[' 和 ']'表示。
????該文法適合用來理解C語言的文法,但不適合用來寫編譯器。因為該文法中有大量左遞歸和左公因子,且是二義性的,總共有 500 行左右,最重要的一點是它不是上下文無關的,所以編譯原理中的LL分析法和LR分析法都派不上用場 T_T。
????也就是說,對該文法做一些特殊處理才能夠用于C編譯器的開發(fā)。
????該文法的開始符號是: 翻譯單元?translation_unit。
????純手打。

C89文法
一、詞法
1. 單詞, 預處理單詞
token :?
? ? keyword?
? ? identifier
? ? constant
? ? string_literal
? ? operator
? ? punctuator
preprocessing_token :?
? ? header_name?
? ? identifier
? ? pp_number
? ? character_constant
? ? string_literal
? ? operator
? ? punctuator
? ? 不在上述范圍內的任一非空白符
2. 關鍵字
keyword:
auto ? ? double ? ? int ? ? ? ? struct
break ? ? else? ? ? ? long ? ? switch
case? ? ? ? enum? ? ? ? register typedef
char ? ? extern ? ? return? union
const ? ? float ? ? short ? ? unsigned
for ? ? signed ? ? void default
goto ? ? sizeof ? ? volatile do
if ? ? ? ? static ? ? while? ? ? ?continue
3. 標識符
identifier :
? ? nodigit
? ? identifier nodigit
? ? identifier digit
nodigit :?
? ? _ a b c d e f g h i j k l m n o p q r s t
? ? u v w x y z A B C D E F G H I J K L M N O
? ? P Q R S T U V W X Y Z
digit :
? ? 0 1 2 3 4 5 6 7 8 9
4. 常量
constant :
? ? floating_constant
? ? | integer_constant
? ? | enumeration_constant
? ? | character_constant
floating_constant :
? ? fractional_constant [exponent_part] [floating_suffix]
| digit_sequence exponent_part [floating_suffix]
fractional_constant :?
[digit_sequence] . digit_sequence
? ? | digit_sequence
exponent_part:
? ? e [sign] digit_sequence
? ? | E [sign] digit_sequence
sign:
? ? + | -
digit_sequence:
? ? digit
? ? | digit_sequence digit
floating_suffix:
? ? f | l | F | L
integer_constant:
? ? decimal_constant [integer_suffix]
? ? | octal_contant [integer_suffix]
? ? | hexadecimal_constant [integer_suffix]
decimal_constant:
? ? nonzero_digit
? ? | decimal_constant digit
octal_contant:
? ? 0
? ? | octal_contant octal_digit
hexadecimal_constant:
? ? 0x hexadecimal_digit
? ? | 0X hexadecimal_digit
? ? | hexadecimal_constant hexadecimal_digit
nonzero_digit:
? ? 1 2 3 4 5 6 7 8 9
octal_digit:
? ? 0 1 2 3 4 5 6 7
hexadecimal_digit:
? ? ?0 1 2 3 4? 5 6 7 8 9
? ? ?a b c d e f g
? ? ?A B C D E F G
integer_suffix:
? ? unsigned_suffix [long_suffix]
? ? | long_suffix [unsigned_suffix]
unsigned_suffix :
? ? u | U
long_suffix :
? ? l | L
enumeration_constant :
? ? identifier
character_constant:
? ? ' c_char_sequence '
? ? | L' c_char_sequence '
c_char_sequence:
? ? c_char
? ? | c_char_sequence c_char
c_char:
? ? 源字符集中除 單引號 ',右反斜線 \,換行符 \n 外的所有字符
? ? | escape_sequence
escape_sequence:
? ? simple_escape_sequence
? ? | octal_escape_sequence
? ? | hexadecimal_escape_sequence
simple_escape_sequence: \' | \" | \? | \\ | \a | \b | \f | \n | \r | \t | \v
octal_escape_sequence:
? ? \ octal_digit
? ? | \ octal_digit octal_digit
? ? | \ octal_digit octal_digit octal_digit
hexadecimal_escape_sequence:
? ? \x hexadecimal_digit
? ? | hexadecimal_escape_sequence hexadecimal_digit
5. 字符串字面量
string_literal:
? ? " [s_char_sequence] "
? ? | L" [s_char_sequence] "
s_char_sequence:
? ? s_char
? ? | s_char_sequence s_char
s_char:
? ? 源字符集中除 雙引號 ",右反斜線 \,換行符 \n 外的所有字符
? ? | escape_sequence
6. 運算符
operator:
? ? [ ] ( ) . -> ++ -- & * + - ! sizeof / % << >> < > <= >= != ^ | && ||
? ? = *= /= %= += -= <<= >>= &= ^= |= , # ##
7. 標點符號
punctuator:
? ? [ ] ( ) { } * , : = ; ... #
8. 標頭名
header_name:
? ? < h_char_sequence >
? ? " q_char_sequence "
h_char_sequence:
? ? h_char
? ? | h_char_sequence h_char
h_char:
? ? 源字符集中除 換行符 \n , 大于號 > 外的所有字符
q_char_sequence:
? ? q_char
? ? | q_char_sequence q_char
q_char:
? ? 源字符集中除 換行符 \n , 雙引號" 外的所有字符
9. 預處理數(shù)字
pp_number:
? ? digit
? ? | .digit
? ? | pp_number digit
? ? | pp_number nonzero_digit
? ? | pp_number e sign
? ? | pp_number E sign
? ? | pp_number .
二、語法
1. 表達式
primary_expression:
? ? identifier
? ? | constant
? ? | string_literal
? ? | (expression)
postfix_expression:
? ? primary_expression
? ? | postfix_expression '[' expression ']'
? ? | postfix_expression ([argument_expression_list])
? ? | postfix_expression . identifier
? ? | postfix_expression -> identifier
? ? | postfix_expression ++
? ? | postfix_expression --
argument_expression_list:
? ? assignment_expression
? ? | assignmant_expression_list , assignment_expression
unary_expression:
? ? postfix_expression
? ? | ++ unary_expression
? ? | -- unary_expression
? ? | unary_operator cast_expression
? ? | sizeof unary_expression
? ? | sizeof (type_name)
unary_operator:
? ? & * + - ~ !
cast_expression:
? ? unary_expression
? ? | (type_name) cast_expression
multiplicative_expression:
? ? cast_expression
? ? | multiplicative_expression * cast_expression
? ? | multiplicative_expression / cast_expression
? ? | multiplicative_expression % cast_expression
|?
addtive_expression:
? ? multiplicative_expression
? ? | addtive_expression + multiplicative_expression
? ? | addtive_expression - multiplicative_expression
shift_expression:
? ? addtive_expression
? ? | shift_expression << addtive_expression
? ? | shift_expression >> addtive_expression
relational_expression:
? ? shift_expression
? ? | relational_expression < shift_expression
? ? | relational_expression <= shift_expression
? ? | relational_expression > shift_expression
? ? | relational_expression >= shift_expression
equality_expression:
? ? relational_expression
? ? | equality_expression == relational_expression
? ? | equality_expression != relational_expression
and_expression:
? ? equality_expression
? ? | and_expression & relational_expression
exclusive_or_expression:
? ? and_expression
? ? | exclusive_or_expression ^ and_expression
inclusive_or_expression:
? ? exclusive_or_expression
? ? | inclusive_or_expression | exclusive_or_expression
logical_and_expression:
? ? inclusive_or_expression
? ? | logical_and_expression && inclusive_or_expression
logical_or_expression:
? ? logical_and_expression
? ? | logical_or_expression || logical_and_expression
conditional_expression:
? ? logical_or_expression?
? ? | logical_or_expression ? expression : conditional_expression
assignment_expression:
? ? conditional_expression
? ? | unary_expression assignment_operator assignment_expression
assignment_operator:
? ? = *= /= %= += -= <<= >>= &= ^= |=
expression:
? ? assignment_expression
? ? | expression assignment_expression
constant_expression:
? ? conditional_expression
2. 聲明
declaration:
? ? declaration_specifier [init_declaratior_list] ;
declaration_specifier:
? ? storage_class_specifier [declaration_specifier]
? ? | type_specifer [declaration_specifier]
? ? | type_qualifier [declaration_specifier]
init_declaratior_list:
? ? init_declarator
? ? | init_declaratior_list , init_declarator
init_declarator:
? ? declarator
? ? | declarator = initializer
storage_class_specifier:
? ? typedef
? ? | extern
? ? | static
? ? | auto
? ? | register
type_specifer:
? ? void
? ? | char
? ? | short
? ? | int
? ? | long
? ? | float
? ? | double
? ? | signed
? ? | unsigned
? ? | struct_or_union_specifer
? ? | enum_specifier
? ? | typedef_name
struct_or_union_specifer:
? ? struct_or_union [identifier] { struct_declaration_list}
? ? | struct_or_union identifier
struct_or_union:
? ? struct
? ? | union
struct_declaration_list:
? ? struct_declaration
? ? | struct_declaration_list struct_declaration
struct_declaration:
? ? specifier_qualifier_list struct_declarator_list;
specifier_qualifier_list:
? ? type_specifer [specifier_qualifier_list]
? ? | type_qualifier [specifier_qualifier_list]
struct_declarator_list:
? ? struct_declarator
? ? | struct_declarator_list, struct_declarator
struct_declarator:
? ? declarator
? ? | [declarator] : constant_expression
enum_specifier:
? ? enum [identifier] {enumerator_list}
? ? | enum identifier
enumerator_list:
? ? enumerator
? ? | enumerator_list, enumerator
enumerator:
? ? enumeration_constant
? ? | enumeration_constant = constant_expression
enumeration_constant:
? ? identifier
type_qualifier:
? ? const
? ? | volatile
parameter_declaration:
? ? declaration_specifier declarator
? ? | declaration_specifier [abstract_declarator]
declarator:
? ? [pointer] direct_declarator
abstract_declarator:
? ? pointer
? ? | [pointer] direct_abstract_delarator
direct_declarator:
? ? identifier
? ? | (declarator)
? ? | direct_declarator '[' [ constant_expression ] ']'
? ? | direct_declarator (parameter_type_list)
? ? | direct_declarator ( [identifier_list] )
direct_abstract_delarator:
? ?(abstract_declarator)
? ?| [direct_abstract_delarator] '[' [constant_expression] ']'
? ?| [direct_abstract_delarator] ( [parameter_type_list] )
pointer:
? ? * [type_qualifier_list]
? ? | * [type_qualifier_list] pointer
type_qualifier_list:
? ? type_qualifier
? ? | type_qualifier_list type_qualifier
parameter_type_list:
? ? parameter_list
? ? | parameter_list, ...
parameter_list:
? ? parameter_declaration
? ? | parameter_list, parameter_declaration
identifier_list:
? ? identifier
? ? | identifier_list, identifier
type_name:
? ? specifier_qualifier_list [abstract_declarator]
specifier_qualifier_list:
? ? type_specifer [specifier_qualifier_list]
? ? | type_qualifier [specifier_qualifier_list]
typedef_name:
? ? identifier
initializer:
? ? assignment_expression
? ? | {initializer_list}
? ? | {initializer_list,}
initializer_list:
? ? initializer
? ? | initializer_list, initializer
3. 語句
statement:
? ? labeled_statement
? ? | compound_statement
? ? | expression_statement
? ? | selection_statement
? ? | iteration_statement
? ? | jump_statement
labeled_statement:
? ? identifier : statement
? ? | case constant_expression : statement
? ? | default : statement
compound_statement:
? ? {[declaration_list] [statement_list]}
declaration_list:
? ? declaration
? ? | declaration_list declaration
statement_list:
? ? statement
? ? | statement_list statement
expression_statement:
? ? [expression] ;
selection_statement:
? ? if(expression) statement
? ? | if(expression) statement else statement
? ? | switch(expression) statement
iteration_statement:
? ? while(expression) statement
? ? | do statement while(expression) ;
? ? | for([expression] ; [expression] ; [expression]) statement
jump_statement:
? ? goto identifier ;
? ? | continue ;
? ? | break ;
? ? | return [expression] ;
4. 外部定義
translation_unit:
? ? external_declaration
? ? | translation_unit external_declaration
external_declaration:
? ? functionn_definition
? ? | declaration
functionn_definition:
? ? | [declaration_specifier] declarator [declaration_list] compound_statement
6. 預處理命令
preprocessing_file:
? ? [group]
group:
? ? gruop_part
? ? | group gruop_part
gruop_part:
? ? [pp_tokens] new_line
? ? | if_section
? ? | control_line
if_section:
? ? if_group [elif_groups] [else_group] endif_line
if_group:
? ? # if constant_expression new_line [group]
? ? | # ifdef identifier new_line [group]
? ? | #ifndef identifier new_line [group]
elif_groups:
? ? elif_group
? ? | elif_groups elif_group
elif_group:
? ? # elif constant_expression new_line [group]
else_group:
? ? # else new_line [group]
endif_line:
? ? # endif new_line
control_line:
? ? # include pp_tokens new_line
? ? | # define identifier replacement_list new_line
? ? | # define identifier lparen [identifier_list] ) replacement_list new_line
? ? | # undef identifier new_line
? ? | # line pp_tokens new_line
? ? | # error [pp_tokens] new_line
? ? | # pragma [pp_tokens] new_line
? ? | # new_line
lparen:
? ? 前面沒有空白符的左括號(
replacement_list:
? ? [pp_tokens]
pp_tokens:
? ? preprocessing_token
? ? | pp_tokens preprocessing_token
new_line:
? ? 換行符\n