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

📄 c.y

📁 C编译器,在VC6.0环境下开发
💻 Y
📖 第 1 页 / 共 5 页
字号:
					// cmp	ax,	dx
					gen_cmp("ax", "dx");
					// je	lab1
					gen_jump("je", lab1);
					// xor	ax, ax
					gen_xor("ax", "ax");
					// jmp	lab2
					gen_jump("jmp", lab2);
					// lab1:
					gen_label(lab1);
					// mov	ax, 1
					gen_mov_cl("ax", 1);
					// lab2:
					gen_label(lab2);
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		|	equality_expression oUNEQU relational_expression
			{
				symbol	*p;

				PARSE_INFO("equality_expression :equality_expression oUNEQU relational_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, !=)
					del_symbol($3);
					p = $1;
				}
				else
				{
					char	lab1[LABEL_LEN], lab2[LABEL_LEN];

					strcpy(lab1, get_a_label());
					strcpy(lab2, get_a_label());
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// cmp	ax,	dx
					gen_cmp("ax", "dx");
					// jne	lab1
					gen_jump("jne", lab1);
					// xor	ax, ax
					gen_xor("ax", "ax");
					// jmp	lab2
					gen_jump("jmp", lab2);
					// lab1:
					gen_label(lab1);
					// mov	ax, 1
					gen_mov_cl("ax", 1);
					// lab2:
					gen_label(lab2);
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		;

relational_expression
		:	shift_expression
			{
				PARSE_INFO("relational_expression :shift_expression")
			}
		|	relational_expression oLT shift_expression
			{
				symbol	*p;

				PARSE_INFO("relational_expression :relational_expression oLT shift_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, <)
					del_symbol($3);
					p = $1;
				}
				else
				{
					char	lab1[LABEL_LEN], lab2[LABEL_LEN];

					strcpy(lab1, get_a_label());
					strcpy(lab2, get_a_label());
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// cmp	ax,	dx
					gen_cmp("ax", "dx");
					// jl	lab1
					gen_jump("jl", lab1);
					// xor	ax, ax
					gen_xor("ax", "ax");
					// jmp	lab2
					gen_jump("jmp", lab2);
					// lab1:
					gen_label(lab1);
					// mov	ax, 1
					gen_mov_cl("ax", 1);
					// lab2:
					gen_label(lab2);
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		|	relational_expression oGT shift_expression
			{
				symbol	*p;

				PARSE_INFO("relational_expression :relational_expression oGT shift_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, >)
					del_symbol($3);
					p = $1;
				}
				else
				{
					char	lab1[LABEL_LEN], lab2[LABEL_LEN];

					strcpy(lab1, get_a_label());
					strcpy(lab2, get_a_label());
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// cmp	ax,	dx
					gen_cmp("ax", "dx");
					// jg	lab1
					gen_jump("jg", lab1);
					// xor	ax, ax
					gen_xor("ax", "ax");
					// jmp	lab2
					gen_jump("jmp", lab2);
					// lab1:
					gen_label(lab1);
					// mov	ax, 1
					gen_mov_cl("ax", 1);
					// lab2:
					gen_label(lab2);
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		|	relational_expression oLE shift_expression
			{
				symbol	*p;

				PARSE_INFO("relational_expression :relational_expression oLE shift_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, <=)
					del_symbol($3);
					p = $1;
				}
				else
				{
					char	lab1[LABEL_LEN], lab2[LABEL_LEN];

					strcpy(lab1, get_a_label());
					strcpy(lab2, get_a_label());
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// cmp	ax,	dx
					gen_cmp("ax", "dx");
					// jle	lab1
					gen_jump("jle", lab1);
					// xor	ax, ax
					gen_xor("ax", "ax");
					// jmp	lab2
					gen_jump("jmp", lab2);
					// lab1:
					gen_label(lab1);
					// mov	ax, 1
					gen_mov_cl("ax", 1);
					// lab2:
					gen_label(lab2);
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		|	relational_expression oGE shift_expression
			{
				symbol	*p;

				PARSE_INFO("relational_expression :relational_expression oGE shift_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, >=)
					del_symbol($3);
					p = $1;
				}
				else
				{
					char	lab1[LABEL_LEN], lab2[LABEL_LEN];

					strcpy(lab1, get_a_label());
					strcpy(lab2, get_a_label());
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// cmp	ax,	dx
					gen_cmp("ax", "dx");
					// jge	lab1
					gen_jump("jge", lab1);
					// xor	ax, ax
					gen_xor("ax", "ax");
					// jmp	lab2
					gen_jump("jmp", lab2);
					// lab1:
					gen_label(lab1);
					// mov	ax, 1
					gen_mov_cl("ax", 1);
					// lab2:
					gen_label(lab2);
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		;

shift_expression
		:	additive_expression
			{
				PARSE_INFO("shift_expression :additive_expression")
			}
		|	shift_expression oLFTSHT additive_expression
			{
				symbol	*p;

				PARSE_INFO("shift_expression :oLFTSHT additive_expression")
				CHECK_BIT_OP_TYPE($1)
				CHECK_BIT_OP_TYPE($3)
				if ( IS_CL($1) && IS_CL($3) )
				{
					cast_cl_type($1, $3);
					_CL_DOUBLE_BIT_OPERATION($1, $3, <<)
					del_symbol($3);
					p = $1;
				}
				else
				{
					p = gen_get_two_op_not_cl($1, $3, "ax", "cx");

					// shl ax, cl
					gen_shl("ax", "cl");
					// push	ax
					gen_push_reg("ax");

					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		|	shift_expression oRITSHT additive_expression
			{
				symbol	*p;

				PARSE_INFO("shift_expression :oRITSHT additive_expression")
				CHECK_BIT_OP_TYPE($1)
				CHECK_BIT_OP_TYPE($3)
				if ( IS_CL($1) && IS_CL($3) )
				{
					cast_cl_type($1, $3);
					_CL_DOUBLE_BIT_OPERATION($1, $3, >>)
					del_symbol($3);
					p = $1;
				}
				else
				{
					p = gen_get_two_op_not_cl($1, $3, "ax", "cx");

					// shr ax, cl
					gen_shr("ax", "cl");
					// push	ax
					gen_push_reg("ax");

					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		;

additive_expression
		:	multiplicative_expression
			{
				PARSE_INFO("additive_expression :multiplicative_expression")
			}
		|	additive_expression oPLUS multiplicative_expression
			{
				symbol	*p;

				PARSE_INFO("additive_expression :additive_expression oPLUS multiplicative_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, +)
					del_symbol($3);
					p = $1;
				}
				else
				{
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// add	ax,	dx
					gen_add("ax", "dx");
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		|	additive_expression oMINUS multiplicative_expression
			{
				symbol	*p;

				PARSE_INFO("additive_expression :additive_expression oMINUS multiplicative_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, -)
					del_symbol($3);
					p = $1;
				}
				else
				{
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// sub	ax,	dx
					gen_sub("ax", "dx");
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		;

multiplicative_expression
		:	cast_expression
			{
				PARSE_INFO("multiplicative_expression :cast_expression")
			}
		|	multiplicative_expression oMUL cast_expression
			{
				symbol	*p;

				PARSE_INFO("multiplicative_expression :multiplicative_expression oMUL cast_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, *)
					del_symbol($3);
					p = $1;
				}
				else
				{
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// imul	dx
					gen_mul("dx");
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		|	multiplicative_expression oDIV cast_expression
			{
				symbol	*p;

				PARSE_INFO("multiplicative_expression :multiplicative_expression oDIV cast_expression")
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_OPERATION($1, $3, /)
					del_symbol($3);
					p = $1;
				}
				else
				{
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// idiv	dx
					gen_div("dx");
					// push	ax
					gen_push_reg("ax");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		|	multiplicative_expression oMOD cast_expression
			{
				symbol	*p;

				PARSE_INFO("multiplicative_expression :multiplicative_expression oMOD cast_expression")
				CHECK_BIT_OP_TYPE($1)
				CHECK_BIT_OP_TYPE($3)
				if ( IS_CL($1) && IS_CL($3) )
				{
					// calcu it
					cast_cl_type($1, $3);
					_CL_DOUBLE_BIT_OPERATION($1, $3, %)
					del_symbol($3);
					p = $1;
				}
				else
				{
					p = gen_get_two_op_not_cl($1, $3, "ax", "dx");

					// idiv	dx
					gen_div("dx");
					// push	dx
					gen_push_reg("dx");
					
					// set rvalue flag
					p->is_rvalue = 1;
					// set pused flag
					p->is_pushed = 1;
				}
				$$ = p;
			}
		;

cast_expression
		:	unary_expression
			{
				PARSE_INFO("cast_expression :unary_expression")
			}
/*	// 类型转换
		|	oLP type_name oRP cast_expression
			{
				PARSE_INFO("cast_expression :oLP type_name oRP cast_expression")
			}
*/
		;

unary_expression
		:	postfix_expression
			{
				PARSE_INFO("unary_expression :postfix_expression")
			}
		|	oADDADD unary_expression
			{
				PARSE_INFO("unary_expression :oADDADD unary_expression")
				// change itself
				if ( !IS_LVALUE($2) )
				{
					yyerror("'++' needs l-value");
					user_exit(1);
				}
				// gen code
				if ( IS_ARRAY($2) )
					gen_get_array_element($2);

				// change assign value
				gen_inc($2->rname);

				// set rvalue flag
				$2->is_rvalue = 1;
				if ( IS_ARRAY($2) )
				{
					// push ax
					gen_mov_nopush_to_reg($2, "ax");
					gen_push_reg("ax");
					// set pushed flag
					$2->is_pushed = 1;
				}
				$$ = $2;
			}
		|	oSUBSUB unary_expression
			{
				PARSE_INFO("unary_expression :oSUBSUB unary_expression")
				// change itself
				if ( !IS_LVALUE($2) )
				{
					yyerror("'--' needs l-value");
					user_exit(1);
				}
				// gen code
				if ( IS_ARRAY($2) )
					gen_get_array_element($2);

				// change assign value
				gen_dec($2->rname);

				// set rvalue flag
				$2->is_rvalue = 1;
				if ( IS_ARRAY($2) )
				{
					// push ax
					gen_mov_nopush_to_reg($2, "ax");
					gen_push_reg("ax");
					// set pushed flag
					$2->is_pushed = 1;
				}
				$$ = $2;
			}
/*		|	unary_operator cast_expression */
		|	oPLUS cast_expression
			{
				PARSE_INFO("unary_operator :oPLUS cast_expression")
				// only ingore
				if ( !IS_CL($2) )
				{
					// set rvalue flag
					$2->is_rvalue = 1;
					// not pushed for default
				}
				$$ = $2;
			}
		|	oMINUS cast_expression
			{
				PARSE_INFO("unary_operator :oMINUS cast_expression")
		

⌨️ 快捷键说明

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