天天看點

1029 C語言文法定義

program à

       external_declaration

      | program external_declaration

<源程式> ->  <外部聲明> |  <源程式>  <外部聲明>

external_declaration à

      function_definition

      | declaration

<外部聲明>  ->   <函數定義>  |  <聲明>

function_definition à type_specifier declarator compound_statement

<定義函數>  ->  <類型辨別符>  <聲明> <複合語句>

type_specifier à

      VOID

      | CHAR

      | INT

      | FLOAT

 <類型辨別符>  ->  <空類> | <字元型> | <整型> | <浮點型>

declarator

      pointer direct_declarator

      | direct_declarator

 <聲明>  <指針>  <直接說明符>  |  <直接聲明符>

Pointerà

      '*'

      | '*' pointer

< 指針 >  ->  < * > | < * 指針 >

direct_declarator

      IDENTIFIER

   |direct_declarator’[‘ ‘]’

      |direct_declarator ’[’ constant_expression ’]’

      | IDENTIFIER '(' parameter_list ')'

| IDENTIFIER '('  ')'

      |direct_declarator  ‘,’  identifier_list

<直接聲明符>  <辨別符>  |  <直接聲明  ‘[‘  ‘]‘>   |  <直接聲明 ‘[‘ 恒表達式 ‘]‘>  |  <辨別符‘(‘ 參數名單 ‘)‘>  |  <辨別符‘(‘  ‘)‘>  |  <直接說明 ‘;‘ 辨別符清單>

identifier_list

      : IDENTIFIER

      | identifier_list ',' IDENTIFIER

<識别名單> : <辨別符> |  <辨別符清單 ‘;‘ 辨別符>

constant_expressionà

      conditional_expression

 <常量表達式> -> <條件表達式>

parameter_list à

       parameter_declaration

      | parameter_list ',' parameter_declaration

<參數清單> -> <參數聲明> | <參數清單 ‘;‘ 參數聲明>

parameter_declaration à

      declaration_specifiers  IDENTIFIER

 <參數聲明> -> <說明符聲明> <辨別符>

compound_statement à

       '{' '}'

      | '{' statement_list '}'

      | '{' declaration_list statement_list '}'

 <複合語句>-> <‘{‘ ‘}‘> | <‘{‘語句清單‘}‘> | <‘{‘聲明語句清單’}‘>

declaration_list à

       declaration

      | declaration_list declaration

 <聲明清單> -> <聲明> | <聲明清單 聲明>

Declarationà

       init_declarator

      | init_declarator_list ',' init_declarator

 <聲明> -> <初始化聲明> |<初始聲明清單 ‘,‘ 初始化聲明>

init_declarator à

       declarator

      | declarator '=' initializer

<初始化聲明> -> <聲明> | <聲明 ‘=‘ 初始化程式>

Initializer à

       assignment_expression

      | '{' initializer_list '}'

      | '{' initializer_list ',' '}'

<初始化程式> -> <指派表達式> | <‘{‘  初始化清單 ‘}‘> | <‘{‘ 初始化清單 ‘,‘ ‘}‘>

initializer_list à

       initializer

      | initializer_list ',' initializer

 <初始化清單> -> <初始化程式>| <初始化清單 ‘,‘ 初始化程式>

statement_listà

      statement

      | statement_list statement

 <語句清單> -> <語句> | <語句清單 語句>

Statement à

      | compound_statement

      | expression_statement

      | selection_statement

      | iteration_statement

      | jump_statement

 <語句> -> |<複合語句> |<表達式語句>|<選擇語句>|<循環語句>|<跳轉語句>

expression_statement à

      ';'

      | expression ';'

<表達式語句>→<‘;‘>   |  <表達式 ‘;‘>

selection_statement

      : IF '(' expression ')' statement

      | IF '(' expression ')' statement ELSE statement

<條件語句>:<IF‘(‘表達式”)語句> | < IF‘(‘ 表達式 ‘)‘語句  條件語句>

iteration_statementà

       WHILE '(' expression ')' statement

      | FOR '(' expression_statement expression_statement ')' statement

      | FOR '(' expression_statement expression_statement expression ')' statement

<循環語句>→ <WHILE ‘(‘ 表達式‘)‘ 語句> | <FOR ‘(‘ 表達式語句 表達式語句 ‘)‘ 語句> | <FOR ‘(‘ 表達式語句  表達式語句  表達式‘)‘語句>

jump_statement

      | CONTINUE ';'

      | BREAK ';'

      | RETURN ';'

      | RETURN expression ';'

<跳轉語句> | <CONTINUE ‘;‘>  | < BREAK ‘;‘>  | < RETURN ‘;‘ > |< RETURN 表達式 ‘;‘>

expression

      : assignment_expression

      | expression ',' assignment_expression

<表達式>:<指派表達式>  | < 表達式 ‘,‘ 指派表達式>

