| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 445 人关注过本帖
标题:[分享]值得一读的的一个程序
只看楼主 加入收藏
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
结帖率:100%
收藏
 问题点数:0 回复次数:6 
[分享]值得一读的的一个程序

你知道它是做什么的么?
#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];
};

int top=-1;
struct token stack[MAXTOKENS];
struct token this;

#define pop stack[top--]
#define push(s) stack[++top]=s

enum type_tag classify_string(void)
/*推断标示符的类型*/
{
char *s=this.string;
if(!strcmp(s,"const")){
strcmp(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;
}

void gettoken(void) /*读取下一个标记"this"*/
{
char *p=this.string;

/*略过空白字符*/
while((*p=getchar())==' ');
if(isalnum(*p))
{
/* 读取的标识符以A-Z,0-9开头*/
while(isalnum(*++p=getchar()));
ungetc(*p,stdin);
*p='\0';
this.type=classify_string();
return;
}

if(*p=='*')
{
strcpy(this.string,"pointer to");
this.type='*';
return;
}
this.string[1]='\0';
this.type=*p;
return;
}
/*理解所有分析过程代码段*/
read_to_first_identifer()
{
gettoken();
while(this.type!=IDENTIFIER)
{
push(this);
gettoken();
}
printf("%s is ",this.string);
gettoken();
}

deal_with_arrays()
{
while(this.type=='[')
{
printf("array");
gettoken();
if(isdigit(this.string[0]))
{
printf("0..%d",atoi(this.string)-1);
gettoken();/*读取']'*/
}
gettoken();/*读取']'后的再一个标记*/
printf("of");
}
}

deal_with_function_args()
{
while(this.type!=')')
{
gettoken();
}
gettoken();
printf("function returning");
}

deal_with_pointers()
{
while(stack[top].type=='*')
{
printf("%s",pop.string);
}
}

deal_with_declarator()
{
/*处理标示符之后可能存在的数组/函数*/
switch(this.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_identifer();
deal_with_declarator();
printf("\n");
return 0;
}

搜索更多相关主题的帖子: 分享 
2007-08-18 07:42
手拿冲锋枪
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-8-18
收藏
得分:0 

看不懂~~~

2007-08-18 09:47
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
类似于编译器处理代码

对代码做简单分析

偶学编程,也许本身就是一个错。。。
2007-08-18 10:51
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
收藏
得分:0 
回答正确,这也有助自己弄清程序

惟有学习不断的学习!
2007-08-18 13:15
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
没有把基础打牢,一步一步来

这种东西看再多也无济于事~~~~~~

偶学编程,也许本身就是一个错。。。
2007-08-18 14:31
Bonwe_PC
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-6-7
收藏
得分:0 
编译原理。。。

2007-08-18 19:05
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
收藏
得分:0 
回复:(Bonwe_PC)编译原理。。。
编译原理比这难多了,简单的语法分析

惟有学习不断的学习!
2007-08-18 21:16
快速回复:[分享]值得一读的的一个程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020026 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved