📄 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 + -