www.pudn.com > pl0.zip > Grammar.cpp
// Grammar.cpp: implementation of the Grammar class. // ////////////////////////////////////////////////////////////////////// #include#include #include #include #include "Word.h" #include "Table.h" #include "pcode.h" #include "Grammar.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// #define $program 1 #define $const 2 #define $var 3 #define $procedure 4 #define $begin 5 #define $if 6 #define $while 7 #define $call 8 #define $read 9 #define $write 10 #define $end 11 #define $then 12 #define $else 13 #define $do 14 #define $odd 15 #define $lop 16 // → =|<>|<|<=|>|>= #define $aop 17 // → +|- #define $mop 18 // → *|/ #define $id 19 // → l{l|d} #define $integer 20 // → d{d} #define $ 21 // ; #define $equal 22 // := #define $and 23 // , #define $leftbrack 24 //( #define $rightbrack 25 //) //using namespace std; Grammar::Grammar(Simpsc *p) { pl=p; } bool Grammar::Analysis(Word *Token) { lev=-1; i=0; if(!ProceProg(Token)) { cout<<"出现语法错误,分析中断,请检查程序"< Token[i].ReturnCont()); // return name; return Token[i].ReturnCont(); } void Grammar::ConstVar(Word *Token) { Table *tb=pl->ChaTable; tb->Enter(constant,Token); } void Grammar::ConstDecla(Word *Token) { char con[16]; int num; Table *tb=pl->ChaTable; strcpy(con,Token[i].ReturnCont()); num=atoi(con); tb->GetVal(num); } void Grammar::VarDecla(Word *Token) { Table *tb=pl->ChaTable; tb->Enter(variable,Token); dx[lev]++; } bool Grammar::ProceFactor(Word *Token) // → | |( ) { int p,num; char con[16]; Table *tb=pl->ChaTable; pcode *cd=pl->CodeList; if(Token[i].ReturnWType()==$id) { p=tb->Position(Token[i].ReturnCont()); if(p==0) { Token[i].ReturnXY(bx,ex,y); cout<<"未申明的标识符!!第"< table[p].kind) { case constant: cd->Gen(LIT,0,tb->table[p].val); break; case variable: cd->Gen(LOD,lev-tb->table[p].level,tb->table[p].adr); break; case procedure: Token[i].ReturnXY(bx,ex,y); cout<<"错误的标识符,函数名不可用于表达式:第"< Gen(LIT,0,num); i++; } else if(Token[i].ReturnWType()==$leftbrack) { i++; if(!ProceExp(Token)) return false; if(Token[i].ReturnWType()==$rightbrack) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"左右括号不匹配:第"< → { } { char op[2]; pcode *cd=pl->CodeList; if(!ProceFactor(Token)) return false; while(Token[i].ReturnWType()==$mop) { strcpy(op,Token[i].ReturnCont()); i++; if(!ProceFactor(Token)) return false; else { if(op[0]=='*') cd->Gen(OPR,0,4); else cd->Gen(OPR,0,5); } } return true; } bool Grammar::ProceExp(Word *Token) // → [+|-] { } { char op[2]; Table *tb=pl->ChaTable; pcode *cd=pl->CodeList; if(!strcmp(Token[i].ReturnCont(),"+") || !strcmp(Token[i].ReturnCont(),"-")) { strcpy(op,Token[i].ReturnCont()); i++; } if(!ProceTerm(Token)) return false; else { if(op[0]=='-') cd->Gen(OPR,0,1); } while(Token[i].ReturnWType()==$aop) { strcpy(op,Token[i].ReturnCont()); i++; if(!ProceTerm(Token)) return false; if(op[0]=='+') cd->Gen(OPR,0,2); else cd->Gen(OPR,0,3); } return true; } bool Grammar::ProceLexp(Word *Token) // → |odd { Table *tb=pl->ChaTable; pcode *cd=pl->CodeList; char lop[3]; if(Token[i].ReturnWType()==$odd) { i++; if(!ProceExp(Token)) return false; else cd->Gen(OPR,0,6); } else if(ProceExp(Token)) { if(Token[i].ReturnWType()==$lop) { strcpy(lop,Token[i].ReturnCont()); i++; } else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少关系运算符:第"< Gen(OPR,0,8); else if(!strcmp(lop,"<>")) cd->Gen(OPR,0,9); else if(!strcmp(lop,"<")) cd->Gen(OPR,0,10); else if(!strcmp(lop,">=")) cd->Gen(OPR,0,11); else if(!strcmp(lop,">")) cd->Gen(OPR,0,12); else if(!strcmp(lop,"<=")) cd->Gen(OPR,0,13); } } else return false; return true; } bool Grammar::ProceState(Word *Token) // → { int cx1,cx2,p; Table *tb=pl->ChaTable; pcode *cd=pl->CodeList; if(Token[i].ReturnWType()==$id) // := { p=tb->Position(Token[i].ReturnCont()); if(p==0) { Token[i].ReturnXY(bx,ex,y); cout<<"未申明的标识符!!第"< table[p].kind!=variable) { Token[i].ReturnXY(bx,ex,y); cout<<"赋值号左部标识符属性应是变量!!第"< 0) cd->Gen(STO,lev-tb->table[p].level,tb->table[p].adr); } else if(Token[i].ReturnWType()==$if) //if then [else ] { i++; if(!ProceLexp(Token)) return false; if(Token[i].ReturnWType()==$then) { i++; cx1=cd->cx; cd->Gen(JPC,0,0); } else return false; if(!ProceState(Token)) return false; if(Token[i].ReturnWType()==$else) { i++; cx2=cd->cx; cd->Gen(JMP,0,0); if(!ProceState(Token)) return false; else { cd->code[cx1].a=cx2+1; cd->code[cx2].a=cd->cx; } } else cd->code[cx1].a=cd->cx; } else if(Token[i].ReturnWType()==$while) //while do { cx1=cd->cx; i++; if(!ProceLexp(Token)) return false; else { cx2=cd->cx; cd->Gen(JPC,0,0); } if(Token[i].ReturnWType()==$do) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少\"do\":第"< Gen(JMP,0,cx1); cd->code[cx2].a=cd->cx; } } else if(Token[i].ReturnWType()==$call) //call [( {, })] { i++; if(Token[i].ReturnWType()==$id) { p=tb->Position(Token[i].ReturnCont()); if(p==0) { Token[i].ReturnXY(bx,ex,y); cout<<"未定义的函数!!第"< table[p].kind!=procedure) { Token[i].ReturnXY(bx,ex,y); cout<<"错误的函数名!!第"< Gen(CAL,lev-tb->table[p].level,tb->table[p].adr); i++; } else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少标识符:第"< else if(Token[i].ReturnWType()==$read) //read ( {, }) { i++; if(Token[i].ReturnWType()==$leftbrack) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少\"(\":第"< Position(Token[i].ReturnCont()); i++; if(p==0) { Token[i].ReturnXY(bx,ex,y); cout<<"未申明的标识符!!第"< Gen(RED,lev-tb->table[p].level,tb->table[p].adr); } } else { Token[i].ReturnXY(bx,ex,y); cout<<"此处输入的应是变量!!第"< Position(Token[i].ReturnCont()); i++; if(p==0) { Token[i].ReturnXY(bx,ex,y); cout<<"未申明的标识符!!第"< Gen(RED,lev-tb->table[p].level,tb->table[p].adr); } } else { Token[i].ReturnXY(bx,ex,y); cout<<"此处输入的应是变量!!第"< {, }) { i++; if(Token[i].ReturnWType()==$leftbrack) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少\"(\":第"< Gen(WRT,0,0); while(Token[i].ReturnWType()==$and) { i++; if(!ProceExp(Token)) return false; else cd->Gen(WRT,0,0); } if(Token[i].ReturnWType()==$rightbrack) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"左右括号不匹配:第"< Gen(OPR,0,15); } else { Token[i].ReturnXY(bx,ex,y); cout<<"错误的语句:第"< → begin {; }end { if(Token[i].ReturnWType()==$begin) { i++; if(!ProceState(Token)) return false; while(Token[i].ReturnWType()==$) { i++; if(!ProceState(Token)) return false; } } else return false; if(Token[i].ReturnWType()==$end) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"此处应输入\"end\":第"< → := { if(Token[i].ReturnWType()==$id) { this->ConstVar(Token); i++; if(Token[i].ReturnWType()==$equal) { i++; if(Token[i].ReturnWType()==$integer) { this->ConstDecla(Token); i++; return true; } } else { Token[i].ReturnXY(bx,ex,y); cout<<"此处应输入\":=\":第"< → const {, } { if(Token[i].ReturnWType()==$const) { i++; if(!ProceConst(Token)) return false; while(Token[i].ReturnWType()==$and) { i++; if(!ProceConst(Token)) { Token[i].ReturnXY(bx,ex,y); cout<<"常量定义出错:第"< → var {, } { if(Token[i].ReturnWType()==$var) { i++; if(Token[i].ReturnWType()==$id) { this->VarDecla(Token); i++; while(Token[i].ReturnWType()==$and) { i++; if(Token[i].ReturnWType()==$id) { this->VarDecla(Token); i++; } else { i++; Token[i].ReturnXY(bx,ex,y); cout<<"\",\"后应当输入变量名:第"< → procedure ( {, }); {; } { int tx0; Table *tb=pl->ChaTable; pcode *cd=pl->CodeList; if(Token[i].ReturnWType()==$procedure) { i++; // lev++; // dx[lev]=3; tb=pl->ChaTable; tx0=tb->ReturnIndex(); if(Token[i].ReturnWType()==$id) { tb->Enter(procedure,Token); i++; if(Token[i].ReturnWType()==$) { i++; if(!ProceBlock(Token)) return false; while(Token[i].ReturnWType()==$) { i++; if(!ProceProc(Token)) return false; } } else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少\";\":第"< → [ ][ ][ ] { Table *tb=pl->ChaTable; pcode *cd=pl->CodeList; int cx0,tx0; lev++; dx[lev]=3; tx0=tb->ReturnIndex(); tb->table[tx0].adr=cd->cx; cd->Gen(JMP,0,0); if(lev>MAX_LEV) { cout<<"超出最高允许嵌套次数!"< code[tb->table[tx0].adr].a=cd->cx; tb->table[tx0].adr=cd->cx; tb->table[tx0].size=dx[lev]; cx0=cd->cx; cd->Gen(INT,0,dx[lev]); } if(!ProceBody(Token)) return false; else { cd->Gen(OPR,0,0); lev--; } return true; } bool Grammar::ProceProg(Word *Token) // → program ; { if(Token[i].ReturnWType()==$program) { i++; if(Token[i].ReturnWType()==$id) { i++; } else { Token[i].ReturnXY(bx,ex,y); cout<<"第"<