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<<"缺少关系运算符:第"<")) 
				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<<"第"<