⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grammar.cpp

📁 第一次写的
💻 CPP
字号:
// Grammar.cpp: implementation of the Grammar class.
//
//////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
#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          //<lop> → =|<>|<|<=|>|>=
#define $aop 17          //<aop> → +|-
#define $mop 18          //<mop> → *|/
#define $id 19           //<id> → l{l|d}
#define $integer 20      //<integer> → 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<<"出现语法错误,分析中断,请检查程序"<<endl;
		return false;
	}
	else
		cout<<"分析成功,该程序无语法错误"<<endl;
	return true;
}

char *Grammar::ReturnName(Word *Token)
{
//	char name[30];
//	strcpy(name,this->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)              //<factor>→<id>|<integer>|(<exp>)
{
	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<<"未申明的标识符!!第"<<y<<"行"<<endl;
			return false;
		}
		else
		{
			switch(tb->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<<"错误的标识符,函数名不可用于表达式:第"<<y<<"行"<<endl;
				return false;
				break;
			}
		}
		i++;
	}
	else if(Token[i].ReturnWType()==$integer)
	{
		strcpy(con,Token[i].ReturnCont());
		num=atoi(con);
		cd->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<<"左右括号不匹配:第"<<y<<"行"<<endl;
			return false;
		}
	}
	else
	{
		Token[i].ReturnXY(bx,ex,y);
		cout<<"缺少常量或标识符:第"<<y<<"行"<<endl;
		return false;
	}
	return true;
}

bool Grammar::ProceTerm(Word *Token)        //<term> → <factor>{<mop><factor>}
{
	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)             //<exp> → [+|-]<term>{<aop><term>}
{
	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)            //<lexp> → <exp> <lop> <exp>|odd <exp>
{
	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<<"缺少关系运算符:第"<<y<<"行"<<endl;
			return false;
		}
		if(!ProceExp(Token))
			return false;
		else
		{
			if(!strcmp(lop,"="))
				cd->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)                   //<statement> → 
{
	int cx1,cx2,p;
	Table *tb=pl->ChaTable;
	pcode *cd=pl->CodeList;
	if(Token[i].ReturnWType()==$id)                   //<id> := <exp>
	{
		p=tb->Position(Token[i].ReturnCont());
		if(p==0)
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"未申明的标识符!!第"<<y<<"行"<<endl;
			return false;
		}
		else if(tb->table[p].kind!=variable)
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"赋值号左部标识符属性应是变量!!第"<<y<<"行"<<endl;
			return false;
		}
		i++;	
		if(Token[i].ReturnWType()==$equal)
		{
			i++;
			if(!ProceExp(Token))
				return false;
		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"应输入\":=\":第"<<y<<"行"<<endl;
			return false;
		}
		if(p>0)
			cd->Gen(STO,lev-tb->table[p].level,tb->table[p].adr);
	}
	else if(Token[i].ReturnWType()==$if)               //if <lexp> then <statement>[else <statement>]
	{
		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 <lexp> do <statement>
	{
		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\":第"<<y<<"行"<<endl;
			return false;
		}
		if(!ProceState(Token))
			return false;
		else
		{
			cd->Gen(JMP,0,cx1);
			cd->code[cx2].a=cd->cx;
		}
	}
	else if(Token[i].ReturnWType()==$call)             //call <id>[(<exp>{,<exp>})]
	{
		i++;
		if(Token[i].ReturnWType()==$id)
		{
			p=tb->Position(Token[i].ReturnCont());
			if(p==0)
			{
				Token[i].ReturnXY(bx,ex,y);
				cout<<"未定义的函数!!第"<<y<<"行"<<endl;
				return false;
			}
			else if(tb->table[p].kind!=procedure)
			{
				Token[i].ReturnXY(bx,ex,y);
				cout<<"错误的函数名!!第"<<y<<"行"<<endl;
				return false;
			}
			else
				cd->Gen(CAL,lev-tb->table[p].level,tb->table[p].adr);
			i++;
		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少标识符:第"<<y<<"行"<<endl;
			return false;
		}
	}
	else if(ProceBody(Token));                       //<body>
	else if(Token[i].ReturnWType()==$read)             //read (<id>{,<id>})
	{
		i++;
		if(Token[i].ReturnWType()==$leftbrack)
			i++;
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少\"(\":第"<<y<<"行"<<endl;
			return false;
		}
		if(Token[i].ReturnWType()==$id)
		{
			p=tb->Position(Token[i].ReturnCont());
			i++;		
			if(p==0)
			{
				Token[i].ReturnXY(bx,ex,y);
				cout<<"未申明的标识符!!第"<<y<<"行"<<endl;
				return false;
			}
			else
			{
				cd->Gen(RED,lev-tb->table[p].level,tb->table[p].adr);
			}
		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"此处输入的应是变量!!第"<<y<<"行"<<endl;
			return false;
		}
		while(Token[i].ReturnWType()==$and)
		{
			i++;
			if(Token[i].ReturnWType()==$id)
			{
				p=tb->Position(Token[i].ReturnCont());
				i++;
				
				if(p==0)
				{
					Token[i].ReturnXY(bx,ex,y);
					cout<<"未申明的标识符!!第"<<y<<"行"<<endl;
					return false;
				}
				else
				{
					cd->Gen(RED,lev-tb->table[p].level,tb->table[p].adr);
				}
			}
			else
			{
				Token[i].ReturnXY(bx,ex,y);
				cout<<"此处输入的应是变量!!第"<<y<<"行"<<endl;
				return false;
			}
		}
		if(Token[i].ReturnWType()==$rightbrack)
			i++;
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"左右括号不匹配:第"<<y<<"行"<<endl;
			return false;
		}
	}
	else if(Token[i].ReturnWType()==$write)           //write (<exp>{,<exp>})
	{
		i++;
		if(Token[i].ReturnWType()==$leftbrack)
			i++;
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少\"(\":第"<<y<<"行"<<endl;
			return false;
		}
		if(!ProceExp(Token))
			return false;
		else	
			cd->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<<"左右括号不匹配:第"<<y<<"行"<<endl;
			return false;
		}
		cd->Gen(OPR,0,15);
	}
	else
	{
		Token[i].ReturnXY(bx,ex,y);
		cout<<"错误的语句:第"<<y<<"行"<<endl;
		return false;
	}
	return true;
}

