LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 829|回复: 1

有谁能帮我把这个调试一下吗?

[复制链接]
发表于 2006-3-27 09:21:27 | 显示全部楼层 |阅读模式
详情见我发的另外一个帖子“ 请教编译方面的问题,比较有趣的,大家看看吧.在线等候大家的回音”,我已经顶上来了,很简单的词法语法,但是对lex和yacc不熟。希望大家看看,感激不尽啊!!!!!!!!!!
tree.y语法分析文件
  1. %{
  2. #include "tree.h"
  3. #include "tree.tab.h"

  4. #define YYSTYPE string

  5. void yyerror(char*);
  6. int yyparse();
  7. int yylex();
  8. void traverseTree(Tree T);
  9. void deleteTree(Tree T);
  10. void addPair(const string P,const string C);

  11. %}

  12. %token NAME

  13. %%
  14. pairs : pairs pair
  15.         | pair;
  16. pair  : NAME NAME
  17.         {
  18.                 cout<<"Get two names."<<endl;
  19.                 cout<<$1<<"-->"<<$2<<endl;
  20.                 addPair($1,$2);
  21.         }
  22. %%

  23. extern FILE* yyin;
  24. extern treeMap treeIndex;

  25. int main(int args,char* argv[])
  26. {
  27.         if(NULL == (yyin = fopen(argv[1],"rt")))
  28.         {
  29.                 exit(1);
  30.         }
  31.         yyparse();
  32.         for(treeMap::iterator p = treeIndex.begin();p != treeIndex.end(); p++)
  33.         {
  34.                 if(p->second->root) traverseTree(p->second);
  35.         }
  36.         treeIndex.clear();
  37.         return 1;
  38. }

  39. void yyerror(const char* err)
  40. {
  41.         cout<<err<<endl;
  42. }

复制代码

tree.c函数实现文件
  1. /*
  2. 采用儿子/兄弟表示法,构造一颗多杈树
  3. */
  4. #include "tree.h"

  5. treeMap treeIndex;

  6. void traverseTree(Tree T)
  7. {
  8.         if(!T) return ;
  9.         if(T->son)
  10.         {
  11.                 traverseTree(T->son);
  12.         }
  13.         cout<<T->name<<" ";
  14.         if(T->sibling)
  15.         {
  16.                 traverseTree(T->sibling);
  17.         }
  18. }
  19. void deleteTree(Tree T)
  20. {
  21.         if(!T) return ;
  22.         if(T->son)
  23.         {
  24.                 deleteTree(T->son);
  25.         }
  26.         if(T->sibling)
  27.         {
  28.                 deleteTree(T->sibling);
  29.         }
  30.         delete T;
  31. }

  32. void addPair(const string P,const string C)
  33. {/*添加一对连接到树中去,其中P代表父亲节点的名字,C代表子节点的名字,
  34. treeIndex的作用是记录每个名字指向的节点。
  35. */
  36.         if(NULL == treeIndex[P])
  37.         {
  38.                 Tree temp = new treeNode(C,1);
  39.                 treeIndex[C] = temp;
  40.         }
  41.         if(NULL == treeIndex[C])
  42.         {
  43.                 Tree temp = new treeNode(C,0);
  44.                 treeIndex[C] = temp;
  45.         }
  46.         if(treeIndex[C]->root)/*若节点是子树的根,去掉标记*/
  47.         {
  48.                 treeIndex[C]->root = false;
  49.         }
  50.         if(treeIndex[P]->son)
  51.         {
  52.                 Tree temp = treeIndex[P]->son;
  53.                 while(temp->sibling)
  54.                 {
  55.                         temp = temp->sibling;
  56.                 }
  57.                 temp->sibling = treeIndex[C];
  58.                 return ;
  59.         }
  60.         else
  61.         {
  62.                 treeIndex[P]->son = treeIndex[C];
  63.         }
  64. }
复制代码
tree.h
  1. #ifndef TREE_HEADER
  2.         #define TREE_HEADER

  3. #pragma warning(disable:4786)

  4. #include<iostream>
  5. #include<string>
  6. #include<map>

  7. using namespace std;

  8. struct treeNode{
  9.         string name;
  10.         bool root;
  11.         treeNode* son;//left son right sibling
  12.         treeNode* sibling;
  13.         treeNode(const string str,bool r): name(str),son(0),sibling(0),root(r){}
  14. };
  15. typedef treeNode* Tree;

  16. typedef map< string, Tree> treeMap;

  17. void traverseTree(Tree T);
  18. void deleteTree(Tree T);
  19. void addPair(const string P,const string C);

  20. #endif

复制代码
tree.l
  1. %{
  2. #include "tree.tab.h"

  3. void yyerror(char*);

  4. extern YYSTYPE yylval;
  5. %}
  6. char [a-zA-Z\_]
  7. num [0-9]
  8. name {char}({num}|{char})*

  9. %%
  10. {name} {
  11.                 cout<<"get name:"<<yytext<<endl;
  12.                 yylval = yytext;
  13.                 cout<<"OK here."<<endl;
  14.                 return NAME;
  15.         }
  16. [" "\n\t]* {
  17.                  /*ignore blanks*/;
  18.         }
  19. . {
  20.                 cout<<"unknown character:"<<*yytext<<endl;
  21.         }

  22. %%

  23. int yywrap()
  24. { return 1; }

复制代码
 楼主| 发表于 2006-3-29 12:07:19 | 显示全部楼层
UP,顶到有人回,问题解决为止!大虾们,伸出你们powerful 的援手吧!
回复 支持 反对

使用道具 举报

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

本版积分规则

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