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

📄 gramany.h

📁 第一次写的
💻 H
字号:
#include <iostream>
#include <string>
#include <fstream>
#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          //<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;
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)              //<factor>→<id>|<integer>|(<exp>)
{
	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<<"左右括号不匹配:第"<<y<<"行"<<endl;
			return false;
		}
	}
	else
	{
		Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少常量或标识符:第"<<y<<"行"<<endl;
		return false;
	}
	return true;
}

bool ProceTerm(int &i,word *Token)        //<term> → <factor>{<mop><factor>}
{
	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)             //<exp> → [+|-]<term>{<aop><term>}
{
	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)            //<lexp> → <exp> <lop> <exp>|odd <exp>
{
	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<<"缺少关系运算符:第"<<y<<"行"<<endl;
			return false;
		}
		if(!ProceExp(i,Token))
			return false;
	}
	else
		return false;
	return true;
}

bool ProceState(int &i,word *Token)                   //<statement> → 
{
	if(Token[i].ReturnWType()==$id)                   //<id> := <exp>
	{
		i++;
		if(Token[i].ReturnWType()==$equal)
		{
			i++;
			if(!ProceExp(i,Token))
				return false;
		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"应输入\":=\":第"<<y<<"行"<<endl;
			return false;
		}
	}
	else if(Token[i].ReturnWType()==$if)               //if <lexp> then <statement>[else <statement>]
	{
		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 <lexp> do <statement>
	{
		i++;
		if(!ProceLexp(i,Token))
			return false;
		if(Token[i].ReturnWType()==$do)
			i++;
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少\"do\":第"<<y<<"行"<<endl;
			return false;
		}
		if(!ProceState(i,Token))
			return false;
	}
	else if(Token[i].ReturnWType()==$call)             //call <id>[(<exp>{,<exp>})]
	{
		i++;
		if(Token[i].ReturnWType()==$id)
			i++;
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少标识符:第"<<y<<"行"<<endl;
			return false;
		}
		if(Token[i].ReturnWType()==$leftbrack)         
		{
			i++;
			if(!ProceExp(i,Token))
				return false;
			while(Token[i].ReturnWType()==$and)
			{
				i++;
				if(!ProceExp(i,Token))
					return false;
			}
			if(Token[i].ReturnWType()==$rightbrack)
				i++;
			else
			{
				Token[i].ReturnXY(bx,ex,y);
				cout<<"左右括号不匹配:第"<<y<<"行"<<endl;
				return false;
			}
		}
	}
	else if(ProceBody(i,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)
			i++;
		else
			return false;
		while(Token[i].ReturnWType()==$and)
		{
			i++;
			if(Token[i].ReturnWType()==$id)
				i++;
			else
				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(i,Token))
			return false;
		while(Token[i].ReturnWType()==$and)
		{
			i++;
			if(!ProceExp(i,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 ProceBody(int &i,word *Token)           //<body> → begin <statement>{;<statement>}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\":第"<<y<<"行"<<endl;
		return false;
	}
	return true;
}

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

bool ProceProc(int &i,word *Token)                         //<proc> → procedure <id>(<id>{,<id>});<block>{;<proc>}
{
	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<<"\",\"后应当输入变量名"<<endl;                    
							return false;
						}
					}
				}
				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;
				}
				if(Token[i].ReturnWType()==$)
				{
					i++;
					if(!ProceBlock(i,Token))
						return false;
					while(Token[i].ReturnWType()==$)
					{
						i++;
						if(!ProceProc(i,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;
			}
		}
		else
		{
			Token[i].ReturnXY(bx,ex,y);
			cout<<"缺少标识符:第"<<y<<"行"<<endl;
			return false;
		}
	}

	return true;
}

bool ProceBlock(int &i,word *Token)                   //<block> → [<condecl>][<vardecl>][<proc>]<body>
{
	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)                    //<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(i,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 + -