bool Grammar::ProceBody(Word *Token)           //<body> → begin <statement>{;<statement>}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\":第"<<y<<"行"<<endl;
		return false;
	}
	return true;
}

bool Grammar::ProceConst(Word *Token)                //<const> → <id>:=<integer>
{
	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<<"此处应输入\":=\":第"<<y<<"行"<<endl;
			return false;
		}
	}
	return false;
}

bool Grammar::ProceCondecl(Word *Token)               //<condecl> → const <const>{,<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<<"常量定义出错:第"<<y<<"行"<<endl;
				return false;
				return false;
			}
		}
	}
	return true;
}

bool Grammar::ProceVardecl(Word *Token)                //<vardecl> → var <id>{,<id>}
{
	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<<"\",\"后应当输入变量名:第"<<y<<"行"<<endl;
					return false;
				}
			}
		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少标识符:第"<<y<<"行"<<endl;
			return false;
		}
	}
	return true;
}

bool Grammar::ProceProc(Word *Token)                         //<proc> → procedure <id>(<id>{,<id>});<block>{;<proc>}
{
	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<<"缺少\";\":第"<<y<<"行"<<endl;
				return false;
			}
		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少标识符:第"<<y<<"行"<<endl;
			return false;
		}
	}
	return true;
}

bool Grammar::ProceBlock(Word *Token)                   //<block> → [<condecl>][<vardecl>][<proc>]<body>
{
	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<<"超出最高允许嵌套次数!"<<endl;
		return false;
	}
	if(!ProceCondecl(Token))
		return false;
	if(!ProceVardecl(Token))
		return false;
	if(!ProceProc(Token))
		return false;
	else
	{
		cd->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)                    //<prog> → program <id>;<block>
{
	if(Token[i].ReturnWType()==$program)
	{
		i++;
		if(Token[i].ReturnWType()==$id)
		{
			i++;

		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"第"<<y<<"行第"<<bx<<"个字符处错误,应输入标识符;"<<endl;
			return false;
		}
		if(Token[i].ReturnWType()==$)
		{
			i++;
			if(!ProceBlock(Token))
				return false;
		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"第"<<y<<"行第"<<bx<<"个字符处错误,应输入;"<<endl;
			return false;
		}
	}
	else
	{
		Token[i].ReturnXY(bx,ex,y);
		cout<<"第"<<y<<"行第"<<bx<<"个字符处错误,应输入program"<<endl;
		return false;
	}
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -