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

📄 comilpe_work1.cpp

📁 一个简单的表达式编译器,大家可以试一试.
💻 CPP
字号:
// Comilpe_work1.cpp: implementation of the CComilpe_work1 class.
//
//////////////////////////////////////////////////////////////////////
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include <process.h>
#include "Comilpe_work1.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CComilpe_work1::CComilpe_work1()
{

     t=0;    //运行栈顶指针
     tx=0;     //buffer指针
     code_pointer=0;   //指向最新生成的pcode代码的指针
     equal_flags=0; //记录等于号的数目,以对多个字母连续赋值
     tag=0;    //设置是否有等于号的标志 
///////////////
    int fx=0;
	char ch;
	if((in=fopen("infile.txt","r"))==NULL)
	{
        cout<<"Cannot open the file!"<<endl;
        exit(0);
	} 
    ch=fgetc(in);
	while(ch!=EOF)
	{
		buffer[fx]=ch;
		ch=fgetc(in);
		fx++;
	}
	buffer[fx]='\0';
	fclose(in);
	
	for(int i=0;i<30;i++)  //初始化字母表
	{
		table[i].ident='#';
		table[i].value=-1;
	}
	//cout<<"the buffer is:"<<endl;
	//cout<<buffer<<endl;
/////////////
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
CComilpe_work1::~CComilpe_work1()
{

}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
void CComilpe_work1::gen(char *p_f,int lev_value,int a_value)  //生成pcode目标代码
{
    code[code_pointer].f=p_f;
	code[code_pointer].l=lev_value;
	code[code_pointer].a=a_value;
	interpret();
    code_pointer++;
}
////////////////////////////////////////////////////////////
//因子->无符号整数|(表达式)|字母=表达式|字母
////////////////////////////////////////////////////////////
void CComilpe_work1::factor()      //因子处理程序
{
    int i=0;
	if(ssym.sym==endflags) ;//表达式结束
	else                      //表达式没结束
	{
	   if(ssym.sym!=chid)  //如果不是标识符
	   {
	    	if(ssym.sym!=number)  //如果不是数字
			{
		    	if(ssym.sym==lparen) //遇到左括号
				{
			    	getsym();
			    	expresion();//循环进行表达式分析
				    if(ssym.sym==rparen)//当遇到第一个右括号时判断是否为赋值
					{
                      if(tag!=0)     //tag用来记录前面是否有等于号
					  {
					  	gen("sto",0,t_flags[equal_flags-1]); //给字母表的对应字母添值
                        equal_flags=equal_flags-1;
				    	tag--;
					  }
					  getsym();
					}
				}
			}
			else  {gen("lit",0,ssym.num);  getsym();}
	   }
	   else 
	   {		
		  struct symbol t_allv=ssym;
		  while(table[i].ident!='#')
		  {
			  if(table[i].ident==t_allv.num)  //
			  {     			    	
			      t_flags[equal_flags]=i; 
				  equal_flags++;
			      break;
			  }					
			  i++;
		  }
		  if(table[i].ident=='#')   //没找到:则添字母表
		  { 
		   	 table[i].ident=ssym.num;// 
		     t_flags[equal_flags]=i;
			 equal_flags++;
		  }
	      getsym();
		  if(ssym.sym==equal)
		  {
				tag++;
				getsym();
				expresion();
		  }
		  else
		  {	         
		       if(table[i].value!=-1) { gen("lit",0,table[i].value);  }//  待续?????
			   else   cout<<"the symbol is not defined"<<endl;					
		  }
	   }
	}
}
///////////////////////////////////////////////////
//  项->因子{乘法运算符 因子}
///////////////////////////////////////////////////
void CComilpe_work1::term() //项
{
	factor();
	while(ssym.sym==times||ssym.sym==div)
	{
		enum SYM p_sym=ssym.sym;
		getsym();
		factor();
		if(p_sym==times)
			gen("opr",0,4);//4号指令
		else   gen("opr",0,5);//5号指令
	}
}
////////////////////////////////////////////////////
//表达式->[+|-]项{加法运算符 项}
////////////////////////////////////////////////////
void CComilpe_work1::expresion()  //表达式
{
	if(ssym.sym==plus||ssym.sym==minus)
	{
		enum SYM p_sym=ssym.sym;
		getsym();
		term();
		if(p_sym==minus)   gen("opr",0,1);
	}
	else  term();
	while(ssym.sym==plus||ssym.sym==minus)
	{
		enum SYM q_sym=ssym.sym;
		getsym();
		term();
		if(q_sym==plus)  gen("opr",0,2);
		else  gen("opr",0,3);
	}
}
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
void CComilpe_work1::interpret()    //解释程序
{
    int a_value;
	char *p;
	p=code[code_pointer].f;   
	a_value=code[code_pointer].a;
    if(strcmp(p,"opr")==0)
		switch(a_value)
		{
		case 1: stoken[t]=-stoken[t];break;
		case 2: t=t-1;stoken[t]=stoken[t]+stoken[t+1];break;
		case 3: t=t-1;stoken[t]=stoken[t]-stoken[t+1];break;
		case 4: t=t-1;stoken[t]=stoken[t]*stoken[t+1];break;
		case 5: t=t-1;stoken[t]=stoken[t]/stoken[t+1];break;
		default : cout<<"not plus or minus or times or div!"<<endl;
		}
	else if(strcmp(p,"lit")==0)
	{
        t=t+1; stoken[t]=a_value;
	}
	else if(strcmp(p,"sto")==0)
	{
		table[a_value].value=stoken[t];
	}
    else  cout<<"other code instruction!"<<endl;
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
void CComilpe_work1::block()    //语法分析程序
{
	getsym();   
	expresion();
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
struct symbol CComilpe_work1::getsym()
{
	int sum=0;
	if(buffer[tx]=='\0')   //取到表达式的末尾
	{
		ssym.sym=endflags;
		ssym.num=-1;
	}
    else if(buffer[tx]>='a'&&buffer[tx]<='z') //读到的单词是字母
	{
	    ssym.sym=chid;
		ssym.num=buffer[tx];
		tx++;
	}
	else if(buffer[tx]=='+'||buffer[tx]=='-'||buffer[tx]=='*'||buffer[tx]=='/'||buffer[tx]=='('||buffer[tx]==')'||buffer[tx]=='=') //读到的单词是运算符
	{
       switch(buffer[tx])
	   {
     	case '+': ssym.sym=plus;  break;
     	case '-': ssym.sym=minus;  break;
	    case '*': ssym.sym=times;  break;
     	case '/': ssym.sym=div;   break;
     	case '(': ssym.sym=lparen;  break;
    	case ')': ssym.sym=rparen;  break;
    	case '=': ssym.sym=equal;  break;
	   }
	   ssym.num=-1;
	   tx++;
	}
	else if(buffer[tx]>='0'&&buffer[tx]<='9')  //读到的是数字
	{
	   while(buffer[tx]>='0'&&buffer[tx]<='9')
	   {
	     	sum=sum*10+(buffer[tx]-'0');
			tx++;
	   }
       ssym.sym=number;
	   ssym.num=sum;
	}	
	return ssym;
}
//////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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