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

📄 cifa.cpp

📁 简单易用 易看的编译器 带词法分析和语法分析 输出是二元式和四元式 使用读取文件的方式进行编译 功能基本完整
💻 CPP
字号:
//#include "stdafx.h"
#include "cifa.h" 
#include "stdlib.h"

cifa::cifa(FILE *fp1)
{
	fp=fp1;
    
	KeyWord k1[]={    //关键字数组
	{"program",3},
	{"produce",5},
	{"var",4},	
	{"begin",6},
	{"end",7},
	{"if",8},
	{"then",9},
	{"else",10},
	{"while",11},
	{"do",12},
	{"integer",14},
	{"real",15}
};
  for(int i=0;i<13/*sizeof(k1)/sizeof(KeyWord)*/;i++)
  {
	  keyword[i].id=k1[i].id;
      strcpy(keyword[i].word,k1[i].word);
  }
 
  idaddr=0;
  huanhang=0;
  cur_ty=0;
}
void cifa:: reporterrors(char errorch[20])
{   huanhang++;

    cout<<"**error(1)="<<errorch<<"    ";
	if(huanhang%4==0) cout<<endl;
}
void cifa:: reporterror(char errorch)//报错函数
{   huanhang++;
    cout<<"**error(1)="<<errorch<<"    ";
	if(huanhang%4==0) cout<<endl;
}

int cifa::lookup(char *string)
{
 for(int i=0;i<sizeof(keyword)/sizeof(KeyWord);i++)
 {
  if(strcmp(string,keyword[i].word)==0)
   return keyword[i].id;
 }
 return 0;
} 

int cifa:: lookuprecode(char *string)
{
 for(int i=0;i<idaddr;i++)
 {
  if(strcmp(recode[i].word,string)==0)
   return recode[i].idaddr;
 }
 strcpy(recode[idaddr].word,string);
 recode[idaddr].idaddr=idaddr+1;
 idaddr++;
 return recode[idaddr-1].idaddr;//recode[idaddr].idaddr;
} 



void cifa:: out(int id ,char *string)
{
   
	if(id==1) 
	{
		//cout<<"("<<id<<","<<lookuprecode(string)<<")";
		//cout.width(12);
		//cout.setf(ios::left,ios::adjustfield);
		//cout<<string ;
	    cifaresult[cur_ty].type=1;
        strcpy(cifaresult[cur_ty].text,string);
		cifaresult[cur_ty].value=lookuprecode(string);
        cifaresult[cur_ty].address=cur_ty;
	
	
	}       
	else if(id==2) 
	{
		//cout<<"("<<id<<","<<string<<")";
        //cout.width(12);
		//cout.setf(ios::left,ios::adjustfield);
		//cout<<string ;
	    cifaresult[cur_ty].type=2;
        strcpy(cifaresult[cur_ty].text,string);
		cifaresult[cur_ty].value=atoi(string);
        cifaresult[cur_ty].address=cur_ty;
	}

	else 
	{
		//cout<<"("<<id<<","<<"0"<<")";
		//cout.width(12);
		//cout.setf(ios::left,ios::adjustfield);
		//cout<<string ;
	    cifaresult[cur_ty].type=id;
        strcpy(cifaresult[cur_ty].text,string);
		cifaresult[cur_ty].value=0;
        cifaresult[cur_ty].address=cur_ty;
	}
    //huanhang++;
	//if(huanhang%4==0) cout<<endl;
    cur_ty++;
	//cout<<"二元"<<cur_ty<<endl;
}

bool cifa:: isalpha(char c)   
{
 if( (c>='a'&&c<='z') || (c>='A'&&c<='Z') )
  return true;
 else
  return false;
}

bool cifa:: isdigit(char c)
{
 if(c>='0'&&c<='9')
  return true;
 else
  return false;
}

bool cifa:: isalnum(char c)
{
 if( isalpha(c) || isdigit(c) )
  return true;
 else
  return false;
}
void cifa:: scanner()
{
	char ch;
	int i,c;
	int first=1;
	
	
	while(!feof(fp))
	{
		ch=fgetc(fp);;
		/*起使符号是字母的处理*/
		if(isalpha(ch))
		{
			token[0]=ch;
			ch=fgetc(fp);i=1;
			while(isalnum(ch))
			{
				token[i]=ch;i++;
				ch=fgetc(fp);
			}
			token[i]='\0';
			fseek(fp,-1,1);
			c=lookup(token);
			if(c==0) out(ID,token);
			else out(c,token);
		}
		/*起使符号是数字的处理*/
		else if(isdigit(ch))
		{   
			token[0]=ch;
			ch=fgetc(fp);i=1;
			while(isdigit(ch))
			{
				token[i]=ch;i++;
				ch=fgetc(fp);
			}
			if(!isalpha(ch))
			{
				token[i]='\0';
				out(INT,token);
				fseek(fp,-1,1);
				goto next;
			}
			while(isalnum(ch))
			{
				token[i]=ch;i++;
				ch=fgetc(fp);
			}
			token[i]='\0';
			fseek(fp,-1,1);
			reporterrors(token);
			
			
next:;
    
	 cout<<"某dsdfsdfsdfsdf个数字"<<token<<endl;;
	 
		}
		
		else 
			switch(ch)
		{
		  case'<':
			  ch=fgetc(fp);
			  if(ch=='=') out(LE,"<=");
			  else if (ch=='>') out(NE,"<>");
			  else 
			  {
				  fseek(fp,-1,1);
				  out(LT,"<");
			  }
			  break;
			  
		  case '=': out(EQ, "="); break;
		  case '>': ch=fgetc(fp);
			  if(ch=='=')
				  out(GE,">=");
			  else
			  {
				  fseek(fp,-1,1);
				  out(GT,">");
			  }
			  break;
		  case ':': ch=fgetc(fp);
			  if(ch=='=')              // := 为赋值语句
				  out(FZ,":=");
			  else
			  {
				  fseek(fp,-1,1);
				  out(MH,":");
			  }
			  break;
			  
		  case '+': 
			  out(ADD,"+");
			  break;
          case '-': 
			  out(SUB,"-");
			  break;
		  case '*': 
			  out(MUL,"*");
			  break;
		  case '/': 
			  first=1;
			  ch=fgetc(fp);
			  if(ch=='*')
			  {
				  
				  
				  do{
				 
					 if(!first)  fseek(fp,-1,1);
					  do
					  {
						  ch=fgetc(fp);
						  
					  }while(ch!='*');
					  ch=fgetc(fp);				       
				      first=0; 
				  }while(ch!='/');
				  
				  
			  
			  }
			   if(ch=='/')
			  {
				  do
				  {
					  ch=fgetc(fp);
				  }while(ch!='\n');
				  
			  }
			
			  else
			  {
				  fseek(fp,-1,1);
				  out(DIV," ");
			  }
			  break;
		  case '~': 
			  out(SY,"~");
			  break;
          case '^': 
			  out(SS,"^");
			  break;
		  case '|': 
			  out(XS,"|");
			  break;
		  case ';': 
			  out(FH,";");
			  break;
		  case '.': 
			  out(JH,".");
			  break;
          case ',': 
			  out(DH,",");
			  break;
		  case '(': 
			  out(LKH,"(");
			  break;
		  case ')': 
			  out(RKH,")");
			  break;		  		  			  			  			  			  			  			  
		  case ' ' : break;                 //删除程序中的空格              
		  case '\n': break;   //删除程序中的回车,并记录程序编  			  	  
		  case (char)(-1): break;
		  default :
			  {reporterror(ch);
			  break;}
			  
		}
	 }
}






⌨️ 快捷键说明

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