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

📄 compile.cpp

📁 自己写的一个编译程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	   case '*':
	   case '/':
	   case ')':
	   case ';':
	   case '(':
	   case '\n':{ rem(mem,1);

					    break;}
	  default:error(1);//printf("gg%cpp",mid[count]);
	          break;
	  }
	}

 }


void mark(char &m)
	{if(('0'<=mid[count]&&mid[count]<='9')||('a'<=mid[count]&&mid[count]<='z') )
		{word[len]=mid[count];len++;
		advance();
		m=mid[count];
		mark(m);
		}
	 else 	{
		switch(mid[count])
			{case '\0':
			 case '.':
			 case '\n':
			 case ' ':if( key()){break; }
			 case '>':
			 case '<':
			 case '=':
			 case '+':
			 case '-':
			 case '*':
			 case '/':
			 case ')':
			 case ',':
			 case ':':
			 case ';':{rem(mem,2);

				 break;


				  }
			 default:error(2);count++; break;
			}
		}
	 }
void start(char &m)
{
	int door=0;
	// printf("[");
	if('0'<=mid[count]&&mid[count]<='9'){door=1;}
	else 	if('a'<=mid[count]&&mid[count]<='z')door=2;


	if(door==1){len=0;num(m);}
	else	{if(door==2){len=0;mark(m); }
		 else {
			switch(mid[count])
			       {case '<':count++;word[0]='<';
					if(mid[count]=='='){word[1]='=';count++;rem(mem,27);}
					else{ if(mid[count]=='>'){word[1]='>';count++;rem(mem,30);}
					      else {rem(mem,14); }
					     }
					break;
				case '>':count++;word[0]='>';
					if(mid[count]=='='){word[1]='=';count++;rem(mem,28);}
					else{ rem(mem,15); }
					break;
				case '=':word[0]='=';count++;rem(mem,16);break;
				case '+':word[0]='+';count++;rem(mem,17);break;
				case '-':word[0]='-';count++;rem(mem,18);break;
				case '*':word[0]='*';count++;rem(mem,19);break;
				case '/':word[0]='/';count++;rem(mem,20);break;
				case '(':word[0]='(';count++;rem(mem,21);break;
				case ')':word[0]=')';count++;rem(mem,22);break;
				case ';':word[0]=';';count++;rem(mem,23);break;
				case ',':word[0]=',';count++;rem(mem,24);break;
				case '.':word[0]='.';count++;rem(mem,25);break;
				case ':':count++;word[0]=':';
					if(mid[count]=='='){word[1]='=';count++;rem(mem,29);}
					else{ rem(mem,26); }
					break;
				case ' ':count++;break;
				case '\n':count++; break;
				default:error(3);count++;break;
				}
		       }
		   }

}
int relationexp()
	{int i=0;int a,b;int c;
	 while(!wrong&&count<=mem.length&&!expaction(l,getstate(),strtono()))
		{ }


	 a=l.row[l.length+1][2]; //printf("rlationexp nowvalue1=%s\n",mem.row[count].value);

	if(!wrong&&(match(14)||match(15)||match(16)||match(28)||match(27)||match(30)))
	{	switch(mem.row[count].no)
		{case 15:c=3;break;
		 case 14:c=4;break;
		 case 28:c=5;break;
		 case 27:c=6;break;
		 case 16:c=7;break;
		 case 30:c=8;break;

		}

	 count++;//printf("nowvalue2=%s\n",mem.row[count].value);
	 while(!wrong&&count<=mem.length&&!expaction(l,getstate(),strtono()))
		{ }
	 b=l.row[l.length+1][2];
	  if(!wrong){i=1;gen(c,a,b,0);c=9;gen(c,0,0,0);}
	}

	if(i==0)error(9);
	return i;
	}
void backpath(int i,int j)
	{if(i<fourlist.length&&j<=fourlist.length)
		fourlist.row[i].addr=j;
	 else error(15);//printf("backpath error.");
	 }

