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

📄 1.cpp

📁 PLX编译器,采用多遍式和自顶向下分析法. (内附测试代码)
💻 CPP
字号:
#include<stdio.h>

struct in
{
int kind;
int opnum;
int line;
};

in input[100];
int line=0;

int getcode(FILE *fp);

int main()
{
	   FILE *fp1,*fp2;//源程序
	   int pc=0;
	   int stack[100];
       int sc=0;//stackcount
	   int varcn=0;

	   if((fp1=fopen("target code.txt","r"))==NULL)
	   {
 			printf("不能打开源文件\n");
			return 0;
	   }//if

	   	   if((fp2=fopen("result.txt","w"))==NULL)
	   {
 			printf("不能打开源文件\n");
			return 0;
	   }//if


	  while(getcode(fp1)==3);

	  for(pc=0;pc<line;pc++)
	  {
	     //printf("%d %d %d \n",input[pc].kind,input[pc].opnum,input[pc].line);
		 switch(input[pc].kind)
		 {
		 case 1://LIT
			 sc++;
			 stack[sc]=input[pc].opnum;
			 break;
			
		 case 2://LOD
			 sc++;
			 stack[sc]=stack[input[pc].opnum];
			 break;

		 case 3://STO
             stack[input[pc].opnum]=stack[sc];
			 sc--;
			 break;

		 case 4://CAL
			 break;

		 case 5://INT
			 sc+=input[pc].opnum;
			 varcn=input[pc].opnum;
			 break;

		 case 6://JMP
			 pc=input[pc].opnum-1;
			 break;

		 case 7://JPC 假转
			 if(stack[sc]==0)
			 pc=input[pc].opnum-1;
			 sc--;
			 break;

		 case 8://OPR 
			 switch(input[pc].opnum)
			 {
			 case 0:
				 break;	
				 
			 case 1:
				 break;

			 case 2://相加
				 sc--;
				 stack[sc]=stack[sc]+stack[sc+1];
				 break;

			 case 3://相减
	             sc--;
				 stack[sc]=stack[sc]-stack[sc+1];
				 break;

			 case 4://乘
                 sc--;
				 stack[sc]=stack[sc]*stack[sc+1];
				 break;

			 case 5://除
				 sc--;
				 stack[sc]=stack[sc]/stack[sc+1];
				 break;
			 case 6:
				 break;
			 case 7:
				 break;
			 case 8://判相等
                 sc--;
				 if(stack[sc]==stack[sc+1])stack[sc]=1;
				 else stack[sc]=0;
				 break;

			 case 9://判不相等
                 sc--;
				 if(stack[sc]!=stack[sc+1])stack[sc]=1;
				 else stack[sc]=0;
				 break;

			 case 10://小于
                 sc--;
				 if(stack[sc]<stack[sc+1])stack[sc]=1;
				 else stack[sc]=0;
				 break;

			 case 11://大于等于
                 sc--;
				 if(stack[sc]>=stack[sc+1])stack[sc]=1;
				 else stack[sc]=0;
				 break;

			 case 12://大于
                 sc--;
				 if(stack[sc]>stack[sc+1])stack[sc]=1;
				 else stack[sc]=0;
				 break;

			 case 13://小于等于
                 sc--;
				 if(stack[sc]<=stack[sc+1])stack[sc]=1;
				 else stack[sc]=0;
				 break;
			 }//switch
			 break;

		 case 10://HLT
			  printf("停机 \n");
			  return 0;
		 case 9://WRI
			 fprintf(fp2,"%d \n",stack[sc]);
			 printf("%d \n",stack[sc]);
		       break;
		 }
	  }
	  return 0;
}

int getcode(FILE *fp)
{
	int m=-1;
    m=fscanf(fp,"%d %d %d ",&input[line].kind,&input[line].opnum,&input[line++].line);
    return m;
}
//杨高南路 2140号 建业新村 45楼 202
//运行栈的stack[3]没有使用 开始有三个变量, 开始LIT 中++ 所以一直是从第四个开始使用

⌨️ 快捷键说明

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