?? compiler.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 + -