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

📄 compiler.cpp

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

		return SyntaxAnalysis_Statement();
	}

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

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:call语句后过程名
		{
			seTemp.iSyntaxErrCode=SE_FE_CALLNOID;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		switch(SyntaxAnalysis_Id())
		{
		case ID_FIRSTERR://语法出错:关键字call所调用的过程名的第一个字符必须为字母
			seTemp.iSyntaxErrCode=SE_ID_CALLPROCFIRST;
			m_vectorSyntaxErr.push_back(seTemp);
			break;
			
		case ID_MIDERR://语法出错:关键字call所调用的过程名的中间字符或为字母或为数字
			seTemp.iSyntaxErrCode=SE_ID_CALLPROCMID;
			m_vectorSyntaxErr.push_back(seTemp);
			break;
		}

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

		//过程调用带参数
		if(!strcmp("(",m_vectorSymbol[m_iCurPointer].szStr))
		{
			m_iCurPointer++;

			if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Call语句调用过程时'('后面必须有表达式和')'
			{
				seTemp.iSyntaxErrCode=SE_FE_CALLNOEXPRSYM;
				m_vectorSyntaxErr.push_back(seTemp);
				
				return FILEEND;
			}

			if(SyntaxAnalysis_Exp()==FILEEND)
				return FILEEND;
			
			if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Call语句调用过程时后面必须有')'
			{
				seTemp.iSyntaxErrCode=SE_FE_CALLNORSYM;
				m_vectorSyntaxErr.push_back(seTemp);
				
				return FILEEND;
			}
			
			while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
			{
				m_iCurPointer++;
				
				if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:call语句调用过程时'('后面必须有表达式和')'
				{
					seTemp.iSyntaxErrCode=SE_FE_CALLNOEXPRSYM;
					m_vectorSyntaxErr.push_back(seTemp);
					
					return FILEEND;
				}

				if(SyntaxAnalysis_Exp()==FILEEND)
					return FILEEND;
				
				if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:call语句调用过程时后面必须有')'
				{
					seTemp.iSyntaxErrCode=SE_FE_CALLNORSYM;
					m_vectorSyntaxErr.push_back(seTemp);
					
					return FILEEND;
				}
			}

			if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Call语句调用过程时后面必须有')'
			{
				seTemp.iSyntaxErrCode=SE_FE_CALLNORSYM;
				m_vectorSyntaxErr.push_back(seTemp);
				
				return FILEEND;
			}

			if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:Call语句调用过程时后面必须有')'
			{
				seTemp.iSyntaxErrCode=SE_CALLEND;
				m_vectorSyntaxErr.push_back(seTemp);
			}

			return 1;
		}

		return 1;
	}

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

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:read语句后无'('和变量和')'
		{
			seTemp.iSyntaxErrCode=SE_FE_READNOLSYMIDRSYM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(strcmp("(",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:read语句没有'('
		{
			seTemp.iSyntaxErrCode=SE_READNOLSYM;
			m_vectorSyntaxErr.push_back(seTemp);
		}
		
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Read语句后无变量和')'
		{
			seTemp.iSyntaxErrCode=SE_FE_READNOIDRSYM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		switch(SyntaxAnalysis_Id())
		{
		case ID_FIRSTERR://语法出错:关键字read后的变量的第一个字符必须为字母
			seTemp.iSyntaxErrCode=SE_ID_READIDFIRST;
			m_vectorSyntaxErr.push_back(seTemp);
			break;
			
		case ID_MIDERR://语法出错:关键字read后的变量的中间字符或为字母或为数字
			seTemp.iSyntaxErrCode=SE_ID_READIDMID;
			m_vectorSyntaxErr.push_back(seTemp);
			break;
		}

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

		while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
		{
			m_iCurPointer++;
			
			if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Read语句中逗号','后无变量
			{
				seTemp.iSyntaxErrCode=SE_FE_READNOID;
				m_vectorSyntaxErr.push_back(seTemp);
				
				return FILEEND;
			}

			switch(SyntaxAnalysis_Id())
			{
			case ID_FIRSTERR://语法出错:关键字read后的变量的第一个字符必须为字母
				seTemp.iSyntaxErrCode=SE_ID_READIDFIRST;
				m_vectorSyntaxErr.push_back(seTemp);
				break;
				
			case ID_MIDERR://语法出错:关键字read后的变量的中间字符或为字母或为数字
				seTemp.iSyntaxErrCode=SE_ID_READIDMID;
				m_vectorSyntaxErr.push_back(seTemp);
				break;
			}

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

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Read语句后')'
		{
			seTemp.iSyntaxErrCode=SE_FE_READNORSYM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:Read语句没有')'
		{
			seTemp.iSyntaxErrCode=SE_READNORSYM;
			m_vectorSyntaxErr.push_back(seTemp);
		}

		return 1;
	}

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

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句后无'(',表达式和')'
		{
			seTemp.iSyntaxErrCode=SE_FE_WRITENOLSYMEXPRSYM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(strcmp("(",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:Write语句没有'('
		{
			seTemp.iSyntaxErrCode=SE_WRITENOLSYM;
			m_vectorSyntaxErr.push_back(seTemp);
		}
		
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句后无表达式和')'
		{
			seTemp.iSyntaxErrCode=SE_FE_WRITENOEXPRSYM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(SyntaxAnalysis_Exp()==FILEEND)
			return FILEEND;
		
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句后无')'
		{
			seTemp.iSyntaxErrCode=SE_FE_WRITENORSYM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		while(!strcmp(",",m_vectorSymbol[m_iCurPointer].szStr))
		{
			m_iCurPointer++;
			
			if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:Write语句中逗号','后无变量
			{
				seTemp.iSyntaxErrCode=SE_FE_WRITENOID;
				m_vectorSyntaxErr.push_back(seTemp);
				
				return FILEEND;
			}

			switch(SyntaxAnalysis_Id())
			{
			case ID_FIRSTERR://语法出错:关键字Write后的变量的第一个字符必须为字母
				seTemp.iSyntaxErrCode=SE_ID_WRITEIDFIRST;
				m_vectorSyntaxErr.push_back(seTemp);
				break;
				
			case ID_MIDERR://语法出错:关键字Write后的变量的中间字符或为字母或为数字
				seTemp.iSyntaxErrCode=SE_ID_WriteIDMID;
				m_vectorSyntaxErr.push_back(seTemp);
				break;
			}

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

		if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:Write语句后没有')'
		{
			seTemp.iSyntaxErrCode=SE_WRITENORSYM;
			m_vectorSyntaxErr.push_back(seTemp);
		}

		return 1;
	}

	return SyntaxAnalysis_Body();
}

int CCompiler::SyntaxAnalysis_Exp()
{
	SYNTAXERR seTemp;

	if(!strcmp("+",m_vectorSymbol[m_iCurPointer].szStr))
		m_iCurPointer++;
	else
	{
		if(!strcmp("-",m_vectorSymbol[m_iCurPointer].szStr))
			m_iCurPointer++;
	}
	
	if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:表达式后无项
	{
		seTemp.iSyntaxErrCode=SE_FE_EXPNOTERM;
		m_vectorSyntaxErr.push_back(seTemp);
		
		return FILEEND;
	}

	if(SyntaxAnalysis_Term()==FILEEND)
		return FILEEND;
	
	if(m_iVecotrSymbolSize==m_iCurPointer)//文件结束
		return FILEEND;

	while(SyntaxAnalysis_Aop())
	{
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:表达式中'+'或'-'后无项
		{
			seTemp.iSyntaxErrCode=SE_FE_EXPSYMNOTERM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}
		
		if(SyntaxAnalysis_Term()==FILEEND)
			return FILEEND;

		if(m_iVecotrSymbolSize==m_iCurPointer)//文件结束
			return FILEEND;
	}

	return 1;
}

int CCompiler::SyntaxAnalysis_Lexp()
{
	SYNTAXERR seTemp;

	if(!strcmp("odd",m_vectorSymbol[m_iCurPointer].szStr))
	{
		m_iCurPointer++;

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

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

		return 1;
	}

	if(SyntaxAnalysis_Exp()==1)
	{
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:表达式后应有运算符和表达式
		{
			seTemp.iSyntaxErrCode=SE_FE_LEXPNOEXPLOPEXP;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(!SyntaxAnalysis_Lop())//语法出错:表达式之间无运算符号
		{
			seTemp.iSyntaxErrCode=SE_LEXPNOLOP;
			m_vectorSyntaxErr.push_back(seTemp);
		}

		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:表达式后应有运算符和表达式
		{
			seTemp.iSyntaxErrCode=SE_FE_LEXPNOEXPLOPEXP;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

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

	return 0;
}

bool CCompiler::SyntaxAnalysis_Lop()
{
	if(strcmp("=",m_vectorSymbol[m_iCurPointer].szStr) && strcmp("<>",m_vectorSymbol[m_iCurPointer].szStr) && 
		strcmp("<",m_vectorSymbol[m_iCurPointer].szStr) && strcmp(">",m_vectorSymbol[m_iCurPointer].szStr) && 
		strcmp("<=",m_vectorSymbol[m_iCurPointer].szStr) && strcmp(">=",m_vectorSymbol[m_iCurPointer].szStr))
		return 0;

	m_iCurPointer++;
	return 1;
}

bool CCompiler::SyntaxAnalysis_Aop()
{
	if(strcmp("+",m_vectorSymbol[m_iCurPointer].szStr) && strcmp("-",m_vectorSymbol[m_iCurPointer].szStr))
		return 0;

	m_iCurPointer++;
	return 1;
}

int CCompiler::SyntaxAnalysis_Term()
{
	SYNTAXERR seTemp;

	if(SyntaxAnalysis_Factor()==FILEEND)
		return FILEEND;

	if(m_iVecotrSymbolSize==m_iCurPointer)
		return FILEEND;

	while(SyntaxAnalysis_Mop())
	{
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:项无'(',表达式和')'
		{
			seTemp.iSyntaxErrCode=SE_FE_TERMNOFACTOR;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

		if(SyntaxAnalysis_Factor()==FILEEND)
			return FILEEND;
	}

	return 1;
}

int CCompiler::SyntaxAnalysis_Factor()
{
	if(SyntaxAnalysis_Id())
		return 1;

	m_iCurPointer--;
	if(SyntaxAnalysis_Integer())
		return 1;

	SYNTAXERR seTemp;

	m_iCurPointer--;
	if(!strcmp("(",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错
	{
		if(m_iVecotrSymbolSize==m_iCurPointer)//语法出错:遇到意外的文件结束:因子无'(',表达式和')'
		{
			seTemp.iSyntaxErrCode=SE_FE_FACTORNOLSYMEXPRSYM;
			m_vectorSyntaxErr.push_back(seTemp);
			
			return FILEEND;
		}

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

		if(strcmp(")",m_vectorSymbol[m_iCurPointer++].szStr))//语法出错:因子后没有')'
		{
			seTemp.iSyntaxErrCode=SE_FACTORNORSYM;
			m_vectorSyntaxErr.push_back(seTemp);
		}
	}

	return 0;
}

bool CCompiler::SyntaxAnalysis_Mop()
{
	if(strcmp("*",m_vectorSymbol[m_iCurPointer].szStr) && strcmp("/",m_vectorSymbol[m_iCurPointer].szStr))
		return 0;

	m_iCurPointer++;
	return 1;
}

char* CCompiler::JumpNoMatterChar(char *szStr)
{
	//跳过空格,回车,换行符,Tab
	while(*szStr==' ' || *szStr=='\r' || *szStr=='\n' || *szStr==9)
		szStr++;

	return szStr;
}

void CCompiler::OutSymbolTab(char *szFile)
{
	ofstream ofs(szFile,ios::binary);
	int nLen=m_vectorSymbol.size();

	for(int i=0;i<nLen;i++)
		ofs.write((char*)&m_vectorSymbol[i],sizeof(LEXPROPERTYVS)-sizeof(char*));

	ofs.close();
}

⌨️ 快捷键说明

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