//此程序在Visual C++ 6.0编译器上通过,输入待分析的文件的名件名后,按ENTER就开始分析。
//(注:0.cpp文件可用作待分析的源程序)
//分析的结果写在了Result.txt里,和源程序同在一个文件夹里。此程序还有很多bug,有待改进。
#include <fstream>
#include <iostream>
#include <string>
#include <ctype.h>
#include <string.h>
using namespace std; /*是应用名字空间,用以保证函数名不会起冲突。*/
/* 关键字数组定义 */
char*KeyWords[32]={"auto","break","case","char","const","continue","default","do","double","else","enum",
"extern","float","for","goto","if","int","long","redister","return","short","signed",
"sizeof","static","struct","switch","typedef","union","unsigned","void", "volatile","while"};
char getChar(ifstream&src) /*读入ch*/
{
char c;
src.get(c);
return c;
}
char getb(ifstream&src) /*读入空格 */
{
char c;
src.get(c);
while(c==' ')
src.get(c);
return c;
}
void concat(char*str,char c) /*连接单词符号*/
{
size_t n=strlen(str);
str[n++]=c;
str[n] ='\0';
}
bool Key(const char*str) /*判断是否为关键字*/
{
bool i=0;
for(int j=0;j<32;j++)
{
if(_stricmp(KeyWords[j],str)==0)
{
i=1;
break;
}
}
return i;
}
char Callback(ifstream&src) /*回调字符*/
{
src.seekg(-1, ios::cur);
return '\0';
}
void Analyzer(ifstream&src,ofstream&dst) /*分析函数*/
{
char ch;
char strToken[1024]="";
ch = getb(src);
if(isalpha(ch)) /*判断标识符的情况,isalpha判断字符是否为英文字母*/
{
while (isalpha(ch)||isdigit(ch)||ch=='_')
{
concat(strToken, ch);
ch = getChar(src);
}
ch = Callback(src);
if (Key(strToken))
dst<<"("<<"3"<<" , '"<<strToken<<"')"<<"\n"; /*关键字编码为3*/
else
dst<<"("<<"1"<<" , '"<<strToken<<"')"<<"\n"; /*标识符编码为1*/
}
else if(isdigit(ch)) /*判断常数的情况,isdigit判断字符是否为数字*/
{
while(isdigit(ch))
{
concat(strToken, ch);
ch=getChar(src);
}
Callback(src);
dst<<"("<<"2"<<" , '"<<strToken<<"')"<<"\n"; /*常数编码为2*/
}
//else if(ch =='{')
//{
//while(getChar(src)!='}') ;
//}
else if(ch=='+') /*判断运算符的情况,运算符编码为4*/
dst<<"("<<"4"<<" , '"<<ch<<"')"<<"\n";
else if(ch=='-')
dst<<"("<<"4"<<" , '"<<ch<<"')"<<"\n";
else if(ch == '*')
dst<<"("<<"4"<<" , '"<<ch<<"')"<<"\n";
else if(ch == '/')
dst<<"("<<"4"<<" , '"<<ch<<"')"<<"\n";
else if(ch == '=')
dst<<"("<<"4"<<" , '"<<ch<<"')"<<"\n";
else if(ch=='<')
{
ch=getChar(src);
if(ch=='=')
dst<<"("<<"4"<<" , '"<<"<="<<"')"<<"\n";
else
dst<<"("<<"4"<<" , '"<<'<'<<"')"<<"\n";
Callback(src);
}
else if(ch=='>')
{
ch=getChar(src);
if(ch=='=')
dst<<"("<<"4"<<" , '"<<">="<<"')"<<"\n";
else
dst<<"("<<"4"<<" , '"<<">"<<"')"<<"\n";
Callback(src);
}
else if(ch==',')/* 判断界符*/
dst<<"("<<"5"<<" , '"<<ch<<"')"<<"\n";/*界符编码为5*/
else if(ch==';')
dst<<"("<<"5"<<" , '"<<ch<<"')"<<"\n";
else if(ch =='(')
dst<<"("<<"5"<<" , '"<<ch<<"')"<<"\n";
else if(ch==')')
dst<<"("<<"5"<<" , '"<<ch<<"')"<<"\n";
else if(ch=='[')
dst<<"("<<"5"<<" , '"<<ch<<"')"<<"\n";
else if(ch==']')
dst<<"("<<"5"<<" , '"<<ch<<"')"<<"\n";
else if(ch=='{')
dst<<"("<<"5"<<" , '"<<ch<<"')"<<"\n";
else if(ch=='}')
dst<<"("<<"5"<<" , '"<<ch<<"')"<<"\n";
}
int main(int argc,char*argv[])
{
string strSrc;
if(argc==1)
{
cout << "Please input the TEST file name: ";
getline(cin,strSrc);
}
ifstream src(strSrc.c_str()); /*打开文件*/
ofstream dst("Result.txt");
while(!src.eof()) /*开始分析*/
Analyzer(src, dst);
dst.close();
src.close();
cout<<"The result of Analyzing has written into Result.txt."<<endl;
return 0;
}
评论0