assignment_expression à

      | unary_expression assignment_operator assignment_expression

<指派表達式> -> <條件表達式>  |  <一進制表達式指派運算符  指派表達式>

conditional_expression à

       logical_or_expression

      | logical_or_expression '?' expression ':' conditional_expression

<條件表達式> -> <邏輯或表達> | <邏輯或表達‘?‘ 表達式 ‘:‘條件表達式>

logical_or_expression à

      logical_and_expression

      | logical_or_expression OR_OP logical_and_expression

<邏輯或表達> -> <邏輯與表達>  | <邏輯或表達  或運算邏輯表達式>

logical_and_expression

      : inclusive_or_expression

      | logical_and_expression AND_OP inclusive_or_expression

<邏輯與表達> :<或表達式> | <邏輯表達式 和運算或表達式>

inclusive_or_expressionà

      exclusive_or_expression

      | inclusive_or_expression '|' exclusive_or_expression

<或運算表達式> -> <異或表達式> | <或運算表達式 ‘|‘ 異或表達式>

exclusive_or_expression

      : and_expression

      | exclusive_or_expression '^' and_expression

<異或表達式> :<與表達式> |  <異或表達式‘^‘與表達式>

and_expression

      : equality_expression

      | and_expression '&' equality_expression

<與表達式> :<相等表達式> | <與表達式‘&‘相等表達式>

equality_expression

      : relational_expression

      | equality_expression EQ_OP relational_expression

      | equality_expression NE_OP relational_expression

<相等表達式> :<關系表達式> | <相等表達式等于運算關系表達式> | <相等表達式不等于運算關系表達式>

relational_expression

      : shift_expression

      | relational_expression '<' shift_expression

      | relational_expression '>' shift_expression

      | relational_expression LE_OP shift_expression

      | relational_expression GE_OP shift_expression

<關系表達式> :<移位表達式> | <關系表達式‘<‘移位表達式> | <關系表達式‘>‘移位表達式>  |  <關系表達式小于等于運算移位表達式> | <關系表達式大于等于運算移位表達式>

shift_expression

      : additive_expression

      | shift_expression LEFT_OP additive_expression

      | shift_expression RIGHT_OP additive_expression

<移位表達式> :<加法表達式> | <移位表達式左運算加法表達式>  | <移位表達式右運算加法表達式>

additive_expression

      : multiplicative_expression

      | additive_expression '+' multiplicative_expression

      | additive_expression '-' multiplicative_expression

<加法表達式> :<乘法表達式> | <加法表達式‘+‘乘法表達式> | <加法表達式‘-‘乘法表達式>

multiplicative_expression

      : cast_expression

      | multiplicative_expression '*' cast_expression

      | multiplicative_expression '/' cast_expression

      | multiplicative_expression '%' cast_expression

<乘法表達式> :<強制轉換表達式> | <乘法表達式‘*‘強制轉換表達式> | <乘法表達式‘/‘強制轉換表達式> | <乘法表達式‘%‘強制轉換表達式>

cast_expression

      : unary_expression

      | '(' type_name ')' cast_expression

<強制轉換表達式> :<一進制表達式>  | < ‘(‘ 類型名稱 ‘)‘強制轉換表達式>

unary_expression

      : postfix_expression

      | INC_OP unary_expression

      | DEC_OP unary_expression

      | unary_operator cast_expression

      | SIZEOF unary_expression

      | SIZEOF '(' type_name ')'

<一進制表達式> :<字尾表達式> | INC<運算一進制表達式> | DEC<運算一進制表達式> | <一進制運算符将表達式> |  <結構體變量的一進制表達式> |  <結構體變量的‘(‘ 類型名稱 ‘)‘>

postfix_expression à

      : primary_expression

      | postfix_expression '[' expression ']'

      | postfix_expression '(' ')'

      | postfix_expression '(' argument_expression_list ')'

      | postfix_expression '.' IDENTIFIER

      | postfix_expression PTR_OP IDENTIFIER

      | postfix_expression INC_OP

      | postfix_expression DEC_OP

<字尾表達式> :<基本表達式> | <字尾表達式‘[‘表達式‘]‘>  | <字尾表達式‘(‘ ‘)> | <字尾表達式 ‘(‘參數表達式清單‘)‘>   | <字尾表達式‘.‘ 辨別符> | <字尾表達式指針運算辨別符>    | <字尾表達式INC運算>  | <字尾表達式DEC運算>

primary_expression à

      | CONSTANT

      | STRING_LITERAL

      | '(' expression ')'

<基本表達式> -> <辨別符>  | <常量> | <字元串常量> | < ‘(‘表達式‘)‘>

argument_expression_list

      | argument_expression_list ',' assignment_expression

<參數表達式清單> : <指派表達式> | <參數表達式清單‘,‘指派表達式>

