📄 accidanalyse.h
字号:
/*************************************/
/********** 全局变量声明**************/
/*************************************/
char CBuffer [10000] ; //存储从磁盘读入的源程序的每行源程序
int IBufIndex ; //记录输入存储缓冲区的位置(即CBuffer的数组下标)
struct TokenAttribute //用于表示记号的属性
{
char ID[20] ; //记号值
char CToken_Type[4] ; //记号的属性值
};
//****************************转义类字符表***********************************//
TokenAttribute TransChar[8]={{"\\a","1"},{"\\b","2"},{"\\t","3"},{"\\r","4"},{"\\v","5"},{"\\f","6"},{"\\n","7"}};
//****************************关键字表***************************************//
TokenAttribute Keyword[33]={{"auto","101"},{"break","102"},{"case","103"},{"char","104"},
{"const","105"},{"continue","106"},{"default","107"},{"double","108"},
{"do","109"},{"else","110"},{"enum","111"},{"extern","112"},{"float","113"},
{"for","114"},{"goto","115"},{"if","116"},{"int","117"},{"long","118"},
{"registe","119"},{"return","120"},{"short","121"},{"signed","122"},
{"sizeof","123"},{"static","124"},{"struct","125"},{"switch","126"},
{"typedef","127"},{"union","128"},{"unsigned","129"},{"void","130"},
{"volatile","131"}, {"while","132"}};
TokenAttribute ConstNumb[20]; //定义数据常量表
int ConstIndex=1; //定义数据数据常量表的位置(即下标)
struct StrAttribute //定义字符串表
{
char ID[100] ; //字符串值
char CToken_Type[4] ; //字符串属性值
}ConstStr[20];
int ConStrIndex=0; //字符串常量的位置(即下标)
struct TokenAttribute ConstChar[100]; //定义字符常量表
int ConCharIndex=0; //字符常量表下标
//****************************运算符表**************************************//
TokenAttribute Operator[43]={{"(","300"}, {")","301"},{"[","302"},{"]","303"}
,{"--","304"},{"-=","305"},{"->","306"},{"-","307"}
,{"++","308"},{"+=","309"},{"+","310"}
,{"<<","311"},{"<=","312"},{"<<=","313"},{"<","314"}
,{">>","315"},{">=","316"},{">>=","317"},{">","318"}
,{"==","319"},{"=","320"}
,{"&&","321"},{"&=","322"},{"&","323"}
,{"||","324"},{"|","325"}
,{"!=","326"},{"!","327"}
,{"^=","328"},{"^","329"}
,{"*=","330"},{"*","331"}
,{"/=","332"},{"/","333"}
,{"%=","334"},{"%","335"}
,{",","336"},{".","337"}
,{"?","338"},{":","339"},{"~","340"}};
TokenAttribute Identifier[200]; //标识符列表
int IdIndex=0; //标识符表的下标
FILE *fp2; //定义写盘的文件指针
//*************************************//
//***********函数定义******************//
//*************************************//
void WriteDisk(TokenAttribute STokenAttribute[],int TokenIndex) //功 能:输出并写盘
{
int i=0;
if((fp2=fopen("Test1.txt","a"))==NULL) //打开续写的文件
printf("cannot open file\n");
else
{
while(STokenAttribute[TokenIndex].ID[i]!='\0')
fputc(STokenAttribute[TokenIndex].ID[i++],fp2);
fputc(' ',fp2);
for(i=0;i<3;i++)
fputc(STokenAttribute[TokenIndex].CToken_Type[i],fp2);
fputc(' ',fp2);
fputc('\n',fp2);
fclose(fp2);
}
}
//***********函数名:DigitRecognise() ****************//
//***********功 能:识别数字常量并建表****************//
//************被调用:main() ****************//
//*************调用: WriteDisk(); ****************//
void DigitRecognise()
{
int i=0;
if((CBuffer[IBufIndex]=='.'&&(CBuffer[IBufIndex+1]>='0'&&CBuffer[IBufIndex+1]<='9'))||(CBuffer[IBufIndex+1]=='.'&&(CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')))
{
printf("所分析的数据类型是:Floating point numbers");
strcpy(ConstNumb[ConstIndex].CToken_Type,"200");
while((CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')||CBuffer[IBufIndex]=='.'||CBuffer[IBufIndex]=='e'||CBuffer[IBufIndex]>='E')
{
ConstNumb[ConstIndex].ID[i]=CBuffer[IBufIndex++];
i++;
}
}
else if(CBuffer[IBufIndex]=='0'&&(CBuffer[IBufIndex+1]=='x'||CBuffer[IBufIndex+1]=='X'))
{
printf("所分析的数据类型是:Hex");
strcpy(ConstNumb[ConstIndex].CToken_Type,"203");
IBufIndex+=2;
while(CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')
{
ConstNumb[ConstIndex].ID[i]=CBuffer[IBufIndex++];
i++;
}
}
else if(CBuffer[IBufIndex]=='o'||CBuffer[IBufIndex]=='O')
{
printf("所分析的数据类型是:Octal");
strcpy(ConstNumb[ConstIndex].CToken_Type,"202"); //标记是八进制数字
IBufIndex++;
while(CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='7')
{
ConstNumb[ConstIndex].ID[i]=CBuffer[IBufIndex++];
i++;
}
}
else if (CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')
{
printf("所分析的数据类型是:Decimalist");
strcpy(ConstNumb[ConstIndex].CToken_Type,"201");
while(CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')
{
ConstNumb[ConstIndex].ID[i]=CBuffer[IBufIndex++];
i++;
}
}
//IBufIndex++;
ConstNumb[ConstIndex].ID[i]='\0';
WriteDisk( ConstNumb,ConstIndex);
printf("\n所分析的数据值是:%s 数据类型编号:%s\n", ConstNumb[ConstIndex++].ID,ConstNumb[ConstIndex].CToken_Type);
}
//***********函数名:BlackRecognise() ****************//
//***********功 能:识别空白字符 ****************//
//************被调用:main() ****************//
void BlackRecognise()
{
if(CBuffer[IBufIndex]==10||CBuffer[IBufIndex]==12||CBuffer[IBufIndex]==13||CBuffer[IBufIndex]==' ')
{
while(CBuffer[IBufIndex]==10||CBuffer[IBufIndex]==12||CBuffer[IBufIndex]==13||CBuffer[IBufIndex]==' ')
IBufIndex++;
}
else if(CBuffer[IBufIndex]=='/'&&CBuffer[IBufIndex+1]=='/')
{
printf("所识别的对象是注释:");
IBufIndex+=2;
while(CBuffer[IBufIndex]!=10)
printf("%c",CBuffer[IBufIndex++]);
IBufIndex++;
printf("\n");
}
else
{
printf("所识别的对象是注释:");
IBufIndex=IBufIndex+2;
while(CBuffer[IBufIndex]!='*'&&CBuffer[IBufIndex+1]!='/')
printf("%c",CBuffer[IBufIndex++]);
IBufIndex=IBufIndex+2;
printf("\n");
IBufIndex++;
}
}
//***********函数名:SymbolRecognise ()****************//
//***********功 能:识别关键字和标识符****************//
//************被调用:main() ****************//
//*************调用: WriteDisk(); ****************//
void SymbolRecognise ()
{
int i=0;
char CSymbol[30]={'0'}; //用于存储分析的标识符
int flag=-1;
strcpy(Identifier[IdIndex].CToken_Type,"500"); //给用户自定义的标识符类型号赋值
while(CBuffer[IBufIndex]>='a'&& CBuffer[IBufIndex]<='z' || CBuffer[IBufIndex]>='A' && CBuffer[IBufIndex]<='Z' || CBuffer[IBufIndex]=='_' || CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')
{
CSymbol[i]=CBuffer[IBufIndex++];
i++;
}
CSymbol[i]='\0'; //
for(i=0 ; i<=32;i++)
{
if(strcmp(CSymbol,Keyword[i].ID)==0)
flag=i;
}
if(flag>=0)
{
WriteDisk( Keyword,flag);
printf("所分析的关键字是:%s 关键字编号是:%s\n",Keyword[flag].ID, Keyword[flag].CToken_Type);
}
else
{
for(i=0;i<=IdIndex;i++)
{
if(strcmp(Identifier[i].ID,CSymbol)==0 )
{
WriteDisk(Identifier,i);
flag=i;
printf("所分析的标识符是:%s 标识符编号是:%s\n",Identifier[i].ID, Identifier[i].CToken_Type);
}
}
if(flag<0)
{
strcpy(Identifier[IdIndex].ID,CSymbol); //保存用户自定义标识符(注:它的下标号刚好是对编号对500进行求余)
WriteDisk(Identifier,IdIndex);
printf("所分析的标识符是:%s 标识符编号是:%s\n",Identifier[IdIndex].ID, Identifier[IdIndex++].CToken_Type);
}
}
}
//***********函数名:OperatorRecoginse()****************//
//***********功 能:识别关键字运算符*******************//
//************被调用:main() ****************//
//*************调用: WriteDisk(); ****************//
void OperatorRecoginse(char CTemp)
{
//运算符判断;
char Temp[4];
int i=0;
switch(CTemp)
{
case '(':
Temp[i++]='(';
break;
case ')':
Temp[i++]=')';
break;
case '[':
Temp[i++]='[';
break;
case ']':
Temp[i++]=']';
break;
case '-':
Temp[i++]='-';
if(CBuffer[IBufIndex+1]=='-')
{
Temp[i++]='-';
IBufIndex++;
break;
}
else if(CBuffer[IBufIndex+1]=='=')
{
Temp[i++]='=';
IBufIndex++;
break;
}
else if(CBuffer[IBufIndex+1]=='>')
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -