发布时间: 2012-07-15 20:11:39 作者: rapoo
贴一个刚写的 词法解析程序吧(C语言),很简陋,呵呵。。。/** * 2012年6月25日 中午 * * 山东科技大学信息学院 版权所有 * * 联系邮箱:415939252@qq.com * * Copyright @2012, sdust, All Rights Reserved * * author 王昌帅 * */#include <stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#define MAX 1024#define MAX_LENGTH 10#define NUM_RESERVED_WORD 32#define NUM_OPERATOR 6#define NUM_SEPARATOR 16//函数声明//用于输入的函数void input(char*);//用于输出的函数void output();//判断单词的是哪种标识符int judge(char*);//将输入的字符串解析成一个一个的单词void parse2Array(char*);//判断字符是否是字母int isChar(char c);//判断字符是否是操作符int isOperator(char c);//判断字符是否是分隔符int isSeparator(char c);//判断字符是否是数字int isNum(char c);//判断是否是基本保留字(参数:字符串)int isReservedWord_str(char* str);//判断是否是操作符(参数:字符串)int isOperator_str(char* str);//判断是否是操作符(参数:字符串)int isSeparator_str(char* str);//判断是否是数字串(参数:字符串)int isNum_str(char* str);//判断是否是标识符(参数:字符串)int isIndentifier_str(char* str);//定义标识符char sign_reserved_word[][MAX_LENGTH] = {"auto","double","int","struct","break","else","long","switch","case","enum","register","typedef","char","extern","return","union","const","float","short","unsigned","continue","for","signed","void","default","goto","sizeof","volatile","do","if","while","static"};char sign_operator[][MAX_LENGTH] = {"+","-","*","/","%","="};char sign_separator[][MAX_LENGTH] = {"\n"," ","\"","\t",",",";",":","'","<",">","(",")","{","}","[","]"};//单词总数(包括运算符、分隔符等)int wordNum = 0;//解析好的单词char array[MAX][20];//主函数int main(){char str[MAX];while(1){input(str);parse2Array(str);output();}}//用于输入的函数void input(char* str){int i = 0,j = 0;char c;str[0] = '\0';printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");printf("请输入要解析的语句(按@结束输入,按esc退出):\n\n");for(i=0;(c=getch())!='@';i++){if(c==27)exit(0);if(c==8){i-=2;if(i<-1)i=-1;system("cls");printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");printf("请输入要解析的语句(按@结束输入,按esc退出):\n\n");for(j=0;j<=i;j++){printf("%c",str[j]);}continue;}else if(c==13){str[i] = '\n';printf("\n");}else{str[i] = c;printf("%c",c);}str[i+1] = '\0';}}//将输入的字符串解析成一个一个的单词void parse2Array(char* str){int count; int i,temp;wordNum = 0;count = strlen(str);for(i=0;i<count;i++){temp = i;if(isOperator(str[i])){//如果是运算符array[wordNum][0]=str[i];array[wordNum][1]='\0';wordNum++;}else if(isSeparator(str[i])){//如果是分隔符array[wordNum][0]=str[i];array[wordNum][1]='\0';wordNum++;}else if(isChar(str[i])||str[i]=='_'){//如果是字符for(;str[i]!='\0'&&(!isOperator(str[i]))&&(!isSeparator(str[i]))&&(isChar(str[i])||isNum(str[i])||str[i]=='_');i++){array[wordNum][i-temp]=str[i];}array[wordNum][i-temp]='\0';wordNum++;i--;}else if(isNum(str[i])){//如果是数字for(;str[i]!='\0'&&(!isOperator(str[i]))&&(!isSeparator(str[i]));i++){array[wordNum][i-temp]=str[i];}array[wordNum][i-temp]='\0';wordNum++;i--;}else{array[wordNum][0]=str[i];array[wordNum][1]='\0';wordNum++;}}}//输出信息void output(){int i ;printf("\n");printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");for(i = 0;i<wordNum;i++){int flag = judge(array[i]);switch(flag){case 1:printf(" 1、基本保留字:\t%s\n",array[i]);break;case 2:printf(" 2、标识符 :\t%s\n",array[i]);break;case 3:printf(" 3、常数 :\t%s\n",array[i]);break;case 4:printf(" 4、运算符 :\t%s\n",array[i]);break;case 5:if(strcmp(array[i],"\n")==0){printf(" 5、分隔符 :\t\\n\n",array[i]);}else if(strcmp(array[i]," ")==0){printf(" 5、分隔符 :\t空格\n",array[i]);}else if(strcmp(array[i],"\t")==0){printf(" 5、分隔符 :\t\\t\n",array[i]);}else{printf(" 5、分隔符 :\t%s\n",array[i]);}break;case -1:printf ("-1、Error :\t%s\n",array[i]);break;default:printf("-1、Error :\t%s\n",array[i]);break;}}}//判断是哪类字符(1、基本保留字 2、标识符 3、常数 4、运算符 5、分隔符 -1、不能识别(Error))int judge(char * word){if(isSeparator_str(word)){return 5;}else if(isOperator_str(word)){return 4;}else if(isReservedWord_str(word)){return 1;}else if(isNum_str(word)){return 3;}else if(isIndentifier_str(word)){return 2;}else{return -1;}}//判断是否是字符int isChar(char c){if(c>='A'&&c<='Z'||c>='a'&&c<='z'){return 1;}else{return 0;}}//判断是否是数字(单个字符)int isNum(char c){if(c>='0'&&c<='9'){return 1;}else{return 0;}}//判断是否是操作符(单个字符)int isOperator(char c){int i ;char sign[] = {'+','-','*','/','%','='};for(i = 0;i<NUM_OPERATOR;i++){if(c==sign[i]){return 1;}}return 0;}//判断是否是分隔符(单个字符)int isSeparator(char c){int i ;char sign[] = {'\n',' ','\"','\t',',',';',':','\'','<','>','(',')','{','}','[',']'};for(i = 0;i<NUM_SEPARATOR;i++){if(c==sign[i]){return 1;}}return 0;}//判断是否是基本保留字(参数:字符串)int isReservedWord_str(char* str){int i ;for(i = 0;i<NUM_RESERVED_WORD;i++){if(strcmp(str,sign_reserved_word[i])==0){return 1;}}return 0;}//判断是否是操作符(参数:字符串)int isOperator_str(char* str){int i ;for(i = 0;i<NUM_OPERATOR;i++){if(strcmp(str,sign_operator[i])==0){return 1;}}return 0;}//判断是否是分隔符(参数:字符串)int isSeparator_str(char* str){int i ;for(i = 0;i<NUM_SEPARATOR;i++){if(strcmp(str,sign_separator[i])==0){return 1;}}return 0;}//判断是否是数字串(参数:字符串)int isNum_str(char* str){int i , count;count = strlen(str);for(i = 0;i<count;i++){if(str[i]<'0'||str[i]>'9'){return 0;}}return 1;}//判断是否是标识符(参数:字符串)int isIndentifier_str(char* str){int i , count;count = strlen(str);if(str[0]>='0'&&str[0]<='9'){return 0;}for(i = 0;i<count;i++){if(!isChar(str[i])&&!isNum(str[i])&&(str[i]!='_')){return 0;}}return 1;}
一事不明关于main函数return 零
看起来像函数定义但没有参数列表;跳
使用typedef定义结构体解决思路
求教赋值有关问题
C中\t跟\n 的区别
pScanInfo-gt;last_file_path3的内容为啥
获得CPU电扇转速
char*和char[][]的有关问题
c语言中的关键字小结
malloc 有关问题 求解