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

📄 compiler.cpp

📁 一个非常好的词法分析程序,加上语法的分析是一个难得一见的好实例
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		}

		if(SyntaxAnalysis_Const()==FILEEND)
			return FILEEND;

		if(m_iVecotrSymbolSize==m_iCurPointer)
			return 1;
	}

	return 1;
}

int CCompiler::SyntaxAnalysis_Vardecl()
{
	SYNTAXERR seTemp;

	if(strcmp("var",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
	{
		m_iCurPointer--;
		return 0;
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:关键字Var后面必须有变量名
	{
		seTemp.iSyntaxErrCode=SE_FE_VAREND;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;//应该是变量定义
	}

	switch(SyntaxAnalysis_Id())//语法出错:定义变量的变量名的第一个字符必须为字母
	{
	case ID_FIRSTERR://语法出错:定义变量的变量名的第一个字符必须为字母
		seTemp.iSyntaxErrCode=SE_ID_VARNAMEFIRST;
		m_vectorSyntaxErr.push_back(seTemp);
		break;

	case ID_MIDERR://语法出错:定义变量的变量名的中间字符或为字母或为数字
		seTemp.iSyntaxErrCode=SE_ID_VARNAMEMID;
		m_vectorSyntaxErr.push_back(seTemp);
		break;
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)
		return 1;

	while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
	{
		m_iCurPointer++;
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:定义变量还未结束
		{
			seTemp.iSyntaxErrCode=SE_FE_VARNOEND;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		switch(SyntaxAnalysis_Id())//语法出错:定义变量的变量名的第一个字符必须为字母
		{
		case ID_FIRSTERR://语法出错:定义变量的变量名的第一个字符必须为字母
			seTemp.iSyntaxErrCode=SE_ID_VARNAMEFIRST;
			m_vectorSyntaxErr.push_back(seTemp);
			break;
			
		case ID_MIDERR://语法出错:定义变量的变量名的中间字符或为字母或为数字
			seTemp.iSyntaxErrCode=SE_ID_VARNAMEMID;
			m_vectorSyntaxErr.push_back(seTemp);
			break;
		}

		if(m_iVecotrSymbolSize==m_iCurPointer)
			return 1;
	}

	return 1;
}

int CCompiler::SyntaxAnalysis_Proc()
{
	SYNTAXERR seTemp;

	if(strcmp("procedure",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
	{
		m_iCurPointer--;
		return 0;
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:关键字Procedure后面必须有过程名
	{
		seTemp.iSyntaxErrCode=SE_FE_PROCNONAME;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;//应该是过程定义
	}

	//检查过程名
	switch(SyntaxAnalysis_Id())
	{
	case ID_FIRSTERR://语法出错:定义过程名的变量名的第一个字符必须为字母
		seTemp.iSyntaxErrCode=SE_ID_PROCNAMEFIRST;
		m_vectorSyntaxErr.push_back(seTemp);
		break;

	case ID_MIDERR://语法出错:定义过程名的变量名的中间字符或为字母或为数字
		seTemp.iSyntaxErrCode=SE_ID_PROCNAMEMID;
		m_vectorSyntaxErr.push_back(seTemp);
		break;
	}
	
	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程名后无括号和参数
	{
		seTemp.iSyntaxErrCode=SE_FE_NOPROCSYMARG;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;//应该是过程定义
	}

	if(strcmp("(",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
	{
		seTemp.iSyntaxErrCode=SE_PROCLSYMBOL;
		m_vectorSyntaxErr.push_back(seTemp);
	}
	
	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程名后参数
	{
		seTemp.iSyntaxErrCode=SE_FE_PROCNOARG;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;//应该是过程定义
	}

	//检查过程参数
	switch(SyntaxAnalysis_Id())
	{
	case ID_FIRSTERR://语法出错:定义过程参数的变量名的第一个字符必须为字母
		seTemp.iSyntaxErrCode=SE_ID_PROCARGNAMEFIRST;
		m_vectorSyntaxErr.push_back(seTemp);
		break;

	case ID_MIDERR://语法出错:定义过程参数的变量名的中间字符或为字母或为数字
		seTemp.iSyntaxErrCode=SE_ID_PROCARGNAMEMID;
		m_vectorSyntaxErr.push_back(seTemp);
		break;
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程名后无参数
	{
		seTemp.iSyntaxErrCode=SE_FE_PROCNORSYM;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;//应该是过程定义
	}

	while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
	{
		m_iCurPointer++;
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程参数还未写完
		{
			seTemp.iSyntaxErrCode=SE_FE_PROCAGRNOEND;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		//检查过程参数
		switch(SyntaxAnalysis_Id())
		{
		case ID_FIRSTERR://语法出错:定义过程参数的变量名的第一个字符必须为字母
			seTemp.iSyntaxErrCode=SE_ID_PROCARGNAMEFIRST;
			m_vectorSyntaxErr.push_back(seTemp);
			break;
			
		case ID_MIDERR://语法出错:定义过程参数的变量名的中间字符或为字母或为数字
			seTemp.iSyntaxErrCode=SE_ID_PROCARGNAMEMID;
			m_vectorSyntaxErr.push_back(seTemp);
			break;
		}

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程参数后应有')'
		{
			seTemp.iSyntaxErrCode=SE_FE_PROCNORSYM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}
	}
	
	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程参数后应有')'
	{
		seTemp.iSyntaxErrCode=SE_FE_PROCNORSYM;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;//应该是过程定义
	}

	if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
	{
		seTemp.iSyntaxErrCode=SE_PROCRSYMBOL;
		m_vectorSyntaxErr.push_back(seTemp);
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:定义完过程后必须以分号结束
	{
		seTemp.iSyntaxErrCode=SE_FE_PROCEND;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;//应该是过程定义
	}

	if(strcmp(";",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:定义完过程后必须以分号结束
	{
		seTemp.iSyntaxErrCode=SE_PROCEND;
		m_vectorSyntaxErr.push_back(seTemp);
	}
	
	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:过程无块
	{
		seTemp.iSyntaxErrCode=SE_FE_PROCNOBLOCK;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;
	}

	if(SyntaxAnalysis_Block()==FILEEND)
		return FILEEND;

	if(m_iVecotrSymbolSize==m_iCurPointer)
			return 1;

	while(!strcmp(";",m_vectorSymbol[m_iCurPointer].szStr))
	{
		m_iCurPointer++;
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:另一个过程还未定义
		{
			seTemp.iSyntaxErrCode=SE_FE_PROCNOPROC;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(SyntaxAnalysis_Proc()==FILEEND)
			return FILEEND;
		
		if(m_iVecotrSymbolSize==m_iCurPointer)
			return 1;
	}

	return 1;
}

int CCompiler::SyntaxAnalysis_Body()
{
	SYNTAXERR seTemp;

	if(strcmp("begin",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:程序体必须以关键字Begin开头
	{
		seTemp.iSyntaxErrCode=SE_BEGINHEAD;
		m_vectorSyntaxErr.push_back(seTemp);
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序体无语句
	{
		seTemp.iSyntaxErrCode=SE_FE_BODYNOSTATE;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;
	}

	if(SyntaxAnalysis_Statement()==FILEEND)
		return FILEEND;
	
	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序体应该以关键字End结束
	{
		seTemp.iSyntaxErrCode=SE_FE_BODYNOEND;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;
	}

	while(!strcmp(";",m_vectorSymbol[m_iCurPointer].szStr))
	{
		m_iCurPointer++;
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:语句后面的分号后面应该还有语句
		{
			seTemp.iSyntaxErrCode=SE_FE_BODYSYMNOSTATE;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(SyntaxAnalysis_Statement()==FILEEND)
			return FILEEND;

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序体应该以关键字End结束
		{
			seTemp.iSyntaxErrCode=SE_FE_BODYNOEND;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:程序体应该以关键字End结束
	{
		seTemp.iSyntaxErrCode=SE_FE_BODYNOEND;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;
	}

	if(strcmp("end",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:程序体应该以关键字End结束
	{
		seTemp.iSyntaxErrCode=SE_BODYEND;
		m_vectorSyntaxErr.push_back(seTemp);
	}

	return 1;
}

bool CCompiler::SyntaxAnalysis_Integer()
{
	int iSize=strlen(m_vectorSymbol[m_iCurPointer].szStr);
	
	for(int i=0;i<iSize;i++)
	{
		if(!isdigit(m_vectorSymbol[m_iCurPointer].szStr[i]))//语法出错
		{
			m_iCurPointer++;
			return 0;
		}
	}

	m_iCurPointer++;
	return 1;
}

int CCompiler::SyntaxAnalysis_Const()
{
	SYNTAXERR seTemp;

	if(!SyntaxAnalysis_Id())
	{
		seTemp.iSyntaxErrCode=SE_ID_CONSTNAME;
		m_vectorSyntaxErr.push_back(seTemp);
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:必须给常量赋值
	{
		seTemp.iSyntaxErrCode=SE_FE_CONSTIDEND;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;
	}

	if(strcmp(":=",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:常量赋值符号应为:=
	{
		seTemp.iSyntaxErrCode=SE_CONSTSYMBOL;
		m_vectorSyntaxErr.push_back(seTemp);
	}

	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:常量赋值符号":="后应有常量
	{
		seTemp.iSyntaxErrCode=SE_FE_CONSTSYMBOLEND;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;
	}

	if(!SyntaxAnalysis_Integer())
	{
		seTemp.iSyntaxErrCode=SE_INT_CONST;
		m_vectorSyntaxErr.push_back(seTemp);
	}

	return 1;
}

int CCompiler::SyntaxAnalysis_Statement()
{
	SYNTAXERR seTemp;

	//为赋值语句
	if(SyntaxAnalysis_Id()==-1 && !IsKeyWord(m_vectorSymbol[m_iCurPointer-1].szStr))
	{
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:赋值语句没有赋值符号与表达式
		{
			seTemp.iSyntaxErrCode=SE_FE_EVELUATENOSYMEXP;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(strcmp(":=",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:赋值符号应未:=
		{
			seTemp.iSyntaxErrCode=SE_VAREVELUATE;
			return 0;
		}

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:赋值语句没有表达式
		{
			seTemp.iSyntaxErrCode=SE_FE_EVELUATENOEXP;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(SyntaxAnalysis_Exp()==FILEEND)
			return FILEEND;

		return 1;
	}
	
	m_iCurPointer--;
	//为if语句
	if(!strcmp("if",m_vectorSymbol[m_iCurPointer].szStr))
	{
		m_iCurPointer++;

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:if语句后没有表达式,关键字then和表达式
		{
			seTemp.iSyntaxErrCode=SE_FE_IFNOLEXPTHENLEXP;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(SyntaxAnalysis_Lexp()==FILEEND)
			return FILEEND;

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:if语句后没有关键字then和表达式
		{
			seTemp.iSyntaxErrCode=SE_FE_IFNOTHENLEXP;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(strcmp("then",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:if语句没有关键字then
		{
			seTemp.iSyntaxErrCode=SE_NOTHEN;
			m_vectorSyntaxErr.push_back(seTemp);
		}

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:if语句没有表达式
		{
			seTemp.iSyntaxErrCode=SE_FE_IFNOLEXP;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(SyntaxAnalysis_Statement()==FILEEND)
			return FILEEND;

		if(!strcmp("else",m_vectorSymbol[m_iCurPointer].szStr))
		{
			m_iCurPointer++;
			
			if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:if语句的关键字else后面没有表达式
			{
				seTemp.iSyntaxErrCode=SE_FE_IFELSENOLEXP;
				m_vectorSyntaxErr.push_back(seTemp);
				
				return FILEEND;
			}
			
			return SyntaxAnalysis_Statement();
		}

		return 1;
	}

	//为While语句
	if(!strcmp("while",m_vectorSymbol[m_iCurPointer].szStr))
	{
		m_iCurPointer++;

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:while语句后没有表达式,关键字do和语句
		{
			seTemp.iSyntaxErrCode=SE_FE_WHILENOLEXPDOSTATE;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(SyntaxAnalysis_Lexp()==FILEEND)
			return FILEEND;
		
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:while语句后没有表达式,关键字do和语句
		{
			seTemp.iSyntaxErrCode=SE_FE_WHILENODOSTATE;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(strcmp("do",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:while语句没有关键字then
		{
			seTemp.iSyntaxErrCode=SE_NODO;
			m_vectorSyntaxErr.push_back(seTemp);
		}

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:while语句没有表达式
		{
			seTemp.iSyntaxErrCode=SE_FE_WHILENOSTATE;
			m_vectorSyntaxErr.push_back(seTemp);

⌨️ 快捷键说明

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