⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yacc.y

📁 用C++编写的一个编译器
💻 Y
📖 第 1 页 / 共 2 页
字号:
		{$$=$1;}
	| declaration
		{
			$$=local_define($1->spec, $1->declist);//return init exp statement
		}
	;

labeled_statement
	: IDENTIFIER ':' statement
		{
			if($3->labelno == UNKNOWN)
				$3->labelno = newlabelno++;
			add_named_label($1.s,$3->labelno);
			$$=$3;
		}
	| CASE assignment_expression ':' statement
		{
			if($4->labelno ==UNKNOWN)
				$4->labelno = newlabelno++;
			$$ = newCalcStmt(stmt_case, $2, $4, NULL, NULL, currentfile, lineno);
			$$ ->labelno = $4->labelno;
		}
	| DEFAULT ':' statement
		{
			if($3->labelno ==UNKNOWN)
				$3->labelno = newlabelno++;
			$$ = newCalcStmt(stmt_default, NULL, $3, NULL, NULL, currentfile, lineno);
			$$ ->labelno = $3->labelno;
		}
	;

compound_statement
	: '{' '}'
		{
			$$ = newCalcStmt(stmt_compound, NULL, NULL, NULL, NULL, currentfile, lineno);
		}
	| '{'
		{
			if(blocklevel++)
				enter_block();
		}
		statement_list '}'
		{
			$$ = newCalcStmt(stmt_compound, NULL, $3, NULL, NULL, currentfile, lineno);
			if(--blocklevel)
				leave_block();
		}
	;

statement_list
	: statement
		{$$=$1;}
	| statement_list statement
		{
			appendObject(&$1, $2);
			$$ = $1;
		}
	;

expression_statement
	: null_expression ';'
		{
			$$ = newCalcStmt(stmt_exp, $1, NULL, NULL, NULL, currentfile, lineno);
		}
	;

selection_statement
	: IF '(' expression ')' statement
		{
			$$ = newCalcStmt(stmt_if, $3, NULL, $5, NULL, currentfile, lineno);
		}
	| IF '(' expression ')' statement ELSE statement 
		{
			$$ = newCalcStmt(stmt_if, $3, NULL, $5, $7, currentfile, lineno);
		}
	| SWITCH '(' expression ')' statement
		{
			$$ = newCalcStmt(stmt_switch, $3, $5, NULL, NULL, currentfile, lineno);
		}
	;

iteration_statement
	: WHILE '(' expression ')' statement
		{
			$$ = newCalcStmt(stmt_while, $3, $5, NULL, NULL, currentfile, lineno);
		}
	| DO statement WHILE '(' expression ')' ';'
		{
			$$ = newCalcStmt(stmt_do, $5, $2, NULL, NULL, currentfile, lineno);
		}
	| FOR '(' expression_statement null_expression ';' null_expression ')' statement
		{
			$$ = newCalcStmt(stmt_for, $4, $8, $3, 
					newCalcStmt(stmt_exp, $6, NULL, NULL, NULL, currentfile, lineno),
					currentfile, lineno);
		}
	| FOR '(' declaration 
		{
			int tmp=blocklevel;
			enter_block();
			blocklevel=0;//do like aguments
			
			$<stmt>$=local_define($3->spec, $3->declist);//return init exp statement
			$<stmt>$->lineno = tmp;
		}
		null_expression ';' null_expression ')' statement
		{
			//need to record the defined symbols
			$$ = newCalcStmt(stmt_for, $5, $9, $<stmt>4, 
					newCalcStmt(stmt_exp, $7, NULL, NULL, NULL, currentfile, lineno),
					currentfile, lineno);
			
			leave_block();
			blocklevel=$<stmt>4->lineno;
		}
	;

