#include #include #include #include #include #include"gets.h" #define MAX 4000 using namespace std; enum { UNDERLINE = 0,//下划线 LETTER = 1,//字母 NUMBER = 2,//数字 SYMBOL = 3,//符号 SYMBOLERROR = 4,//错误符号 IDENTIFIERERROR = 5//错误标识符 }; char data[MAX]; char letter[MAX]; bool isfloat = false;//浮点数判断 bool isbool = false;//布尔判断 bool notes = false;//注释判断 bool isvariable = false;//标识符判断 bool isiderror = false;//错误标识符判断 //关键字及其对应种别码与助记符 string key[32]={"char","double","enum","float","int","long","short","signed", "struct","union","unsigned","void","for","do","while","break","continue", "if","else","goto","switch","case","default","return","auto","extern","register", "static","const","sizeof","typedef","volatile"}; int keyNum[32]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32}; string keyword[32]={"CHAR","DOUBLE","ENUM","FLOAT","INT","LONG","SHORT","SIGNED", "STRUCT","UNION","UNSIGNED","VOID","FOR","DO","WHILE","BREAK","CONTINUE", "IF","ELSE","GOTO","SWITCH","CASE","DEFAULT","RETURN","AUTO","EXTERN","REGISTER", "STATIC","CONST","SIZEOF","TYPEDEF","VOLATILE"}; //符号的种别码与助记符 string symbol[33]={"+","-","*","/","%","++","--",">","<","==", "!=",">=","<=","&&","||","!","=","+=","-=", "*=","/=","%=",",","(",")","[","]","{","}", ";","/*","*/","'"}; int symbolNum[33]={33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,66}; string symbolword[33]={"PLUS","MINUS","MULTI","RDIV","MODULO","INC","DEC","GT","LT","EQ","NEQ", "GE","LE","AND","OR","NOT","ASSIGN","PLUS_A","MINUS_A","MUL_A","DIV_A", "MOD_A","COMMA","LR_BRAC","RR_BRAC","LS_BRAC","RS_BRAC","L_PRA","R_PRA", "SEMIC","L_ANNO","R_ANNO","QMARK"}; int num; int length; void Getword();//处理data里的各类字符 void error(FILE *fp,int type,string word); string identify(char s,int n);//返回标识符 string Number(char s,int n);//返回数字 string symbolstr(char s,int n);//返回符号 string variable(char s,int n);//返回标识符 string Keyword(int n);//根据关键词种别返回关键词 string Symbolword(int n);//根据符号种别返回符号 bool isNum(char s);//判断是否是数字 bool isLetter(char s);//判断是否是字母 bool issymbol(char s);//判断是否是符号 bool isBool(string s);//因为表里没有bool关键字 但有布尔类型 所以额外加了一个判断 int wordtype(char str);//字符类型判断 int iskeyword(string s);//返回关键词种别码 int isSymbol(string s);//返回符号种别码 int main() { char filename[MAX] = "input.txt";//根据输入文件名修改 getfdstr(filename,data);//预处理,去除输入文件中的空格,存在data里 length = strlen(data); Getword(); getch(); } void Getword() { FILE *fp; int key = 0; int count = 0; fp = fopen("output.txt", "w"); if (fp == NULL) { printf("Error: Couldn't open output file\n"); system("pause"); exit(0); } for(num = 0; num < length;) { char str; string word; str = data[num]; key = wordtype(str); switch(key) { case UNDERLINE: word = variable(str,num); printf("%s (%s,70) 标识符\n",word.c_str(),word.c_str()); fprintf(fp,"%s (%s,70) 标识符\n",word.c_str(),word.c_str()); isvariable = false; break; case LETTER: word = identify(str,num); if(notes) break; else if (isvariable) { if(iskeyword(word)) { printf("%s (%s,%d) 关键字\n",word.c_str(),Keyword(iskeyword(word)).c_str(),iskeyword(word)); fprintf(fp,"%s (%s,%d) 关键字\n",word.c_str(),Keyword(iskeyword(word)).c_str(),iskeyword(word)); } else { printf("%s (IDE,70) 标识符\n",word.c_str()); fprintf(fp,"%s (IDE,70) 标识符\n",word.c_str()); } break; } else { if(!word.compare("bool")) { printf("%s (BOOL,%d) 关键字\n",word.c_str(),67); fprintf(fp,"%s (BOOL,%d) 关键字\n",word.c_str(),67); } else if(isbool) { printf("%s (CONDST_BOOL,%d) 布尔型\n",word.c_str(),67); fprintf(fp,"%s (CONDST_BOOL,%d) 布尔型\n",word.c_str(),67); isbool = false; } else { printf("%s (%s,70) 标识符\n",word.c_str(),word.c_str()); fprintf(fp,"%s (%s,70) 标识符\n",word.c_str(),word.c_str()); isvariable = false; } break; } case NUMBER: word = Number(str,num); if(notes) break; else if(isiderror) { error(fp,IDENTIFIERERROR,word); break; } else { if(isfloat) { printf("%s (CONST_FLOAT,69) 浮点型\n",word.c_str()); fprintf(fp,"%s (CONST_FLOAT,69) 浮点型\n",word.c_str()); isfloat = false; } else { printf("%s (CONST_INT,68) 整型\n",word.c_str()); fprintf(fp,"%s (CONST_INT,68) 整型\n",word.c_str()); } break; } case SYMBOL: word = symbolstr(str,num); if(notes) { if(count == 0) { printf("%s (%s,%d) 界限符\n",word.c_str(),Symbolword(isSymbol(word)).c_str(),isSymbol(word)); fprintf(fp,"%s (%s,%d) 界限符\n",word.c_str(),Symbolword(isSymbol(word)).c_str(),isSymbol(word)); count++; } break; } else { if(isSymbol(word) == SYMBOLERROR) { error(fp,SYMBOLERROR,word); break; } if(!word.compare("+")||!word.compare("-")||!word.compare("*")||!word.compare("/")||!word.compare("%")|| !word.compare("++")||!word.compare("--")||!word.compare(">")||!word.compare("<")||!word.compare("==")|| !word.compare("!=")||!word.compare(">=")||!word.compare("<=")||!word.compare("&&")||!word.compare("||")|| !word.compare("!")||!word.compare("=")||!word.compare("+=")||!word.compare("-=")||!word.compare("*=")|| !word.compare("/=")||!word.compare("%=")) { printf("%s (%sk,%d) 运算符\n",word.c_str(),Symbolword(isSymbol(word)).c_str(),isSymbol(word)); fprintf(fp,"%s (%sk,%d) 运算符\n",word.c_str(),Symbolword(isSymbol(word)).c_str(),isSymbol(word)); break; } if(!word.compare("*/")) { printf("————内容被注释————\n"); fprintf(fp,"————内容被注释————\n"); printf("%s (%s,%d) 界限符\n",word.c_str(),Symbolword(isSymbol(word)).c_str(),isSymbol(word)); fprintf(fp,"%s (%s,%d) 界限符\n",word.c_str(),Symbolword(isSymbol(word)).c_str(),isSymbol(word)); count = 0; break; } printf("%s (%s,%d) 界限符\n",word.c_str(),Symbolword(isSymbol(word)).c_str(),isSymbol(word)); fprintf(fp,"%s (%s,%d) 界限符\n",word.c_str(),Symbolword(isSymbol(word)).c_str(),isSymbol(word)); break; } } } fclose(fp); }