C 语言文法 ( C Language Grammar )

	%token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF
	%token TYPE_NAME

	%token TYPEDEF EXTERN STATIC AUTO REGISTER
	%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID
	%token STRUCT UNION ENUM

	%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN

	%start translation_unit
	%%
	translation_unit
		: external_declaration
		| translation_unit external_declaration
		;

	external_declaration
		: function_definition
		| declaration
		;

	function_definition
		: declaration_specifiers declarator declaration_list compound_statement
		| declaration_specifiers declarator compound_statement
		| declarator declaration_list compound_statement
		| declarator compound_statement
		;

	declaration_list
		: declaration
		| declaration_list declaration
		;

	declaration
		: declaration_specifiers ';'
		| declaration_specifiers init_declarator_list ';'
		;
		
	declaration_specifiers
		: storage_class_specifier
		| storage_class_specifier declaration_specifiers
		| type_specifier
		| type_specifier declaration_specifiers
		| type_qualifier
		| type_qualifier declaration_specifiers
		;
		
	specifier_qualifier_list
		: type_specifier specifier_qualifier_list
		| type_specifier
		| type_qualifier specifier_qualifier_list
		| type_qualifier
		        
	type_qualifier_list
		: type_qualifier
		| type_qualifier_list type_qualifier
		;

	type_qualifier
		: CONST
		| VOLATILE
		;
	 
	storage_class_specifier
		: TYPEDEF
		| EXTERN
		| STATIC
		| AUTO
		| REGISTER
		;

	type_specifier
		: VOID
		| CHAR
		| SHORT
		| INT
		| LONG
		| FLOAT
		| DOUBLE
		| SIGNED
		| UNSIGNED
		| struct_or_union_specifier
		| enum_specifier
		| TYPE_NAME
		;

	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 ';'
		;

	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
		;       
		
	init_declarator_list
		: init_declarator
		| init_declarator_list ',' init_declarator
		;       

	init_declarator
		: declarator
		| declarator '=' initializer
		;
		
	initializer_list
		: initializer
		| initializer_list ',' initializer
		;        

	initializer
		: assignment_expression
		| '{' initializer_list '}'
		| '{' initializer_list ',' '}'
		;

	parameter_type_list
		: parameter_list
		| parameter_list ',' '...'
		;

	parameter_list
		: parameter_declaration
		| parameter_list ',' parameter_declaration

	parameter_declaration
		: declaration_specifiers declarator
		| declaration_specifiers abstract_declarator
		| declaration_specifiers
		;

	identifier_list
		: IDENTIFIER
		| identifier_list ',' IDENTIFIER
		;

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

	declarator
		: pointer direct_declarator
		| direct_declarator
		;

	direct_declarator
		: IDENTIFIER
		| '(' declarator ')'
		| direct_declarator '[' constant_expression ']'
		| direct_declarator '[' ']'
		| direct_declarator '(' parameter_type_list ')'
		| direct_declarator '(' identifier_list ')'
		| direct_declarator '(' ')'
		;

	pointer
		: '*'
		| '*' type_qualifier_list
		| '*' pointer
		| '*' type_qualifier_list pointer
		;        
		
	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
		: '{' '}'
		| '{' statement_list '}'
		| '{' declaration_list '}'
		| '{' declaration_list statement_list '}'
		;        
		     
	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_statement expression_statement ')' statement
		| FOR '(' expression_statement expression_statement expression ')' statement
		;

	jump_statement
		: GOTO IDENTIFIER ';'
		| CONTINUE ';'
		| BREAK ';'
		| RETURN ';'
		| RETURN expression ';'
		;        

	expression
		: assignment_expression
		| expression ',' assignment_expression
		;
		
	assignment_expression
		: conditional_expression
		| unary_expression assignment_operator assignment_expression
		;
		
	assignment_operator
		: '='
		| '*='
		| '/='
		| '%='
		| '+='
		| '-='
		| '<<='
		| '>>='
		| '&='
		| '^='
		| '|='
		;

	constant_expression
		: conditional_expression
		;

	conditional_expression
		: logical_or_expression
		| logical_or_expression '?' expression ':' conditional_expression
		;

	logical_or_expression
		: logical_and_expression
		| logical_or_expression '||' logical_and_expression
		;

	logical_and_expression
		: inclusive_or_expression
		| logical_and_expression '&&' 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 '==' relational_expression
		| equality_expression '!=' relational_expression
		;

	relational_expression
		: shift_expression
		| relational_expression '<' shift_expression
		| relational_expression '>' shift_expression
		| relational_expression '<=' shift_expression
		| relational_expression '>=' shift_expression
		;

	shift_expression
		: additive_expression
		| shift_expression '<<' additive_expression
		| shift_expression '>>' 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
		| '++' unary_expression
		| '--' unary_expression
		| unary_operator cast_expression
		| SIZEOF unary_expression
		| SIZEOF '(' type_name ')'
		;
		
	unary_operator
		: '&'
		| '*'
		| '+'
		| '-'
		| '~'
		| '!'
		;
		
	argument_expression_list
		: assignment_expression
		| argument_expression_list ',' assignment_expression
		;

	postfix_expression
		: primary_expression
		| postfix_expression '[' expression ']'
		| postfix_expression '(' ')'
		| postfix_expression '(' argument_expression_list ')'
		| postfix_expression '.' IDENTIFIER
		| postfix_expression '->' IDENTIFIER
		| postfix_expression '++'
		| postfix_expression '--'
		;
		
	primary_expression
		: IDENTIFIER
		| CONSTANT
		| STRING_LITERAL
		| '(' expression ')'
		;
	%%
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值