jump_statement
	: GOTO IDENTIFIER ';'
		{
			ExpNode *aexp = evaluate_label_exp($2.s);
			$$ = newCalcStmt(stmt_goto, aexp, NULL, NULL, NULL, currentfile, lineno);
		}
	| CONTINUE ';'
		{
			$$ = newCalcStmt(stmt_continue, NULL, NULL, NULL, NULL, currentfile, lineno);
		}
	| BREAK ';'
		{
			$$ = newCalcStmt(stmt_break, NULL, NULL, NULL, NULL, currentfile, lineno);
		}
	| RETURN null_expression ';'
		{
			$$ = newCalcStmt(stmt_return, $2, NULL, NULL, NULL, currentfile, lineno);
		}
	;

expression
	: assignment_expression
		{
			$$=$1;
		}
	| expression ',' assignment_expression
		{
			appendObject(&$1, $3);
			$$ = $1;
		}
	;

null_expression
	: 
		{$$ = evaluate_void_exp();}
	| expression
		{$$ = $1;}
	;
	
primary_expression
	: IDENTIFIER
		{
			$$ = evaluate_id_exp($1.s);
		}
	| CINT
		{
			$$ = evaluate_const_exp(bt_long, &($1.i));
		}
	| CUINT
		{
			$$ = evaluate_const_exp(bt_unsignedlong, &($1.u));
		}
	| STRING
		{
			$$ = evaluate_const_exp(bt_pointer, $1.s); //remember allocate mem for const string
		}
	| CFLOAT
		{
			$$ = evaluate_const_exp(bt_double, &($1.f));
		}
	| CBOOL
		{
			$$ = evaluate_const_exp(bt_long, &($1.i));
		}
	| '(' expression ')'
		{$$=$2;}
	;

postfix_expression
	: primary_expression
		{$$=$1;}
	| postfix_expression '[' expression ']'
		{
			$$ = evaluate_array_exp($1, $3);
		}
	| postfix_expression '(' ')'
		{
			$$ = evaluate_call_exp($1, evaluate_void_exp());
		}
	| postfix_expression '(' expression ')'
		{
			$$ = evaluate_call_exp($1, $3);
		}
	| postfix_expression NTOMEM IDENTIFIER
		{
			$$ = evaluate_member_exp(exp_ntomem, $1, $3.s);
		}
	| postfix_expression PTOMEM IDENTIFIER
		{
			$$ = evaluate_member_exp(exp_ptomem, $1, $3.s);
		}
	| postfix_expression INCR
		{
			$$ = evaluate_indecr_exp(-exp_incr, $1);
		}
	| postfix_expression DECR
		{
			$$ = evaluate_indecr_exp(-exp_decr, $1);
		}
	;

unary_expression
	: postfix_expression
		{
			$$=$1;
		}
	| INCR unary_expression
		{
			$$ = evaluate_indecr_exp(exp_incr, $2);
		}
	| DECR unary_expression
		{
			$$ = evaluate_indecr_exp(exp_decr, $2);
		}
	| unary_operator unary_expression
		{
			$$ = evaluate_unary_exp($1.i, $2);
		}
	| '(' abstract_type_specifier ')' unary_expression 
		{
			$$ = evaluate_typecast_exp($2, $4);
		}
	| SIZEOF '(' unary_expression ')'
		{
			$$ = evaluate_sizeof_exp(NULL, $3);
		}
	| SIZEOF '(' abstract_type_specifier ')'
		{
			$$ = evaluate_sizeof_exp($3, NULL);
		}
	;

unary_operator
	: '&' 
		{$$.i = exp_ptr;}
	| '*'
		{$$.i = exp_val;}
	| '+'
		{$$.i = exp_uplus;}
	| '-'
		{$$.i = exp_uminus;}
	| '~'
		{$$.i = exp_rvs;}
	| '!'
		{$$.i = exp_lnot;}
	;

multiplicative_expression
	: unary_expression
		{$$=$1;}
	| multiplicative_expression '*' unary_expression
		{
			$$ = evaluate_binary_exp(exp_mul, $1, $3);
		}
	| multiplicative_expression '/' unary_expression
		{
			$$ = evaluate_binary_exp(exp_div, $1, $3);
		}
	| multiplicative_expression '%' unary_expression
		{
			$$ = evaluate_binary_exp(exp_mod, $1, $3);
		}
	;

