//此词法分析器输出为<记号,属性>形式,可以滤过/**/和//类注释及文件开始空格但是不处理 中文,注释中可以有中文 #include
#include #include "iostream.h" #include #include #include #include bool search(char[],int); char letterprocess (char);//字母处理函数 char numberprocess(char);//数字处理函数 char otherprocess(char);//处理其他符号,包括注释、空格的过滤及符号分类
FILE *fp; int fnum=0;//记录错误个数 int line=1;//记录行号 int nword=0;//记录单词个数(空格和标点不计为单词) int cnum=0;//记录字符个数(空格和标点不计为单词) int pro;//记录关系运算符属性号 char ch,ch1; char *keyword[]={"auto"," break","case","char","const","continue","default","do"," double","else","sizeof", "enum","extern","float","for","goto","if","int","long","redister","return","short","signed", "static","struct", "switch","typedef","union","unsigned","void", "volatile","while" };//c 语言关键字(wordtype 为 1)共 32 个 char *operatornum[]={"+","-","*","/", "=" };//(wordtype 为 2) char *interpunction[]={"," , ";" , ".", ":", "\"","\'" };// (wordtype 为 3) char *comparison[]={"<","<=","==",">",">=","!="};//比较操作符(wordtype 为 4) char *special[]={"(" , ")" , "{" , "}" ,"[" , "]" ,"#" , "%" , "&;", "!"};//特殊字符(wordtype 为 5) char *compro[]={"LT","LE","EQ","GT","GE","NE"};//比较操作符的对应属性 //////////////////////////////////////////////////////////////////////////////////////////
main () { char str,c; printf("********************************** ************************************\n"); //outp=fopen("二元式表.txt","w");
词
法
分
析
器
if ((fp=fopen("xishuai.txt","r"))==NULL) printf(" 源 程 序 无 法 打 开 ! \n");//\Users\yangpei\Desktop\ 词 法 分 析 器 .cpp C:\Users\yangpei\Desktop\C stdafx.h: No such file or directory. else { str =fgetc(fp); cnum++; while(isspace(str)!=0) { if(str=='\n') line++; str=fgetc(fp);//跳过文件开始时的空格 cnum++; } while (str!=EOF) { if (isalpha(str)!=0)//处理程序读入的字母‘A’-‘Z’或‘a’-‘z’ str=letterprocess(str); else { if (isdigit(str)!=0)//处理读入的数字 0-9 str=numberprocess(str); else str=otherprocess(str); } } printf("总共有%d 行 %d 个单词 %d 个字符\n",line,nword,cnum); printf("词法分析结束,谢谢使用!\n"); printf("点任意键退出!\n"); } c=getch(); return 0; }
bool search(char searchstr[],int wordtype) { int i; switch (wordtype)//1 表示 keyword;2 表示 operatornum;3 表示 interpunction;4 表示 comparison { case 1: {
for(i=0;i<=31;i++) { if(strcmp(keyword[i],searchstr)==0) return(true); } break; } case 2: { for(i=0;i<=4;i++) { if(strcmp(operatornum[i],searchstr)==0) return(true); } break; } case 3: { for(i=0;i<=5;i++) { if(strcmp(interpunction[i],searchstr)==0) return(true); } break; } case 4: { for(
i=0;i<=5;i++) if(strcmp(comparison[i],searchstr)==0) { pro=i;//记录关系运算符属性号 return(true); } break; } case 5: { for(i=0;i<=9;i++) if(strcmp(special[i],searchstr)==0) return(true); break; }
} return(false); }
/////////////////////////////////////////////////////////////////////////////////////////// char letterprocess (char ch)//字母处理函数 { int i=-1; char letter[20]; while (isalnum(ch)!=0)//判断后续是否为数字或字母 { //if() letter[++i]=ch; ch=fgetc(fp); cnum++; if(ch=='\n') line++; } l