unary_operator

      : '&'

      | '*'

      | '+'

      | '-'

      | '~'

      | '!'

<一進制運算符> :  <‘&‘>  | < ‘*‘ > |  <‘+‘>  |  <‘-‘>  | < ‘~‘ > |  <‘!‘>

assignment_operator à

       '='

      | MUL_ASSIGN

      | DIV_ASSIGN

      | MOD_ASSIGN

      | ADD_ASSIGN

      | SUB_ASSIGN

      | LEFT_ASSIGN

      | RIGHT_ASSIGN

      | AND_ASSIGN

      | XOR_ASSIGN

      | OR_ASSIGN

<指派運算符> -> <‘=‘>  | <乘法配置設定> | <DIV配置設定> | <MOD配置設定> | <加法配置設定>  |  <SUB配置設定>  | <左配置設定> | <右配置設定> | <與配置設定> | <異或配置設定> | <或配置設定>

storage_class_specifier à

       TYPEDEF

      | EXTERN

      | STATIC

      | AUTO

      | REGISTER

<存儲類說明符> -> <定義類型> | <外部變量> | <靜态>  | <自動>  | <寄存器> 

struct_or_union_specifier

      : struct_or_union IDENTIFIER '{' struct_declaration_list '}'

      | struct_or_union '{' 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_specifier specifier_qualifier_list

      | type_specifier

      | type_qualifier specifier_qualifier_list

      | type_qualifier

<結構體聲明> :<說明符限定符清單結構說明符‘;‘>  <說明符> -> <類型說明符說明符限定符清單> | <類型說明符>  | <類型限定符說明符限定符清單> | <類型限定符>

struct_declarator_list à

       struct_declarator

      | struct_declarator_list ',' struct_declarator

<結構說明符清單> -> <結構體聲明> | <結構說明符清單‘,‘結構體聲明>

struct_declarator à

      : declarator

      | ':' constant_expression

      | declarator ':' constant_expression

<結構體聲明> -> : <聲明> | < ‘:‘常量表達式> | <聲明‘:‘常量表達式>

enum_specifier à

       ENUM '{' enumerator_list '}'

      | ENUM IDENTIFIER '{' enumerator_list '}'

      | ENUM IDENTIFIER

<枚舉聲明> -> <枚舉‘{‘枚舉器清單‘}‘>  | <枚舉辨別符‘{‘枚舉器清單‘}‘>  | <枚舉辨別符>

enumerator_list à

       enumerator

      | enumerator_list ',' enumerator

<枚舉器清單> -> <枚舉器> | <枚舉器清單‘,‘枚舉器>

Enumerator à

       IDENTIFIER

      | IDENTIFIER '=' constant_expression

<枚舉器> -> <辨別符> | <辨別符‘=‘常量表達式>

type_qualifier à

       CONST

      | VOLATILE

<類型限定符> -> <常量> | <易失的>

type_qualifier_list à

       type_qualifier

      | type_qualifier_list type_qualifier

<類型限定符清單> -> <類型限定符> | <類型限定符清單  類型限定符>

parameter_type_list à

       parameter_list

      | parameter_list ',' ELLIPSIS

<參數類型清單> -> <參數清單> | <參數清單‘,‘省略符号>

      : parameter_declaration

<參數清單> -> :<聲明參數> | <參數清單‘,‘聲明參數>

type_name à

       specifier_qualifier_list

      | specifier_qualifier_list abstract_declarator

<類型名稱> -> <限定說明符清單> | <限定符抽象說明符清單>

abstract_declarator à

       pointer

      | direct_abstract_declarator

      | pointer direct_abstract_declarator

<抽象說明符>-><指針> | <直接抽象說明符> | <指針直接抽象說明符>

direct_abstract_declarator à

       '(' abstract_declarator ')'

      | '[' ']'

      | '[' constant_expression ']'

      | direct_abstract_declarator '[' ']'

      | direct_abstract_declarator '[' constant_expression ']'

      | '(' ')'

      | '(' parameter_type_list ')'

      | direct_abstract_declarator '(' ')'

      | direct_abstract_declarator '(' parameter_type_list ')'

<直接抽象說明符> -> < ‘(‘ 抽象說明符 ‘)‘>  | < ‘[‘ ‘]‘>  | < ‘[‘ 常量表達式‘]‘>| <直接抽象說明符‘[‘ ‘]‘ > | <直接抽象說明符‘[‘ 常量表達式 ‘]‘ > | < ‘(‘ ‘)‘> |  <‘(‘參數類型清單‘)‘ > |<直接抽象說明符‘(‘ ‘)‘>  | <直接抽象說明符‘(‘參數類型清單‘)‘>

labeled_statement à

       IDENTIFIER ':' statement

      | CASE constant_expression ':' statement

      | DEFAULT ':' statement