|
我的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]不知道是为什么。希望大家指点。。。。。。。。。。。。 |
|