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

📄 compiler.cpp

📁 (1) 将此番分析程序设计成独立一遍扫描源程序的结构。词法分析的输出结果采用如下的二元组表示: (单词种别
💻 CPP
字号:
 #include "stdio.h"
 #include "conio.h"
 #include "string.h"
 #include "ctype.h"
 #define  KeyWordCodeBeginNo 1
 #define  OneArithmeticSymbolCodeBeginNo 14
 #define  TwoArithmeticSymbolCodeBeginNo 19
 #define  BoundSymbolCodeBeginNo 27
 #define  ConstCodeNo 34
 #define  IDCodeNo 35
 
//===========================数据区=======================
//关键字表:
 char *KeyWordTable[]={"const","var","procedure","begin","end","odd","if","then","call","while","do","read","write"};
 int  KeyWordTableLength=13; 
//算符表:
 char OneArithmeticSymbolTable[]={'+','-','*','/','#'};
 int  OneArithmeticSymbolTableLength=0;
 char TwoArithmeticSymbolTable[]={':','<','>','='};
 int  TwoArithmeticSymbolTableLength=0;
//界符表:
 char BoundSymbolTable[]={'(',')',',',';','.'};
 int  BoundSymbolTableLength=0;
//分隔符表:
 char SpaceSymbolTable[]={' ','\t','\n','\r'};
 int  SpaceSymbolTableLength=0;
 FILE *stream;
 char ch,WordBuffer[32];
 bool YesOrNoRightSymbol;
 int  Code;

 //==================================函数============================
 void Initialization();//初始化
 void Finalization();//结束
 int  IsWhatSymbol(char);//是何符号
 int  IsOneArithmeticSymbol(char);//是算符
 int  IsTwoArithmeticSymbol(char);//是算符
 int  IsBoundSymbol(char);//是界符
 int  IsSpaceSymbol(char);//是分隔符
 int  IsTerminateChar(char);//是终止符吗
 int  SearchSymbolTable(char,int SymbolTableLen,char *);//搜索算符等符号表
 int  SearchKeywordTable(char *pWord,int SymbolTableLen,char **pSymbol);
 bool MorphologyAnalyze(char* FileName);//词法分析
 int  IdentifyConst();//识别常量
 int  IdentifyID();//识别表示符
 int  IdentifyOneArithmeticSymbol(int _Code);//识别算符
 int  IdentifyTwoArithmeticSymbol(int _Code);//识别算符
 int  IdentifyBoundSymbol(int _Code);//识别界符
 int  DealIllegalSymbol(char ch);

int main(int argc, char* argv[])
{
  Initialization();//初始化
  MorphologyAnalyze("D:\\test.pl");
//  Finalization();//结束处理
  getchar();
  return(0);
}

void Initialization()//初始化
{
 OneArithmeticSymbolTableLength=strlen(OneArithmeticSymbolTable);
 TwoArithmeticSymbolTableLength=strlen(TwoArithmeticSymbolTable);
 BoundSymbolTableLength=strlen(BoundSymbolTable);
 SpaceSymbolTableLength=strlen(SpaceSymbolTable);
}


bool MorphologyAnalyze(char* FileName)
{
 if((stream  = fopen(FileName,"r" )) == NULL )
	{printf( "不能打开文件或文件不存在\n" );
     return(false);
	}
 ch=' ';
 while( !feof(stream))
   {
    YesOrNoRightSymbol=true;
    if (IsSpaceSymbol(ch)!=-1)
       {ch=(char)fgetc(stream);
        continue;}
    Code=0;
    if(isdigit(ch))
      Code=IdentifyConst();
    else if(isalpha(ch))
	   Code=IdentifyID();
    else if(((Code=IsOneArithmeticSymbol(ch)))>=0)
           Code=IdentifyOneArithmeticSymbol(Code);
    else if(((Code=IsTwoArithmeticSymbol(ch)))>=0)
           Code=IdentifyTwoArithmeticSymbol(Code);
    else if(((Code=IsBoundSymbol(ch)))>=0)
           Code=IdentifyBoundSymbol(Code);
         else Code=DealIllegalSymbol(ch);//该符号是非法的,非语言允许的字符
    if (YesOrNoRightSymbol)
       printf("种别编码:(%4d  ,  %s)\n",Code,WordBuffer); 
    else
       printf("错误单词:(%4d  ,  %s)\n",-1,WordBuffer);
   }

 fclose(stream);
 return(true);
}

int IdentifyConst()//识别常量
 {int ii;
  ii=0;
  Code=0;
  do
  {
   if(Code!=0)
     YesOrNoRightSymbol=false;
   WordBuffer[ii]=ch;ii++;
   ch=(char)fgetc(stream);
  }while ((Code=IsTerminateChar(ch))!=1);
  WordBuffer[ii]='\0';
  return(ConstCodeNo);//与种别编码值相关
 }

int IdentifyID()//识别标识符/关键字
 {
  int ii;
  ii=0;
  Code=0;
  do
  {
  if(!(Code==2||Code==0))
    YesOrNoRightSymbol=false;
   WordBuffer[ii]=ch;ii++;
   ch=(char)fgetc(stream);
  }while ((Code=IsTerminateChar(ch))!=1);
  WordBuffer[ii]='\0';
  Code=SearchKeywordTable(WordBuffer,13,KeyWordTable);
  if(Code==-1)
 	Code=IDCodeNo;
  return(Code);//与种别编码值相关
 }

int IdentifyOneArithmeticSymbol(int _Code)//识别算符
{
 WordBuffer[0]=ch;
 WordBuffer[1]='\0';
 ch=(char)fgetc(stream);
 return(_Code);
}

int IdentifyTwoArithmeticSymbol(int _Code)//识别算符
{char ch1;
 WordBuffer[0]=ch;
 ch1=(char)fgetc(stream);
 if(ch1=='=')
   {WordBuffer[1]=ch1;
    WordBuffer[2]='\0';
    _Code+=4;
    ch=(char)fgetc(stream);
   }
 else {WordBuffer[1]='\0';
       ch=ch1;
		}
 return(_Code);
}

int IdentifyBoundSymbol(int _Code)//识别界符
{WordBuffer[0]=ch;
 WordBuffer[1]='\0';
 ch=(char)fgetc(stream);
 return(_Code);
}

int DealIllegalSymbol(char _ch)
{
 YesOrNoRightSymbol=false;
 WordBuffer[0]=_ch;
 WordBuffer[1]='\0';
 ch=(char)fgetc(stream);
 return(-1);
}

int IsWhatSymbol(char)//是啥符号
 {
	 //调用IsArithmeticSymbol(char)
	 //调用IsBoundSymbol(char)
	 //调用IsSpaceSymbol(char)
 return(0);
 }

 int SearchSymbolTable(char _ch,int SymbolTableLen,char *pSymbol)
 {int ii,_Code;
  _Code=-1;
  for(ii=0;ii<SymbolTableLen;ii++)
	 if(pSymbol[ii]==_ch)
	   {_Code=ii;
	     break;}
  return(_Code); 
 }
 
 int SearchKeywordTable(char *pWord,int SymbolTableLen,char **pSymbol)
 {int ii,_Code;
  _Code=-1;
  for(ii=0;ii<SymbolTableLen;ii++)
     if(strcmp(pWord,pSymbol[ii])==0)
	{_Code=ii+KeyWordCodeBeginNo;
	 break;}
  return(_Code); 
 }

int IsOneArithmeticSymbol(char _ch)//是否单个算符
 { int _Code;
  _Code=SearchSymbolTable(_ch,OneArithmeticSymbolTableLength,OneArithmeticSymbolTable);
  if(_Code!=-1)
    _Code+=OneArithmeticSymbolCodeBeginNo;
    //ArithmeticSymbolTableLength与TwoArithmeticSymbolTable的相对位置不能改变,否则此处应该修改
 return(_Code);
}

int IsTwoArithmeticSymbol(char _ch)//是否组合算符
{int _Code;
 _Code=SearchSymbolTable(_ch,TwoArithmeticSymbolTableLength,TwoArithmeticSymbolTable);
 if(_Code!=-1)
   _Code+=TwoArithmeticSymbolCodeBeginNo;
 return(_Code);
}
 
int IsBoundSymbol(char _ch)//是否界符
 {
  int _Code;
  _Code=SearchSymbolTable(_ch,BoundSymbolTableLength,BoundSymbolTable);
     //BoundSymbolTable与BoundSymbolTableLength的相对位置不能改变,否则此处应该修改
  return(_Code!=-1?_Code+BoundSymbolCodeBeginNo:-1);
}
 
 int IsSpaceSymbol(char _ch)//是否分隔符
 {
  int _Code;
  _Code=SearchSymbolTable(_ch,SpaceSymbolTableLength,SpaceSymbolTable);
  return(_Code);
}

int IsTerminateChar(char _ch)//是否终止符号
{//要判断是否算符/界符/分隔符/非法符号
 int _Code;
 _Code=-1;
 if(isdigit(_ch))
   _Code=0;
 else if (isalpha(_ch)||ch=='_')
   _Code=2; 
 else if(IsOneArithmeticSymbol(_ch)!=-1||IsTwoArithmeticSymbol(_ch)!=-1||IsBoundSymbol(_ch)!=-1||IsSpaceSymbol(_ch)!=-1||feof(stream))
   _Code=1;//是算符或界符或分隔符或文件结束
 return(_Code);
} 
 

⌨️ 快捷键说明

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