将C语言的声明描述成为语言
来源:互联网 发布:mac word 替换 编辑:程序博客网 时间:2024/03/29 14:30
/*本程序是将C语言的声明描述成为语言*/#include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h>#define MAXTOKENS 100#define MAXTOKENLEN 64//声明枚举变量,当一个变量确定有几个变化的值,用枚举作为变量合适enum type_tag {IDENTIFIER,QUALIFIER,TYPE};struct token{char type;char string[MAXTOKENLEN];};struct token stack[MAXTOKENS];//声明堆栈struct token temp;//声明temp结构体变量int top = -1;#define pop stack[top--]#define push(s) stack[++top]=s//对读取到的标记字符串的类型做出判断,利用枚举类型作为返回值enum type_tag classify_string(void){char *s = temp.string;if(!strcmp(s,"const")){strcpy(s,"read-only");return QUALIFIER;}if(!strcmp(s,"volatile")) return QUALIFIER;if(!strcmp(s,"void")) return TYPE;if(!strcmp(s,"char")) return TYPE;if(!strcmp(s,"signed")) return TYPE;if(!strcmp(s,"unsigned")) return TYPE;if(!strcmp(s,"short")) return TYPE;if(!strcmp(s,"int")) return TYPE;if(!strcmp(s,"long")) return TYPE;if(!strcmp(s,"float")) return TYPE;if(!strcmp(s,"double")) return TYPE;if(!strcmp(s,"struct")) return TYPE;if(!strcmp(s,"union")) return TYPE;if(!strcmp(s,"enum")) return TYPE;return IDENTIFIER;}//读取每个标记存到temp变量中void gettoken(void){char *p = temp.string;//如果有空白字符,则忽略while((*p = getchar()) == ' ');//注意没有循环体if(isalnum(*p)){//如果读入的是字母或数字while(isalnum(*++p = getchar()));//判断下一个是否还是,如果是,继续读取ungetc(*p,stdin);//该句是将读到的字符会退到输入流中,即上一步中while读到的不满足的字符回退。*p = '\0';temp.type = classify_string();//对该字符串判断其标记类型return;}if(*p == '*'){strcpy(temp.string," pointer to");temp.type = '*';return;}//如果是其他的字符,则读取该字符temp.string[1] = '\0';temp.type = *p;return;}//读第一个标示符void read_to_first_identifier(){gettoken();while(temp.type != IDENTIFIER ){push(temp);gettoken();}printf("%s is",temp.string);gettoken();//读取标示符后面的字符}void deal_with_arrays(){while(temp.type == '['){printf(" array ");gettoken();//数字或者]if(isdigit(temp.string[0])){printf("0..%d ",atoi(temp.string)-1);//atoi:计算字符串的长度gettoken();//读取']'}gettoken();//读取']'后的下一个字符printf("of ");}}void deal_with_function_args(){while(temp.type != ')'){gettoken();}gettoken();printf("function returning ");}void deal_with_pointers(){while(stack[top].type == '*'){printf("%s ",pop.string);}}void deal_with_declarator(){//处理标示符后面可能的数组或者函数switch(temp.type){case '[': deal_with_arrays();break;case '(': deal_with_function_args();}//处理可能存在的指针标示符deal_with_pointers();//处理标示符之前的已经存储到堆栈中的字符while(top >= 0){if(stack[top].type == '('){pop;gettoken();deal_with_declarator();}else{printf("%s ",pop.string);}}}int main(){read_to_first_identifier();deal_with_declarator();printf("\n");return 0;}
0 0
- 将C语言的声明描述成为语言
- 将C语言的声明翻译成通俗的语言
- C/C++语言将成为世界上唯一的语言
- c语言的声明
- c语言的声明
- C语言的声明
- c语言的声明
- C语言的声明
- C语言的声明
- 奇怪的c语言声明
- 分析C语言的声明
- 分析C语言的声明
- 20100623--C语言的声明
- C语言声明的理解
- C语言奇特的声明
- C语言的复杂声明
- 分析C语言的声明
- 复杂的C 语言声明
- 7.1 Spring MVC起步
- jni 初步学习
- Hadoop集群上基于Pig的通话记录的查询及错误排解(ERROR 2998: Unhandled internal error. name)
- c/c++中的static关键字总结
- 输入前序遍历、中序遍历输出后续遍历
- 将C语言的声明描述成为语言
- 数据库第二次作业 王小芬 2013212954 理学院
- 如何将asc文件转换成的txt文件,并导入到sql server中?
- Linux系统调用程序分析
- 前端试题
- 我的java学习笔记(4)关于方法参数传递
- 密码截取
- 配置 log4j 详解
- Tree(并查集)