- 论坛徽章:
- 0
|
贴下实现代码,很简洁,缺点是有点不稳定
typedef struct _node{
char name[10];
char tempfile0[10];
char tempfile1[10];
uint8_t temp0[stdWidth*stdHeight];
uint8_t temp1[stdWidth*stdHeight];
struct _node *child0;
struct _node *child1;
} Node;
int readTree(char *filename,Node *tree,int32_t treesize)
{
FILE * f;
char lastToken = -1;
char CurrToken = -1;
int32_t CurrTokenLen;
int32_t pn = 0;
int32_t stack[30];
int32_t *stacktop = stack-1;
char whitechar[3]=" \n\t";
memset(tree,0,treesize*sizeof(Node));
f = fopen (filename,"r");
while (!feof(f)){
if (!fscanf(f,"%c",&CurrToken)) goto die;
switch (CurrToken){
case ':':
fscanf(f,"%s",(tree[pn].name));
fscanf(f,"%s",(tree[pn].tempfile0));
fscanf(f,"%s",(tree[pn].tempfile1));
if (lastToken == '(')
tree[*stacktop].child0 = tree + pn;
if (lastToken == ',')
tree[*stacktop].child1 = tree + pn;
break;
case '(':
*(++stacktop) = pn;
pn++;
break;
case ')':
stacktop --;
break;
case ',':
pn++;
break;
case ' ':
break;
default:
break;
}
if (CurrToken == ',' || CurrToken == '(' || CurrToken == ')')
lastToken = CurrToken;
}
die:
fclose(f);
return 0;
}
int
codeTree(FILE *f,Node *tree)
{
int retval = 0;
printf(" : %s %s %s ",tree->name,tree->tempfile0,tree->tempfile1);
if (tree->child0 && tree->child1)
{
printf("\n (");
retval = codeTree(f,tree->child0);
printf(" , ");
retval += codeTree(f,tree->child1);
printf(" ) \n");
return retval;
}
return 1;
}
| 能够解析下述文本
: a a a ( : b b b ( : d d d , : e e e ) , : c c c ) |
程序中序遍历的输出是
: a a a ( : b b b ( : d d d , : e e e ) , : c c c ) |
目前文本格式还很难看,正在想办法美化成如下形式
(a a a) {(b b b) {(c c c) , (d d d)},(e e e)} |
[ 本帖最后由 reiase 于 2008-4-1 15:01 编辑 ] |
|