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<<"第"<