|
一个简单的C语言编译器(6) return r; } Compiler::parser() { log<<endl; log<<"*******************************************"<<endl; log<<"语法分析开始..."<<endl; if(hasFile) in.open((fileName+".crr").c_str(),ios::in); currentChar=nextChar();//词法分析器初始化 // Symbol *s=NULL; //测试lexer() // do{ // if(s!=NULL) // delete s; // s=lexer(); // log<<s->word; // log<<" "; // log<<s->group; // log<<'\t'; // log<<s->line; // log<<endl; // }while(s->group!='#'); // delete s; int r,s=1,t=1; Symbol *ip,*iq,*it=NULL; Symbol *s1,*s2,*s3,*s4,*s5,*s6,*s7,*m; Label *l1,*l2; stack<int> ss; stack<Symbol *> sos; ss.push(s); ip=lexer(); while(t){ s=ss.top(); t=Action::lookUp(ip->group,s); if(t>0){ sos.push(ip); ss.push(t); if(it==NULL) ip=lexer(); else ip=it; it=NULL; } else if(t<0) { switch(-t) { case 1://OK //D->@()S log<<"语法分析:D->@()S"<<endl; ss.pop(); ss.pop(); ss.pop(); ss.pop(); s4=sos.top(); sos.pop(); s3=sos.top(); sos.pop(); s2=sos.top(); sos.pop();
|