int sentence()
	{int i=0; int p,q;
	switch(mem.row[count].no)
		{case 6:{count++;
			while(count<mem.length)
				{if(sentence())count++;
				 if(mem.row[count].no==7)break;
				 }

			// printf("llll[%s,%d],c%d,l%d",mem.row[count].value,mem.row[count].no,count,mem.length);
			 if(mem.row[count].no==7){i=1;if((count+1==mem.length)&&mem.row[count+1].no!=25){i=0;error(17);}
						 }


			if(i==0) error(4);
			break;
			}

		 case 8:{
				count++;
				      //	printf("klklk<%s>",mem.row[count].value);
				if(relationexp())
				{   p=fourlist.length-2;
						if(match(9))
						{ backpath(p,fourlist.length);
							count++;
							if(!match(8))
							{
							if(sentence())
								{
								 q=fourlist.length;
								 gen(9,0,0,0);
								 backpath(p+1,fourlist.length);
								 count++;
								i=1;//printf("kkk%s",mem.row[count].value);
								if(match(10)){count++; if(sentence())i=1;

									      }
								 else count--;
								   backpath(q,fourlist.length);
								 }
							 }
							 else error(19);
					         }
						 else error(20);

			         }//printf("%s",mem.row[count].value);
			  if(i==0)error(5);
			 break;
			}
		 case 2:{p=lookup(mem.row[count].value);
			 strcpy(variable.row[p].name,mem.row[count].value);
			 count++;//
			 if(mem.row[count].no==29)
					{count++; while(!wrong&&count<=mem.length&&!expaction(l,getstate(),strtono()))
							{ }

						 if(!wrong){i=1;variable.row[p].value=variable.row[l.row[l.length+1][2]].value;
						// printf("give %s=%d \n",variable.row[l.row[l.length+1][2]].name,variable.row[l.row[l.length+1][2]].value);
							   }
						// else  printf("expresion wrong");

					  if(mem.row[count].no!=23){i=0;error(10);}
					}
			  else error(21);
                         
				      //	printf("n<%d,%s>\n",mem.row[count].no,mem.row[count].value);
			// count++;
			
			if(i==0)error(7);
			else gen(2,l.row[l.length+1][2],0,p);
			break;
			}

		 case 11:{count++;//printf("k<%d,%s>\n",mem.row[count].no,mem.row[count].value);
			  p=fourlist.length;
			  if(relationexp())
			  { q=fourlist.length-2;
			     if(match(12))
				{backpath(q,fourlist.length);
				count++;
				if(sentence())i=1;
				gen(9,0,0,p);
                                backpath(q+1,fourlist.length);

				}
			     
                           
			  }else error(18);
			  if(i==0)error(6);
			  break;
			  }


		 default:error(8);count=mem.length;return 0;
		                  
		}
	return i;
	}

main()
{char m;mem.length=0;fourlist.length=0;variable.length=-1;
 count=0;
  printf("********************************************************\nplease enter filename:");
   scanf("%s",b);
   printf("********************************************************\n");
   int i;i=0;
if((fp=fopen(b,"a+"))!=NULL)
	 
{   while(i<max&&fread(&m,sizeof(char),1,fp) && !feof(fp))
   {printf("%c",m);mid[i]=m;

     i++;
     }
   mid[i]='\0';i--;
      fclose(fp);
     printf("\n");

    

   while(count<=i){clear();
    start(mid[0]);}
    mem.row[mem.length].no=31;mem.row[mem.length].value[0]='#';

 count=0;
  for(count;count<mem.length;count++)
{ 	printf("(%d,%s) ",mem.row[count].no,mem.row[count].value);
	if((count+1)%6==0)printf("\n");
}

 printf("\n");
 expactioninit();expgotoinit();
 l.length=-1;
 pushs(l,0);pushc(l,6,0);
 count=0;
 if( !sentence())wrong=1;
 if(wrong==0)
 {printf("compile success\n");
  char opchar[10][4]={"+","*",":=","j>","j<","j>=","j<=","j=","j<>","j"};
 
	for(int kk=0;kk<fourlist.length;kk++)
	   {printf("no=%d,(%s,",kk,opchar[fourlist.row[kk].op]);
	    if(fourlist.row[kk].op==9)printf("0,");
	    else{ if(variable.row[fourlist.row[kk].opn1].type==1)printf("%d,",variable.row[fourlist.row[kk].opn1].value);
		 else printf("%s,",variable.row[fourlist.row[kk].opn1].name);
		}
	    if(fourlist.row[kk].op==9)printf("0,");
	    else {if(fourlist.row[kk].op!=2){	if(variable.row[fourlist.row[kk].opn2].type==1)printf("%d,",variable.row[fourlist.row[kk].opn2].value);
					else printf("%s,",variable.row[fourlist.row[kk].opn2].name);
				      }
			else {printf("0,");}
		 }
	    if(fourlist.row[kk].op<=2)
		{
		 printf("%s)\n",variable.row[fourlist.row[kk].addr].name);
		}
	    else printf("%d)\n",fourlist.row[kk].addr);
	    }

//	for(int ii=0;ii<=variable.length;ii++)
//		{printf("%s=%d; ",variable.row[ii].name,variable.row[ii].value);
//		 if ((ii+1)%5==0)printf("\n");
//                }
 }
}
else printf("can't open file.");

 return 1;}

⌨️ 快捷键说明

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