天天看點

1014 C語言文法定義與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 <‘(‘ 表達式 ‘)‘ 語句 ELSE 語句 >

iteration_statementà

       WHILE '(' expression ')' statement

      | FOR '(' expression_statement

expression_statement ')' 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

<指派表達式>→<條件表達式 > | 

<一進制表達式指派運算符  指派表達式>

conditional_expression

       logical_or_expression

      | logical_or_expression '?' expression ':'

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

logical_or_expression

      logical_and_expression

      | logical_or_expression OR_OP

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

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

      : and_expression

      | exclusive_or_expression '^'

and_expression

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

      : equality_expression

      | and_expression '&'

equality_expression

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

      : relational_expression

      | equality_expression EQ_OP

relational_expression

      | equality_expression NE_OP relational_expression

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

      : shift_expression

      | relational_expression '<'

shift_expression

      | relational_expression '>'

      | relational_expression LE_OP

      | relational_expression GE_OP

<關系表達式>:<移位表達式> | <關系表達式‘<‘移位表達式> | <關系表達式‘>‘移位表達式 > | 

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

      : additive_expression

      | shift_expression LEFT_OP

additive_expression

      | shift_expression RIGHT_OP

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

      : multiplicative_expression

      | additive_expression '+'

multiplicative_expression

      | additive_expression '-'

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

      : cast_expression

      | multiplicative_expression '*'

cast_expression

      | multiplicative_expression '/'

      | multiplicative_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 ','

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

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_or_union IDENTIFIER

<結構或聯合說明符>:<結構或聯合辨別符‘{‘結構體聲明清單‘}‘ >

| <結構或聯合‘{‘結構體聲明清單‘}‘ >

| <結構或聯合辨別符>

struct_or_union

      : STRUCT

      | UNION

<結構或聯合>:<結構體> | <聯合>

struct_declaration_list

      : struct_declaration

      | struct_declaration_list

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

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

      : 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_list

      : parameter_declaration

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

type_name

       specifier_qualifier_list

      | specifier_qualifier_list

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

<有标号語句→辨別符‘:‘語句> |  <CASE常量表達式‘:‘語句>  | < DEFAULT‘:‘語句>