additive_expression
	: multiplicative_expression
		{$$ =$1;}
	| additive_expression '+' multiplicative_expression
		{
			$$ = evaluate_binary_exp(exp_add, $1, $3);
		}
	| additive_expression '-' multiplicative_expression
		{
			$$ = evaluate_binary_exp(exp_sub, $1, $3);
		}
	;

shift_expression
	: additive_expression
		{$$ =$1;}
	| shift_expression LSH additive_expression
		{
			$$ = evaluate_binary_exp(exp_lsh, $1, $3);
		}
	| shift_expression RSH additive_expression
		{
			$$ = evaluate_binary_exp(exp_rsh, $1, $3);
		}
	;

relational_expression
	: shift_expression
		{$$ =$1;}
	| relational_expression LES shift_expression
		{
			$$ = evaluate_cmp_exp(exp_les, $1, $3);
		}
	| relational_expression GTR shift_expression
		{
			$$ = evaluate_cmp_exp(exp_gtr, $1, $3);
		}
	| relational_expression LEQ shift_expression
		{
			$$ = evaluate_cmp_exp(exp_leq, $1, $3);
		}
	| relational_expression GEQ shift_expression
		{
			$$ = evaluate_cmp_exp(exp_geq, $1, $3);
		}
	;

equality_expression
	: relational_expression
		{$$ = $1;}
	| equality_expression EQ relational_expression
		{
			$$ = evaluate_cmp_exp(exp_eq, $1, $3);
		}
	| equality_expression UEQ relational_expression
		{
			$$ = evaluate_cmp_exp(exp_ueq, $1, $3);
		}
	;

and_expression
	: equality_expression
		{$$=$1;}
	| and_expression '&' equality_expression
		{
			$$ = evaluate_bit_exp(exp_and, $1, $3);
		}
	;

exclusive_or_expression
	: and_expression
		{$$=$1;}
	| exclusive_or_expression '^' and_expression
		{
			$$ = evaluate_bit_exp(exp_xor, $1, $3);
		}
	;

inclusive_or_expression
	: exclusive_or_expression
		{$$=$1;}
	| inclusive_or_expression '|' exclusive_or_expression
		{
			$$ = evaluate_bit_exp(exp_or, $1, $3);
		}
	;

logical_and_expression
	: inclusive_or_expression
		{$$=$1;}
	| logical_and_expression LAND inclusive_or_expression
		{
			$$ = evaluate_logic_exp(exp_land, $1, $3);
		}
	;

logical_or_expression
	: logical_and_expression
		{$$=$1;}
	| logical_or_expression LOR logical_and_expression
		{
			$$ = evaluate_logic_exp(exp_lor, $1, $3);
		}
	;

conditional_expression
	: logical_or_expression
		{$$=$1;}
	| logical_or_expression '?' expression ':' conditional_expression
		{
			$$ = evaluate_trinary_exp($1, $3, $5);
		}
	;

assignment_expression
	: conditional_expression
		{$$=$1;}
	| unary_expression assignment_operator assignment_expression
		{
			$$ = evaluate_assign_exp($2.i, $1, $3);
		}
	;

assignment_operator
	: ASSIGN
		{$$.i = exp_assign;}
	| MULAS
		{$$.i = exp_mulas;}
	| DIVAS
		{$$.i = exp_divas;}
	| MODAS
		{$$.i = exp_modas;}
	| ADDAS
		{$$.i = exp_addas;}
	| SUBAS
		{$$.i = exp_subas;}
	| LSHAS
		{$$.i = exp_lshas;}
	| RSHAS
		{$$.i = exp_rshas;}
	| ANDAS
		{$$.i = exp_andas;}
	| XORAS
		{$$.i = exp_xoras;}
	| ORAS
		{$$.i = exp_oras;}
	;
	
%%

void yyerror(char *info)
{
	generror(ERR_SYNTAX_ERROR, info);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -