?? c.y
字號:
// 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 + -