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

📄 morphology.h

📁 计算机科学与技术专业课程编译原理的课程实验代码
💻 H
字号:
//////////////////////////////////////
//  词法分析部分功能函数清单:
//
void GetChar();
//将下一输入字符读到ch中,搜索指示器前移一字符位置。
void GetBC();
//检查ch中的字符是否为空白。
//若是,则调用GetChar直至ch中进入一个非空格字符。
void Concat();
//将ch中的字符接到strToken之后
void Retract();
//将搜索指示器回调一个字符位置,设ch为空白字符。
int InsertId();
//将strToken中的标识符加入变量名表
int InsertConst();
//将strToken中的常量加入常量表
int Reserve();
//对strToken中的字符查保留字表,若它是一个保留字则返回它的编码,
//否则返回0,(假定0不是保留字的编码)。
int Reserve_Flag();
//对strToken中的字符查符号表,若它是一个符号则返回它的编码,
//否则返回0,(假定0不是符号的编码)。
void Get_A_Word(ofstream onfile);
//读入一个单词,并转换他的内码。

void GetChar()
{
  ch=buff[I++];
}


void GetBC()
{
  while(ch==32)
  {
    ch=buff[I];
	I++;
  }
}


void Concat()
{
  char temp[2];
  temp[0]=ch;
  temp[1]='\0';
  strcat(strToken,temp);
}


void Retract()
{ 
	I--; 
	ch=32;
}


int Reserve()
{
   //保留字表
 
	for(int i=0;i<=lenth1-1;i++)  
	{ 
	 
		a_value[i]=i+1;   
	}
 
	for(i=0;i<=lenth1-1;i++) 
	{	 
		if(strcmp(strToken,a[i])==0) //如果两字符串相同,返回0 	 
		{ 	   
			return a_value[i];   	 
		}
 
	}
	return 0;
}

char* Change(char *s)//小写变为大写
{
	char p[1000]={'\0'};
	int len=strlen(s);	
	for(int i=0;i<len;i++)
	{
		if(s[i]>='A' && s[i]<'Z')
		{
			p[i]=s[i]+32;
		}
		else p[i]=s[i];
	}
	return p;
}


int Reserve_Flag()
{
   //保留字表 
	char*p=0;
	for(int i=0;i<=lenth2-1;i++) 
	{ 	
		d_value[i]=lenth1+1+i;   
	} 
	for(i=0;i<=lenth2-1;i++)
	{   p=Change(strToken);
		if(strcmp(strToken,d[i])==0)   
		{ 	   
			return d_value[i];   
		} 
	} 
	return 0;
}


int InsertId()
{
	for(int i=0;i<=J;i++)
	{
      if(strcmp(strToken,b[i])==0)
	  {
	    return b_value[i];
	  }
	}
	strcpy(b[J],strToken);
    b_value[J]=BEGIN_OF_V+1+J;
    J++;
    return b_value[J-1];
}
///////////////////////////////////////////////////////
int InsertConst()
{
	for(int i=0;i<=K;i++)	{
      
		if(strcmp(strToken,c[i])==0)	  
		{	  
			return c_value[i];	  
		}	
	} 
	strcpy(c[K],strToken); 
	c_value[K]=BEGIN_OF_C+1+K; 
	K++; 
	return c_value[K-1];
}


void Get_A_Word(ofstream onfile)
{
    int code;
	int value;
	strcpy(strToken,"");
	GetChar();	
	GetBC();
	if(isalpha(ch))//单词如果以字母开始
	{
      //cout<<"单词如果以字母开始"<<endl;
	  while(isalnum(ch)||isalpha(ch))
	  {
		  Concat();     
		  GetChar();
	  }	
	  Retract();
      code=Reserve();
	  if(code==0)//则该单词不是保留字就是变量名
	  {
       code=InsertId();
	   //cout<<"单词是变量"<<endl;
	  }
	  onfile<<code<<'\t';
      onfile<<strToken<<endl;
      onfile<<endl;
	}
	else
	{
	  
		if(isalnum(ch))//单词如果以数字开始,则是常量
	  
		{
         //cout<<"单词如果以数字开始"<<endl;
	     while(isalnum(ch))
		 {
	        Concat();     
		    GetChar();
		 }
	     Retract();
         code=InsertConst(); 
		 onfile<<code<<'\t';
		 onfile<<strToken<<endl;
		 onfile<<endl;
	  }
	  else//否则,则是符号或无效符号
	  {
          //cout<<"单词如果不是以字母或数字开始"<<endl;
		  switch (ch)
		  {
		   case '+': Concat(); code=ADD; break;
		   case '-': Concat(); code=SUB; break;
		   case '*': Concat(); code=MUL; break;
		   case '/': Concat(); code=DIV; break;
		   case '=': Concat(); code=EQU; break;
		   case '.': Concat(); code=DOT; break;
		   case ',': Concat(); code=COM; break;
		   case ';': Concat(); code=SEM; break;
		   case '(': Concat(); code=LBR; break; 
		   case ')': Concat(); code=RBR; break;
		   case '<': 
			        Concat(); GetChar(); 
					if (ch=='=')
					{ Concat(); code=LEQ; }
					else
					{ 
						if (ch=='>')
						{ Concat(); code=NEQ; }
						else
						{ Retract(); code=LES; } 
					}
           break;
		   case '>':
                    Concat(); GetChar();
		            if (ch=='=')
					{ Concat(); code=LAG; }
					else
					{ Retract(); code=GEQ; }
		   break;
		   case ':':
		            Concat(); GetChar();
                    if (ch=='=')
					{ Concat(); code=ASS; }
					else
					{ Retract(); code=COL; }
		   break;
		  }
		  onfile<<code<<'\t';
		  onfile<<strToken<<endl;
		  onfile<<endl;
		  if(code==0)
		  {
		    cout<<"无效字符!!"<<endl;
		  }
	  }
	}
  //字符串读函数 fgets(str,n,fp)
  //从指定文件(fp)读入n-1 个字符,如果在读入n-1个字符之前遇到换行符或EOF(-1),
  //读入即结束,结束后,在最后加上一个'\0'
  //fgets函数返回str的地址
}
/////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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