|
|
详情见我发的另外一个帖子“ 请教编译方面的问题,比较有趣的,大家看看吧.在线等候大家的回音”,我已经顶上来了,很简单的词法语法,但是对lex和yacc不熟。希望大家看看,感激不尽啊!!!!!!!!!!
tree.y语法分析文件
- %{
- #include "tree.h"
- #include "tree.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
- %%
- pairs : pairs pair
- | pair;
- pair : NAME NAME
- {
- cout<<"Get two names."<<endl;
- cout<<$1<<"-->"<<$2<<endl;
- addPair($1,$2);
- }
- %%
- extern FILE* yyin;
- extern treeMap treeIndex;
- 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;
- }
复制代码
tree.c函数实现文件- /*
- 采用儿åï¼å…„å¼Ÿè¡¨ç¤ºæ³•ï¼Œæž„é€ ä¸€é¢—å¤šæˆæ ‘
- */
- #include "tree.h"
- treeMap treeIndex;
- 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];
- }
- }
复制代码 tree.h- #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;//left son right sibling
- treeNode* sibling;
- treeNode(const string str,bool r): name(str),son(0),sibling(0),root(r){}
- };
- typedef treeNode* Tree;
- typedef map< string, Tree> treeMap;
- void traverseTree(Tree T);
- void deleteTree(Tree T);
- void addPair(const string P,const string C);
- #endif
复制代码 tree.l- %{
- #include "tree.tab.h"
- void yyerror(char*);
- extern YYSTYPE yylval;
- %}
- char [a-zA-Z\_]
- num [0-9]
- name {char}({num}|{char})*
- %%
- {name} {
- cout<<"get name:"<<yytext<<endl;
- yylval = yytext;
- cout<<"OK here."<<endl;
- return NAME;
- }
- [" "\n\t]* {
- /*ignore blanks*/;
- }
- . {
- cout<<"unknown character:"<<*yytext<<endl;
- }
- %%
- int yywrap()
- { return 1; }
复制代码 |
|