www.pudn.com > pl0.zip > GramAny.h
#include#include #include #include "Word.h" #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; bool ProceBlock(int &i,word *Token); bool ProceExp(int &i,word *Token); bool ProceBody(int &i,word *Token); int bx,ex,y,dx[MAX_LEV+1]; //单词坐标 bool ProceFactor(int &i,word *Token) // → | |( ) { if(Token[i].ReturnWType()==$id) i++; else if(Token[i].ReturnWType()==$integer) i++; else if(Token[i].ReturnWType()==$leftbrack) { i++; if(!ProceExp(i,Token)) return false; if(Token[i].ReturnWType()==$rightbrack) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"左右括号不匹配:第"< → { } { if(!ProceFactor(i,Token)) return false; while(Token[i].ReturnWType()==$mop) { i++; if(!ProceFactor(i,Token)) return false; } return true; } bool ProceExp(int &i,word *Token) // → [+|-] { } { if(!strcmp(Token[i].ReturnCont(),"+") || !strcmp(Token[i].ReturnCont(),"-")) i++; if(!ProceTerm(i,Token)) return false; while(Token[i].ReturnWType()==$aop) { i++; if(!ProceTerm(i,Token)) return false; } return true; } bool ProceLexp(int &i,word *Token) // → |odd { if(Token[i].ReturnWType()==$odd) { i++; if(!ProceExp(i,Token)) return false; } else if(ProceExp(i,Token)) { if(Token[i].ReturnWType()==$lop) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少关系运算符:第"< → { if(Token[i].ReturnWType()==$id) // := { i++; if(Token[i].ReturnWType()==$equal) { i++; if(!ProceExp(i,Token)) return false; } else { Token[i].ReturnXY(bx,ex,y); cout<<"应输入\":=\":第"< then [else ] { i++; if(!ProceLexp(i,Token)) return false; if(Token[i].ReturnWType()==$then) i++; else return false; if(!ProceState(i,Token)) return false; if(Token[i].ReturnWType()==$else) { i++; if(!ProceState(i,Token)) return false; } } else if(Token[i].ReturnWType()==$while) //while do { i++; if(!ProceLexp(i,Token)) return false; if(Token[i].ReturnWType()==$do) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少\"do\":第"< [( {, })] { i++; if(Token[i].ReturnWType()==$id) 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<<"缺少\"(\":第"< {, }) { i++; if(Token[i].ReturnWType()==$leftbrack) i++; else { Token[i].ReturnXY(bx,ex,y); cout<<"缺少\"(\":第"< → begin {; }end { if(Token[i].ReturnWType()==$begin) { i++; if(!ProceState(i,Token)) return false; while(Token[i].ReturnWType()==$) { i++; if(!ProceState(i,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) { i++; if(Token[i].ReturnWType()==$equal) { i++; if(Token[i].ReturnWType()==$integer) { i++; return true; } } } return false; } bool ProceCondecl(int &i,word *Token) // → const {, } { if(Token[i].ReturnWType()==$const) { i++; if(!ProceConst(i,Token)) return false; while(Token[i].ReturnWType()==$and) { i++; if(!ProceConst(i,Token)) return false; } } return true; } bool ProceVardecl(int &i,word *Token) // → var {, } { if(Token[i].ReturnWType()==$var) { i++; if(Token[i].ReturnWType()==$id) { i++; while(Token[i].ReturnWType()==$and) { i++; if(Token[i].ReturnWType()==$id) i++; else { i++; Token[i].ReturnXY(bx,ex,y); cout<<"\",\"后应当输入变量名:第"< → procedure ( {, }); {; } { int cx0,tx0; if(Token[i].ReturnWType()==$procedure) { i++; if(Token[i].ReturnWType()==$id) { i++; if(Token[i].ReturnWType()==$leftbrack) { i++; if(Token[i].ReturnWType()==$id) { i++; while(Token[i].ReturnWType()==$and) { i++; if(Token[i].ReturnWType()==$id) i++; else { i++; cout<<"\",\"后应当输入变量名"< → [ ][ ][ ] { lev++; if(!ProceCondecl(i,Token)) return false; if(!ProceVardecl(i,Token)) return false; if(!ProceProc(i,Token)) return false; if(!ProceBody(i,Token)) return false; return true; } bool ProceProg(int &i,word *Token) // → program ; { if(Token[i].ReturnWType()==$program) { i++; if(Token[i].ReturnWType()==$id) { i++; } else { Token[i].ReturnXY(bx,ex,y); cout<<"第"<