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

📄 codeeditview.cpp

📁 一个用VC++开发的Pascal编译器. 包括词法分析 语法分析 语义分析 中间代码生成 对学习编译原理的同学有很大用途
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		case LeadBEExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'!' or identifier or '(' expected while '%s' found",m_word);
			}
			break;
		case LeadBTExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'!' or identifier or '(' expected while '%s' found",m_word);
			}
			break;
		case LeadBFExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'!' or identifier or '(' expected while '%s' found",m_word);
			}
			break;
		case OperandExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'Operand' expected while '%s' found",m_word);
			}
			break;
		case OperatorExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'Operator' expected while '%s' found",m_word);
			}
			break;
		case ComparisonOpExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'ComparisonOp' expected while '%s' found",m_word);
			}
			break;
		case ThenExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'then' expected while '%s' found",m_word);
			}
			break;
		case IDExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'identifier' expected while '%s' found",m_word);
			}
			break;
		case DoExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'Do' expected while '%s' found",m_word);
			}
			break;
		case ASSIGNExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'ASSIGN' expected while '%s' found",m_word);
			}
			break;
		case SEMIExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'SEMI' expected while '%s' found",m_word);
			}
			break;
		case LPARENExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'LPAREN' expected while '%s' found",m_word);
			}
			break;
		case RPARENExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'RPAREN' expected while '%s' found",m_word);
			}
			break;
		case COMMAExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'COMMA' expected while '%s' found",m_word);
			}
			break;
		case COLONExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'COLON' expected while '%s' found",m_word);
			}
			break;
		case RCUTExcept:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'RCUT' expected while '%s' found",m_word);
			}
			break;
		case UndeclaredId:
			{
				CString m_word;
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				m_word = m_cCompiler.m_dModel[ position ].TokenString;
				if (m_word == ""){//说明不是标志符,也不是数字
					m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
				}
				Detail.Format("'%s' : undeclared identifier",m_word);
			}
			break;
		case IdRedefinition:
			{
				int		position = m_cCompiler.m_eErrorTable[ i ].Position;
				CString word = m_cCompiler.m_Variable[ position ];
				Detail.Format("'%s' : Redefinition",word);
			}
			break;
		case COLONMiss:
			{
				Detail.Format("miss ':' before integer or real");
			}
			break;
		case ExtraWordAfterEnd:
			{
				Detail.Format("unexpected end of file");
			}
			break;
		case ExtraSEMI:
			{
				Detail.Format("Extra ; before else");
			}
			break;
		case SEMIMiss:
			{
				Detail.Format("miss ; before S语句");
			}
			break;
		case TypeUnsuited:
			{
				Detail.Format("Type Unsuitable ");
			}
			break;

		default:
			break;
		}
		CString ErrorMsg = "";
		ErrorMsg.Format("Line(%d): error P00%d: %s",
			m_cCompiler.m_eErrorTable[i].OccurLine,
			m_cCompiler.m_eErrorTable[i].ErrorType,Detail);
		pFrame->m_pMsgView->AddMsg(ErrorMsg);
	}
}

CString CCodeEditView::GetOp(int OP)
{
	CString	Opstr = "";
	switch( OP ){
	case PLUS:
		Opstr = "+";
		break;
	case TIMES:
		Opstr = "*";
		break;
	case SUB:
		Opstr = "-";
		break;
	case ASSIGN:
		Opstr = ":=";
		break;
	case EQ :
		Opstr = "j=";
		break;
	case LT:
		Opstr = "j<";
		break;
	case LE :
		Opstr = "j<=";
		break;
	case GT:
		Opstr = "j>";
		break;
	case GE :
		Opstr = "j>=";
		break;
	case NE:
		Opstr = "j<>";
		break;
	case JMP :
		Opstr = "jmp";
		break;
	case JNZ:
		Opstr = "jnz";
		break;
	default:
		break;
	}
	return Opstr;
}

CString	CCodeEditView::GetArg1(int OP,int arg,vector<SymbolRecord> SymbolRecord)
{
	if(OP==JMP)	{//跳转语句的操作数缺省
		arg1type = 3;//无意义缺省的参数
		return "0";
	}
	CString Argstr = "";
	if(arg >= 0){//到符号表中去找
		if(SymbolRecord[arg].TokenType==INTEGER||SymbolRecord[arg].TokenType==REAL){//是变量
			arg1type = 1;
			Argstr = SymbolRecord[arg].TokenString;
			return Argstr;
		}
		else{
			if(SymbolRecord[arg].TokenType==INTNUM){//是整型常数
				arg1type = 0;
				Argstr = SymbolRecord[arg].TokenString;
				return Argstr;
			}
			else{
				int u = SymbolRecord[arg].TokenType ;
				Argstr = SymbolRecord[arg].TokenString;
			}
		}
	}
	else{//是临时变量
		int Num = -arg ;
		Argstr.Format("T%d",Num);
		arg1type = 2;
		return Argstr;
	}
	return Argstr;
}

CString	CCodeEditView::GetArg2(int OP,int arg,vector<SymbolRecord> SymbolRecord)
{
	if(OP==JMP||OP==ASSIGN||OP==JNZ){
		arg2type = 3;
		return "0";
	}
	CString Argstr = "";
	if(arg >= 0){//到符号表中去找
		if(SymbolRecord[arg].TokenType==INTEGER||SymbolRecord[arg].TokenType==REAL){//是变量
			arg2type = 1;
			Argstr = SymbolRecord[arg].TokenString;
		}
		else{
			if(SymbolRecord[arg].TokenType==INTNUM){//是整型常数
				arg2type = 0;
				Argstr = SymbolRecord[arg].TokenString;
			}
			else Argstr = SymbolRecord[arg].TokenString;
		}
	}
	else{//是临时变量
		int Num = -arg ;
		arg2type = 2;
		Argstr.Format("T%d",Num);
	}
	return Argstr;
}
CString CCodeEditView::GetResult(int OP, int arg, vector<SymbolRecord> SymbolRecord)
{
	CString Argstr = "";
	if(OP==ASSIGN||OP==SUB||OP==PLUS||OP==TIMES){
		//这些语句结果为变量或临时变量
		if(arg >= 0){//是变量
			resulttype = 1;
			Argstr = SymbolRecord[arg].TokenString;
		}
		else{//是临时变量
			resulttype = 2;
			int Num = -arg ;
			Argstr.Format("T%d",Num);
		}
	}
	else{
		//result域中为四元式编号
		resulttype = 0;
		Argstr.Format("%d",arg);
	}

	return Argstr;
}

CString CCodeEditView::TypeToStr(int type)
{
	switch(type){

⌨️ 快捷键说明

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