c语言 bnf,c语言的bnf

%token int_const char_const float_const id string enumeration_const

%%

translation_unit: external_decl

| translation_unit external_decl

;

external_decl: function_definition

| decl

;

function_definition: decl_specs declarator decl_list compound_stat

|declarator decl_list compound_stat

| decl_specs declaratorcompound_stat

|declarator compound_stat

;

decl: decl_specs init_declarator_list ';'

| decl_specs';'

;

decl_list: decl

| decl_list decl

;

decl_specs: storage_class_spec decl_specs

| storage_class_spec

| type_spec decl_specs

| type_spec

| type_qualifier decl_specs

| type_qualifier

;

storage_class_spec: 'auto' | 'register' | 'static' | 'extern' | 'typedef'

;

type_spec: 'void' | 'char' | 'short' | 'int' | 'long' | 'float'

| 'double' | 'signed' | 'unsigned'

| struct_or_union_spec

| enum_spec

| typedef_name

;

type_qualifier: 'const' | 'volatile'

;

struct_or_union_spec: struct_or_union id '{' struct_decl_list '}'

| struct_or_union'{' struct_decl_list '}'

| struct_or_union id

;

struct_or_union: 'struct' | 'union'

;

struct_decl_list: struct_decl

| struct_decl_list struct_decl

;

init_declarator_list: init_declarator

| init_declarator_list ',' init_declarator

;

init_declarator: declarator

| declarator '=' initializer

;

struct_decl: spec_qualifier_list struct_declarator_list ';'

;

spec_qualifier_list: type_spec spec_qualifier_list

| type_spec

| type_qualifier spec_qualifier_list

| type_qualifier

;

struct_declarator_list: struct_declarator

| struct_declarator_list ',' struct_declarator

;

struct_declarator: declarator

| declarator ':' const_exp

|':' const_exp

;

enum_spec: 'enum' id '{' enumerator_list '}'

| 'enum''{' enumerator_list '}'

| 'enum' id

;

enumerator_list: enumerator

| enumerator_list ',' enumerator

;

enumerator: id

| id '=' const_exp

;

declarator: pointer direct_declarator

|direct_declarator

;

direct_declarator: id

| '(' declarator ')'

| direct_declarator '[' const_exp ']'

| direct_declarator '['']'

| direct_declarator '(' param_type_list ')'

| direct_declarator '(' id_list ')'

| direct_declarator '('')'

;

pointer: '*' type_qualifier_list

| '*'

| '*' type_qualifier_list pointer

| '*'pointer

;

type_qualifier_list: type_qualifier

| type_qualifier_list type_qualifier

;

param_type_list: param_list

| param_list ',' '...'

;

param_list: param_decl

| param_list ',' param_decl

;

param_decl: decl_specs declarator

| decl_specs abstract_declarator

| decl_specs

;

id_list: id

| id_list ',' id

;

initializer: assignment_exp

| '{' initializer_list '}'

| '{' initializer_list ',' '}'

;

initializer_list: initializer

| initializer_list ',' initializer

;

type_name: spec_qualifier_list abstract_declarator

| spec_qualifier_list

;

abstract_declarator: pointer

| pointer direct_abstract_declarator

|direct_abstract_declarator

;

direct_abstract_declarator: '(' abstract_declarator ')'

| direct_abstract_declarator '[' const_exp ']'

|'[' const_exp ']'

| direct_abstract_declarator '['']'

|'['']'

| direct_abstract_declarator '(' param_type_list ')'

|'(' param_type_list ')'

| direct_abstract_declarator '('')'

|'('')'

;

typedef_name: id

;

stat: labeled_stat

| exp_stat

| compound_stat

| selection_stat

| iteration_stat

| jump_stat

;

labeled_stat: id ':' stat

| 'case' const_exp ':' stat

| 'default' ':' stat

;

exp_stat: exp ';'

|';'

;

compound_stat: '{' decl_list stat_list '}'

| '{'stat_list '}'

| '{' decl_list'}'

| '{''}'

;

stat_list: stat

| stat_list stat

;

selection_stat: 'if' '(' exp ')' stat

| 'if' '(' exp ')' stat 'else' stat

| 'switch' '(' exp ')' stat

;

iteration_stat: 'while' '(' exp ')' stat

| 'do' stat 'while' '(' exp ')' ';'

| 'for' '(' exp ';' exp ';' exp ')' stat

| 'for' '(' exp ';' exp ';'')' stat

| 'for' '(' exp ';'';' exp ')' stat

| 'for' '(' exp ';'';'')' stat

| 'for' '('';' exp ';' exp ')' stat

| 'for' '('';' exp ';'')' stat

| 'for' '('';'';' exp ')' stat

| 'for' '('';'';'')' stat

;

jump_stat: 'goto' id ';'

| 'continue' ';'

| 'break' ';'

| 'return' exp ';'

| 'return'';'

;

exp: assignment_exp

| exp ',' assignment_exp

;

assignment_exp: conditional_exp

| unary_exp assignment_operator assignment_exp

;

assignment_operator: '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<='

| '>>=' | '&=' | '^=' | '|='

;

conditional_exp: logical_or_exp

| logical_or_exp '?' exp ':' conditional_exp

;

const_exp: conditional_exp

;

logical_or_exp: logical_and_exp

| logical_or_exp '||' logical_and_exp

;

logical_and_exp: inclusive_or_exp

| logical_and_exp '&&' inclusive_or_exp

;

inclusive_or_exp: exclusive_or_exp

| inclusive_or_exp '|' exclusive_or_exp

;

exclusive_or_exp: and_exp

| exclusive_or_exp '^' and_exp

;

and_exp: equality_exp

| and_exp '&' equality_exp

;

equality_exp: relational_exp

| equality_exp '==' relational_exp

| equality_exp '!=' relational_exp

;

relational_exp: shift_expression

| relational_exp '| relational_exp '>' shift_expression

| relational_exp '<=' shift_expression

| relational_exp '>=' shift_expression

;

shift_expression: additive_exp

| shift_expression '>' additive_exp

;

additive_exp: mult_exp

| additive_exp '+' mult_exp

| additive_exp '-' mult_exp

;

mult_exp: cast_exp

| mult_exp '*' cast_exp

| mult_exp '/' cast_exp

| mult_exp '%' cast_exp

;

cast_exp: unary_exp

| '(' type_name ')' cast_exp

;

unary_exp: postfix_exp

| '++' unary_exp

| '--' unary_exp

| unary_operator cast_exp

| 'sizeof' unary_exp

| 'sizeof' '(' type_name ')'

;

unary_operator: '&' | '*' | '+' | '-' | '~' | '!'

;

postfix_exp: primary_exp

| postfix_exp '[' exp ']'

| postfix_exp '(' argument_exp_list ')'

| postfix_exp '('')'

| postfix_exp '.' id

| postfix_exp '->' id

| postfix_exp '++'

| postfix_exp '--'

;

primary_exp: id

| const

| string

| '(' exp ')'

;

argument_exp_list: assignment_exp

| argument_exp_list ',' assignment_exp

;

const: int_const

| char_const

| float_const

| enumeration_const

;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值