QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 992|回复: 6

究竟什么地方错了?

[复制链接]
发表于 2006-3-22 15:56:24 | 显示全部楼层 |阅读模式
我的OS是FC4,最近学习LEX和YACC,现在作个练习,想法是成对的读入(父-子)节点名字描述,然后将他们连接起来构成一个树。看了一些介绍lex和yacc方面的书,但是编译的时候老是有问题,我现在得到的几个文件如下:
文件tree.c,头文件的实现tree.c
[code:1]
/*
采用儿子/兄弟表示法,构造一颗多杈树
*/
#include "tree.h"



void traverseTree(Tree T)

{

        if(!T) return ;

        if(T->son)

        {

                traverseTree(T->son);

        }

        cout<<T->name<<" ";

        if(T->sibling)

        {

                traverseTree(T->sibling);

        }

}

void deleteTree(Tree T)

{

        if(!T) return ;

        if(T->son)

        {

                deleteTree(T->son);

        }

        if(T->sibling)

        {

                deleteTree(T->sibling);

        }

        delete T;

}



void addPair(const string P,const string C)

{/*添加一对连接到树中去,其中P代表父亲节点的名字,C代表子节点的名字,
treeIndex的作用是记录每个名字指向的节点。
*/

        if(NULL == treeIndex[P])

        {

                Tree temp = new treeNode(C,1);

                treeIndex[C] = temp;

        }

        if(NULL == treeIndex[C])

        {

                Tree temp = new treeNode(C,0);

                treeIndex[C] = temp;

        }

        if(treeIndex[C]->root)/*若节点是子树的根,去掉标记*/

        {

                treeIndex[C]->root = false;

        }

        if(treeIndex[P]->son)

        {

                Tree temp = treeIndex[P]->son;

                while(temp->sibling)

                {

                        temp = temp->sibling;

                }

                temp->sibling = treeIndex[C];

                return ;

        }

        else

        {

                treeIndex[P]->son = treeIndex[C];

        }

}

[/code:1]

下面是头文件tree.h:
[code:1]#ifndef TREE_HEADER

        #define TREE_HEADER



#pragma warning(disable:4786)



#include<iostream>

#include<string>

#include<map>



using namespace std;



struct treeNode{

        string name;

        bool root;

        treeNode* son;

        treeNode* sibling;

        treeNode(const string str,bool r): name(str),son(0),sibling(0),root(r){}

};

typedef treeNode* Tree;



typedef map< string, Tree> treeMap;

treeMap treeIndex;



void traverseTree(Tree T);

void deleteTree(Tree T);

void addPair(const string P,const string C);



#endif



[/code:1]
下面是lex文件tree.l:
[code:1]%{

#include "y.tab.h"



void yyerror(char*);



extern YYSTYPE yylval;

%}



char [a-zA-Z\_]

num [0-9]



%%



{char}[{num}|{char}]+ { yylval = yytext;return NAME; }

[ \n\t]+ /*ignore blanks*/;



%%

int yywrap()

{ return 1; }

[/code:1]
下面是yacc文件tree.l:

[code:1]%{

#include "tree.h"

#include "y.tab.h"



#define YYSTYPE string


void yyerror(char*);

int yyparse();
int yylex();

void traverseTree(Tree T);

void deleteTree(Tree T);

void addPair(const string P,const string C);



%}



%token NAME



%%

tree  : pairs;

pairs : pairs pair

        | pair;

pair  : NAME NAME

        {

                addPair($1,$2);

        }

%%



extern FILE* yyin;





int main(int args,char* argv[])

{

        if(NULL == (yyin = fopen(argv[1],"rt")))

        {

                exit(1);

        }

        yyparse();

        for(treeMap::iterator p = treeIndex.begin();p != treeIndex.end(); p++)

        {

                if(p->second->root) traverseTree(p->second);

        }

        treeIndex.clear();

        return 1;

}



void yyerror(const char* err)

{

        cout<<err<<endl;

}

[/code:1]
在执行的时候要把y.tab.c中的对YYSTYPE的定义放到y.tab.h中去。还把好多定义都到处声明了,但是最后还是有这么个错误:

[code:1]/tmp/ccEDUIuE.o(.bss+0x0): multiple definition of `treeIndex'
/tmp/ccJnHUxB.o(.bss+0x0): first defined here
/tmp/ccpIcrmv.o(.bss+0x30): multiple definition of `treeIndex'
/tmp/ccJnHUxB.o(.bss+0x0): first defined here
collect2: ld returned 1 exit status
[/code:1]不知道是为什么。希望大家指点。。。。。。。。。。。。
发表于 2006-3-22 18:43:22 | 显示全部楼层
treeIndex定义不要放在头文件里,如果有多个文件包含了tree.h,那么treeIndex就会被多次定义。
回复

使用道具 举报

 楼主| 发表于 2006-3-22 19:11:47 | 显示全部楼层
谢谢,可是我用了宏的啊?
回复

使用道具 举报

发表于 2006-3-22 19:45:38 | 显示全部楼层
#ifndef xxxx
#define xxxx

#endif
只能防止同一文件里多次包含头文件,不能防止多个文件里包含.
回复

使用道具 举报

 楼主| 发表于 2006-3-23 09:15:15 | 显示全部楼层
谢谢斑竹!!
回复

使用道具 举报

 楼主| 发表于 2006-3-23 09:16:25 | 显示全部楼层
能帮我看看我的词法和语法文件那里有错吗?读入的都显示syntax error
回复

使用道具 举报

发表于 2006-3-23 09:52:32 | 显示全部楼层
这个我不懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 20:34 , Processed in 0.044044 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表