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

📄 y.tab.c

📁 简单实现C--语言的编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
	}

	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 + -