www.pudn.com > SyntaxAnalysis.rar > Test.cpp
#include#include #include #define N 83 /* 用来标记 C++ 和 Pascal 语言中关键字的个数 */ /* 定义一个全局变量,一个全局文件指针 */ FILE *fp; /* fp是一个指向FILE类型结构的指针变量,可以使fp指向某一个文件 * 的结构变量,从而通过该结构体变量中的文件信息访问该文件 */ int id; /* 标志变量,用来标识各类型的ID */ /* 主函数 */ int main() { /* 自定义函数的声明 */ char cbuffer; char alphaprocess(char buffer); char digitprocess(char buffer); char otherprocess(char buffer); if((fp = fopen("example.txt","r")) == NULL) /* 以只读方式打开文件 "example.txt",NULL在 stdio.h 文件中已被定义为 0 */ printf("error\n"); else { cbuffer = fgetc(fp); /* 文件不为空则从文件中取字符 */ while(cbuffer != EOF) /* EOF文件结束标志 */ { if(cbuffer==' ' || cbuffer == '\n' || cbuffer == '\t') /* 掠过空格和回车符 */ { cbuffer = fgetc(fp); id = 4; } else if(isalpha(cbuffer)) cbuffer = alphaprocess(cbuffer); /* 检查cbuffer是否为字母,是则调用alphaprocess()函数 */ else if(isdigit(cbuffer)) cbuffer = digitprocess(cbuffer); /* 检查cbuffer是否为数字 0~9,是则调用digitprocess()函数 */ else cbuffer = otherprocess(cbuffer); /* 非上述两者则调用otherprocess()函数 */ } } printf("\n"); return 0; }/* 主函数结束 */ /* 处理读取字符为字母的情况 */ char alphaprocess(char buffer) { int search(char searchchar[],int wordtype); /* 函数声明 */ int atype; /* 保存是关键字的字符串在关键字表中的索引 */ int i = 0; char alphatp[20]; /* 字符数组存储从文件中读取的字符 */ while((isalpha(buffer)) || (isdigit(buffer)) || buffer == '_' || buffer == '.' ) /* 标识符的组成成分 */ { alphatp[i++] = buffer; /* 将当前读取的字符存入数组 */ buffer = fgetc(fp); /* 读取下一个字符 */ } if(atype != 0) /* 是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位置 */ { if(atype != 23) printf("(%s, (1,%d))\n",alphatp,atype); id = 1; /* 关键字的ID为1 */ } else { printf("(%s ,2)\n",alphatp); /* 为标识符时,编号为2 */ id = 2; /* 标识符的ID为2 */ } return 'a'; } /* 判断字符串是否为关键字 */ int search(char searchchar[],int wordtype) { char key[N][10] = {"abstract","and","array","asm","auto","begin","bool","break","case","catch", "char","class","const","continue","default","delete","div","do","double","downto", "dynamic","else","float","for",,"integer","long","mod","namespace","private","program", "protected","public","read","register","repeat","return","set","short","signed", "sizeof","static","string","struct","switch","template","then","this","throw","true","try", "type","typedef","union","unsigned","using","until","var","virtual","volatile","void", "while","write","xor"}; /* 设置数组指针存储 C++ 和 Pascal 语言中的 83 个关键字 */ int i,p; switch(wordtype) { case 1: for(i = 0; i <= N; i++) { if(strcmp(key[i],searchchar) == 0) /* 比较字符串,为关键字则定位该关键字的序号 */ { p = i + 1; break; } else p = 0; } default:; } return(p); }/* alphaprocess()函数结束 */ /* 处理读取字符为数字时的情况 */ char digitprocess(char buffer) { int i = 0; char digittp[20]; while((isdigit(buffer))) { digittp[i++] = buffer; } printf("(%s ,3)\n",digittp); /* 输出该数字,编号为3 */ id = 3; /* 设置ID为3 */ return(buffer); }/* digitprocess()函数结束 */ /* 处理读出字符为其他字符的情况 */ char otherprocess(char buffer) { int i; int n = 0; char ch[20]; ch[0] = buffer; if(ch[0] == '#' || ch[0] == '"') { printf("(%s ,4)\n",ch); id = 4; } else if(ch[0] == ':') { buffer = fgetc(fp); if(buffer == '=') { ch[1] = buffer; printf("(%s ,5)\n",ch); id = 5; return(buffer); } printf("(%s ,5)\n",ch); id = 5; } else if(ch[0] == '%' || ch[0] == '\') { /* 处理标准输出格式和转义字符 */ printf("(%s ,5)\n",ch); id = 5; buffer = fgetc(fp); } else if(ch[0] == '&') { buffer = fgetc(fp); if(buffer != '&') { printf("(%s ,5)\n",ch); id = 5; } } else if(ch[0] == '{' || ch[0] == '}' || ch[0] == '(' || ch[0] == ')') { printf("(%s ,5)\n",ch); buffer = fgetc(fp); id = 5; } else if(ch[0] == '*'|| ch[0] == '/') { printf("(%s ,4)\n",ch); id = 4; } else if(ch[0] == '=' || ch[0] == '!' || ch[0] == '<' || ch[0] == '>') { buffer = fgetc(fp); printf("(%s ,4)\n",ch); id = 4; } else if(ch[0] == '+' || ch[0] == '-') { if(id == 4) /* 如果'+','-'前ID为4的字符则可能为正负数或'++','--',否则为加减号 */ { for(i = 1; i < 10; i++) { buffer = fgetc(fp); if(buffer == '+') { ch[1] = '+'; break; /* 跳出for循环体 */ } else if(buffer == '-') { ch[1] = '-'; break; /* 跳出for循环体 */ } ch[i+1] = '\0'; } printf("(%s ,3)\n",ch); id = 3; return(buffer); } printf("(%s ,4)\n",ch); buffer = fgetc(fp); id = 4; } return 'f'; } /* otherprocess()函 数结束 */