|
|
--开始以为是头文件的问题,用的是STL,但是后来在什么地方看到了说只要YYSTYPE中没有类成员的话,都是没有问题的
在单个的文件中,这个lex文件可以解析出单词来:- %{
- #include "y.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;
- return NAME;
- }
- [" "\n\t]* {
- /*ignore blanks*/;
- }
- . {
- cout<<"unknown character:"<<*yytext<<endl;
- }
- %%
- int yywrap()
- { return 1; }
复制代码
但是在和几个文件合起来的时候就不行了,读入一个单词就显示错误提示如下:
- unknown character:a
- unknown character:e
- unknown character:a
- unknown character:a
- unknown character:a
- unknown character:f
- unknown character:a
- syntax error
复制代码
我的目的是要读入 父 - 子 节点描述,然后在内存中构造一颗树,但是现在连词法分析都不行.........希望大家指点指点.
我的几个文件的代码如下:
头文件 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.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];
- }
- }
复制代码
词法分析的lex文件:- %{
- #include "y.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;
- return NAME;
- }
- [" "\n\t]* {
- /*ignore blanks*/;
- }
- . {
- cout<<"unknown character:"<<*yytext<<endl;
- }
- %%
- int yywrap()
- { return 1; }
复制代码
语法分析的yacc文件:- %{
- #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
- {
- 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;
- }
复制代码
我用的是FC4中的lex和yacc,需要动手把y.tab.c中的yystype的定义拷贝到y.tab.h中去,还要在y.tab.h中添加对string头文件的包含.
希望大家看看有问题,给我指出来.谢谢了 |
|