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

📄 my_subfunc.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];
  I++;
  //cout<<"get_ch-----:  "<<ch<<endl;
};
///////////////////////////////////////////////////////
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;
};
//////////////////////////////////////////////////////
int Reserve_Flag()
{
   //保留字表
 for(int i=0;i<=lenth2-1;i++)
 { 
	 d_value[i]=lenth1+1+i;  
 }
 for(i=0;i<=lenth2-1;i++)
 {
   if(strcmp(strToken,d[i])==0)
	   //如果两字符串相同,返回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<<endl;
/*****/onfile<<strToken<<endl;
/*****/onfile<<endl;
	}
	else
	{
	  if(isalnum(ch))//单词如果以数字开始,则是常量
	  {
         //cout<<"单词如果以数字开始"<<endl;
	     while(isalnum(ch))
		 {
	        Concat();     
		    GetChar();
		 }
	     Retract();
         code=InsertConst();
         //cout<<"单词是常量"<<endl;
/*******/onfile<<code<<endl;
/*******/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<<endl;
/********/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 + -