📄 y.tab.c
字号:
}
if(yyvsp[-1]._expr.code != NULL && yyvsp[0]._expr.code != NULL){
yyval._expr.code = (char *)malloc(strlen(yyvsp[-1]._expr.code) + strlen(yyvsp[0]._expr.code)+1);
strcpy(code,yyvsp[-1]._expr.code);
strcat(code,yyvsp[0]._expr.code);
strcpy(yyval._expr.code,code);
}
else if(yyvsp[-1]._expr.code != NULL && yyvsp[0]._expr.code == NULL) {
yyval._expr.code = (char *)malloc(strlen(yyvsp[-1]._expr.code) +1);
strcpy(code,yyvsp[-1]._expr.code);
strcpy(yyval._expr.code,code);
}
else if(yyvsp[-1]._expr.code == NULL && yyvsp[0]._expr.code != NULL) {
yyval._expr.code = (char *)malloc(strlen(yyvsp[0]._expr.code) +1);
strcpy(code,yyvsp[0]._expr.code);
strcpy(yyval._expr.code,code);
}
else yyval._expr.code = "";
}
break;
case 31:
#line 781 "c--.y"
{
yyval._expr.code = "";
trace("empty stmt_list\n");
}
break;
case 32:
#line 788 "c--.y"
{ trace("stmt => expr_stmt\n"); /* 语句类型*/
}
break;
case 33:
#line 791 "c--.y"
{ trace("stmt => comp_stmt\n"); }
break;
case 34:
#line 793 "c--.y"
{ trace("stmt => if_stmt\n"); }
break;
case 35:
#line 795 "c--.y"
{ trace("stmt => while_stmt\n"); }
break;
case 36:
#line 797 "c--.y"
{
trace("stmt => return_stmt\n");
if(is_funret){ /*函数有返回值*/
if(yyvsp[0]._expr.is_const){
yyval._expr.is_const = 1;
yyval._expr.value = yyvsp[0]._expr.value;
}
else{
yyval._expr.is_const =0;
}
}
/*$$.code = $1.code;*/
}
break;
case 37:
#line 814 "c--.y"
{
if(verbose) fprintf(stderr, "expr_stmt => expr \n");
yyval._expr = yyvsp[-1]._expr;
}
break;
case 38:
#line 819 "c--.y"
{ trace("expr_stmt => ;\n");
yyval._expr.code = "";
}
break;
case 39:
#line 826 "c--.y"
{
char code[1000];
int len;
char *E_false;
trace("if_stmt => if ( expr ) stmt\n");
if(yyvsp[-2]._expr.is_const){
if(yyvsp[-2]._expr.value != 0 ){
if(yyvsp[0]._expr.code != NULL){
strcpy(code,yyvsp[0]._expr.code);
len = strlen(code);
yyval._expr.code = (char *)malloc(len+1);
strcpy(yyval._expr.code,code) ;
}
}
else yyval._expr.code = "";
}
else{
E_false = newlabel();
strcpy(code,yyvsp[-2]._expr.code);
len = strlen(code);
sprintf(&code[len],"%s\n",E_false);
len = strlen(code);
if(yyvsp[0]._expr.code != NULL){
strcat(code,yyvsp[0]._expr.code);
len = strlen(code);
}
sprintf(&code[len],"%s:\n",E_false);
len = strlen(code);
yyval._expr.code = (char *)malloc(len + 1);
strcpy(yyval._expr.code,code);
}
}
break;
case 40:
#line 861 "c--.y"
{
char code[1000];
int len;
char *E_false;
char *S_next;
trace("if_stmt => if ( expr ) stmt else stmt\n");
if(yyvsp[-4]._expr.is_const){
if(yyvsp[-4]._expr.value != 0 ){
if(yyvsp[-2]._expr.code != NULL){
strcpy(code,yyvsp[-2]._expr.code);
len = strlen(code);
yyval._expr.code = (char *)malloc(len+1);
strcpy(yyval._expr.code,code) ;
}
}
else{
if(yyvsp[0]._expr.code != NULL){
strcpy(code,yyvsp[0]._expr.code);
len = strlen(code);
yyval._expr.code = (char *)malloc(len+1);
strcpy(yyval._expr.code,code) ;
}
}
}
else{
E_false = newlabel();
S_next = newlabel();
strcpy(code,yyvsp[-4]._expr.code);
len = strlen(code);
sprintf(&code[len],"%s\n",E_false);
len = strlen(code);
if(yyvsp[-2]._expr.code !=NULL){
strcat(code,yyvsp[-2]._expr.code); /* 真*/
len = strlen(code);
}
sprintf(&code[len]," jmp %s\n",S_next);
len = strlen(code);
sprintf(&code[len],"%s:\n",E_false); /*label E_false*/
len = strlen(code);
if(yyvsp[0]._expr.code != NULL){
strcat(code,yyvsp[0]._expr.code); /*假*/
len = strlen(code);
}
sprintf(&code[len],"%s:\n",S_next); /* label S_next*/
len = strlen(code);
yyval._expr.code = (char *)malloc(len + 1);
strcpy(yyval._expr.code,code);
}
}
break;
case 41:
#line 914 "c--.y"
{
char code[1000];
int len;
char *S_begin;
char *S_next;
trace("while_stmt => while ( expr ) stmt\n");
if(yyvsp[-2]._expr.is_const){
if(yyvsp[-2]._expr.value != 0){
S_begin = newlabel();
strcpy(code,S_begin);
len = strlen(code);
if(yyvsp[0]._expr.code != NULL){
strcat(code,yyvsp[0]._expr.code);
len = strlen(code);
}
sprintf(&code[len]," jmp %s\n",S_begin);
len = strlen(code);
yyval._expr.code = (char *)malloc(len +1);
strcpy(yyval._expr.code,code);
}
else yyval._expr.code = "";
}
else{
S_begin = newlabel();
S_next = newlabel();
/*strcpy(code,S_begin); // 此处用两种都可以*/
sprintf(code,"%s:\n",S_begin);
len = strlen(code);
strcat(code,yyvsp[-2]._expr.code);
len = strlen(code);
sprintf(&code[len],"%s\n",S_next);
len = strlen(code);
if(yyvsp[0]._expr.code != NULL){
strcat(code,yyvsp[0]._expr.code);
len = strlen(code);
}
sprintf(&code[len]," jmp %s\n",S_begin);
len = strlen(code);
sprintf(&code[len],"%s:\n",S_next);
len = strlen(code);
yyval._expr.code = (char *)malloc(len +1);
strcpy(yyval._expr.code,code);
}
}
break;
case 42:
#line 962 "c--.y"
{
trace("return_stmt => return ; \n");
is_funret = 0;
}
break;
case 43:
#line 967 "c--.y"
{
/*char code[100];*/
trace("return_stmt => return expr ;\n");
is_funret = 1;
if(yyvsp[-1]._expr.is_const){
yyval._expr.is_const = 1;
/*sprintf(&code[0]," mov ebx , %d\n",$2.value); */
yyval._expr.value = yyvsp[-1]._expr.value;
}
else{
yyval._expr.is_const = 0;
/*sprintf(&code[0]," mov ebx , [ebp-%d] ; %s\n",$2.place->offset+4,$2.place->name);*/
temp_ret = yyvsp[-1]._expr.place; /*临时存放返回的单元 可以改用ebx 寄存器来实现*/
}
/*$$.code = (char *)malloc(strlen(code)+1);*/
/*strcpy($$.code,code);*/
}
break;
case 44:
#line 988 "c--.y"
{
char code[1000];
int len;
if(yyvsp[-2]._sym->type != yyvsp[0]._expr.type){ /* 表达式类型检查 */
fprintf(errfile,"line %d : expression type wrong \n",nline);
is_error++;
return 0;
}
else{
yyval._expr.type = yyvsp[-2]._sym->type;
if (yyvsp[0]._expr.is_const){ /* expr为常量的情况*/
sprintf(code," mov edx , %d\n",yyvsp[0]._expr.value);
len = strlen(code);
sprintf(&code[len], " mov dword ptr [ebp-%d], edx;%s\n", yyvsp[-2]._sym->offset+4,yyvsp[-2]._sym->name);
}
else {
if(yyvsp[0]._expr.code != NULL){
strcpy(code, yyvsp[0]._expr.code);
len = strlen(code); /* $3 的代码接在 $1 的代码后面 */
sprintf(&code[len]," mov edx ,dword ptr [ebp-%d] ; %s\n",yyvsp[0]._expr.place->offset+4,yyvsp[0]._expr.place->name);
}
else {
sprintf(code," mov edx , dword ptr [ebp-%d] ; %s\n",yyvsp[0]._expr.place->offset+4,yyvsp[0]._expr.place->name); /* 一个操作数*/
}
len = strlen(code);
sprintf(&code[len], " mov dword ptr [ebp-%d] , edx ; %s\n", yyvsp[-2]._sym->offset+4,yyvsp[-2]._sym->name);
}
len =strlen(code);
yyval._expr.code = (char *)malloc(len+1);
strcpy(yyval._expr.code, code);
}
}
break;
case 45:
#line 1023 "c--.y"
{ yyval._expr = yyvsp[0]._expr; }
break;
case 46:
#line 1029 "c--.y"
{
symbol *p;
struct table * tp = table_stack[table_len-1]; /*当前层*/
if (verbose) fprintf(stderr, "look for %s\n", yyvsp[0]._ident);
if( ( p = lookup_all(yyvsp[0]._ident,tp)) == 0){ /*所有层中查找不到*/
fprintf(errfile, "line %d : undeclared identifier: %s \n",nline,yyvsp[0]._ident);
is_error++;
return 0;
}
else{
if( p->scope != level && p->isargv == 1){ /* 有找到,但是其他函数的形参 */
fprintf(errfile, "line %d : undeclared identifier: %s \n",nline,yyvsp[0]._ident);
is_error++;
return 0;
}
else{
if(p->type != INT && p->type !=CHAR){ /* 类型只允许int char */
fprintf(errfile, "line %d : type unexpected\n:\n", nline);
is_error++;
return 0;
}
else yyval._sym = p ; /* 同为symbol 类型*/
}
}
}
break;
case 47:
#line 1057 "c--.y"
{
symbol *p;
struct table * tp = table_stack[table_len-1];
trace("var => ID [ expr ]\n");
if(( p = lookup_all(yyvsp[-3]._ident, tp)) == 0){
fprintf(errfile, "line %d :undeclared identifier: %s \n",nline,yyvsp[-3]._ident);
is_error++;
return 0;
}
/* 数组类型 */
if(p->type == INT_ARRAY) yyval._sym->type = INT;
else if(p->type == CHAR_ARRAY) yyval._sym->type = CHAR;
else if(p->type == INT_POINT_ARRAY) yyval._sym->type = INT_POINT;
else if(p->type == CHAR_POINT_ARRAY) yyval._sym->type = CHAR_POINT;
else{ /*无其他类型*/
fprintf(errfile,"nline %d :type unexpected\n",nline);
is_error++;
return 0;
}
/*.... */
}
break;
case 48:
#line 1082 "c--.y"
{
char rop[4];
char code[1000];
int len;
trace("simple_expr => add_expr relop add_expr\n");
if(yyvsp[-2]._expr.type != INT && yyvsp[-2]._expr.type != CHAR || yyvsp[0]._expr.type != INT && yyvsp[0]._expr.type != CHAR){ /*只允许int char型*/
fprintf(errfile,"line %d : type unexpected\n",nline);
is_error++;
return 0;
}
else{
yyval._expr.type = INT;
strcpy(rop,yyvsp[-1]._expr.code); /*op */
rop[strlen(rop)] = '\0';
if(yyvsp[-2]._expr.is_const && yyvsp[0]._expr.is_const){ /*两个均是常数*/
if( (strcmp(rop,"le") == 0) && yyvsp[-2]._expr.value <= yyvsp[0]._expr.value) yyval._expr.value = 1;
else if((strcmp(rop,"l") == 0) && yyvsp[-2]._expr.value < yyvsp[0]._expr.value) yyval._expr.value = 1;
else if((strcmp(rop,"g") == 0) && yyvsp[-2]._expr.value > yyvsp[0]._expr.value) yyval._expr.value = 1;
else if((strcmp(rop,"ge") == 0) && yyvsp[-2]._expr.value >= yyvsp[0]._expr.value) yyval._expr.value = 1;
else if((strcmp(rop,"e") == 0) && yyvsp[-2]._expr.value == yyvsp[0]._expr.value) yyval._expr.value = 1;
else if((strcmp(rop,"ne") == 0) && yyvsp[-2]._expr.value != yyvsp[0]._expr.value) yyval._expr.value = 1;
else yyval._expr.value = 0;
}
else {
if(!yyvsp[-2]._expr.is_const && yyvsp[0]._expr.is_const){
sprintf(code," mov edx ,dword ptr [ebp-%d] ; %s\n",yyvsp[-2]._expr.place->offset+4,yyvsp[-2]._expr.place->name);
len = strlen(code);
sprintf(&code[len]," cmp edx , %d\n",yyvsp[0]._expr.value);
len = strlen(code);
if(strcmp(rop,"le")==0) sprintf(&code[len]," jg short ");
else if(strcmp(rop,"l")==0) sprintf(&code[len]," jge short ");
else if(strcmp(rop,"g")==0) sprintf(&code[len]," jle short ");
else if(strcmp(rop,"ge")==0) sprintf(&code[len]," jl short ");
else if(strcmp(rop,"e")==0) sprintf(&code[len]," jne short ");
else if(strcmp(rop,"ne")==0)sprintf(&code[len]," je short ");
len = strlen(code);
}
else if(yyvsp[-2]._expr.is_const && !yyvsp[0]._expr.is_const){
sprintf(code," mov edx ,dword ptr [ebp-%d] ; %s\n",yyvsp[0]._expr.place->offset+4,yyvsp[0]._expr.place->name);
len = strlen(code);
sprintf(&code[len]," cmp edx , %d\n",yyvsp[-2]._expr.value);
len = strlen(code);
if(strcmp(rop,"le")==0) sprintf(&code[len]," jl short ");
else if(strcmp(rop,"l")==0) sprintf(&code[len]," jle short ");
else if(strcmp(rop,"g")==0) sprintf(&code[len]," jge short ");
else if(strcmp(rop,"ge")==0) sprintf(&code[len]," jg short ");
else if(strcmp(rop,"e")==0) sprintf(&code[len]," jne short ");
else if(strcmp(rop,"ne")==0)sprintf(&code[len]," je short ");
len = strlen(code);
}
else{
sprintf(code," mov edx , dword ptr [ebp-%d] ; %s\n",yyvsp[-2]._expr.place->offset+4,yyvsp[-2]._expr.place->name);
len = strlen(code);
sprintf(&code[len]," cmp edx , dword ptr [ebp-%d] ; %s\n",yyvsp[0]._expr.place->offset+4,yyvsp[0]._expr.place->name);
len = strlen(code);
if(strcmp(rop,"le")==0) sprintf(&code[len]," jg short ");
else if(strcmp(rop,"l")==0) sprintf(&code[len]," jge short ");
else if(strcmp(rop,"g")==0) sprintf(&code[len]," jle short ");
else if(strcmp(rop,"ge")==0) sprintf(&code[len]," jl short ");
else if(strcmp(rop,"e")==0) sprintf(&code[len]," jne short ");
else if(strcmp(rop,"ne")==0) sprintf(&code[len]," jne short ");
len = strlen(code);
}
yyval._expr.code = (char *)malloc(len + 1);
strcpy(yyval._expr.code,code);
}
}
}
break;
case 49:
#line 1154 "c--.y"
{ yyval._expr = yyvsp[0]._expr; }
break;
case 50:
#line 1158 "c--.y"
{
char code[1000];
int len;
char *op;
if (yyvsp[-2]._expr.is_const && yyvsp[0]._expr.is_const) { /* constant folding 均为常量*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -