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

📄 errors.cpp

📁 pl0文法编译器
💻 CPP
字号:
#include "Errors.h"
#include "SymSet.h"
#include <iostream>
using namespace std;

Errors::Errors(PL0Compiler *pl)
{
	initErrorMap();
	pl0Compiler = pl;
	numOfErrors = 0;
}

void Errors::initErrorMap()
{
	errorMap.insert(errorVauleType(1,"超出最大位数值范围,应不大于2047"));
	errorMap.insert(errorVauleType(2,"数字位数超过允许位数限制,应不大于14位"));
	errorMap.insert(errorVauleType(3,"实数格式不正确,小数点后须紧跟数字"));
	errorMap.insert(errorVauleType(4,"无效的标识符"));
	errorMap.insert(errorVauleType(5,"标识符字符数超过限制,应不大于15位"));
	errorMap.insert(errorVauleType(6,"超出最大嵌套层次限制"));
	errorMap.insert(errorVauleType(7,"非法字符定义"));
	errorMap.insert(errorVauleType(8,"非法转义字符"));
	errorMap.insert(errorVauleType(9,"非法字符串"));
	errorMap.insert(errorVauleType(10,"空字符"));
	errorMap.insert(errorVauleType(11,"const, procedure,function,read,write后应为标识符"));
	errorMap.insert(errorVauleType(12,"标识符后应为‘:=’"));
	errorMap.insert(errorVauleType(13,"‘=’后应为数"));
	errorMap.insert(errorVauleType(14,"缺少‘,’或‘;’或‘:’"));
	errorMap.insert(errorVauleType(15,"缺少类型说明符"));
	errorMap.insert(errorVauleType(16,"缺少过程或函数名"));
	errorMap.insert(errorVauleType(17,"缺少‘)’"));
	errorMap.insert(errorVauleType(18,"缺少‘const’或‘var’或‘function’或‘procedure’"));
	errorMap.insert(errorVauleType(19,"缺少‘(’"));
	errorMap.insert(errorVauleType(20,"不可向非变量赋值"));
	errorMap.insert(errorVauleType(21,"未声明标识符"));
	errorMap.insert(errorVauleType(22,"write函数格式错误"));
	errorMap.insert(errorVauleType(23,"应为‘END’"));
	errorMap.insert(errorVauleType(24,"应为‘begin’"));
	errorMap.insert(errorVauleType(25,"过程或函数说明后符号不正确"));
	errorMap.insert(errorVauleType(26,"函数或过程首部后符号不正确"));
	errorMap.insert(errorVauleType(27,"表达式不能以此符号开始"));
	errorMap.insert(errorVauleType(28,"表达室内不能有过程调用"));
	errorMap.insert(errorVauleType(29,"因子后不能为此符号"));
	errorMap.insert(errorVauleType(30,"标识符重定义"));
	errorMap.insert(errorVauleType(32,"参数格式与声明不符"));
	errorMap.insert(errorVauleType(33,"非函数标识符"));
	errorMap.insert(errorVauleType(34,"非过程标识符"));
	errorMap.insert(errorVauleType(35,"非法的语句开始符号"));
	errorMap.insert(errorVauleType(36,"应为关系运算符"));
	errorMap.insert(errorVauleType(37,"‘for’后应为整形变量"));
	errorMap.insert(errorVauleType(38,"缺少‘to’"));
	errorMap.insert(errorVauleType(39,"缺少‘do’"));
	errorMap.insert(errorVauleType(40,"缺少‘then’"));
	errorMap.insert(errorVauleType(41,"字符串常量不能参加运算"));
	errorMap.insert(errorVauleType(53,"程序结尾应为‘.’"));
	errorMap.insert(errorVauleType(51,"应为赋值符号"));
	errorMap.insert(errorVauleType(52,"转换可能导致数据丢失"));
}

void Errors::addError(int errorCode)
{
	if(numOfErrors < MAX_ERROR_NUM)
	{
		ErrCodeLoc.push_back( errorInsert(errorCode, getLocation()) );
		numOfErrors++;
	}
}

bool Errors::display()
{
	bool flag = false;
	errcode_loc::iterator iter = ErrCodeLoc.begin();
	string temp;
	for( ; iter != ErrCodeLoc.end(); iter++ )
	{
		//string errorInfo;
		/*switch(iter->first) 
		{
		case 1:
			errorInfo = "超出最大位数值范围,应不大于2047";
			break;
		case 2:
			errorInfo = "数字位数超过允许位数限制,应不大于14位";
			break;
		case 3:
			errorInfo = "实数格式不正确,小数点后须紧跟数字";
			break;
		case 4:
			errorInfo = "无效的标识符";
			break;
		case 5:
			errorInfo = "标识符字符数超过限制,应不大于10位";
			break;
		}*/
		if(iter->first < 50)
		{
			cout<<"  error E"<<iter->first<<":\tline:"<<iter->second.first<<"\tcol:"<<iter->second.second<<":\t"<<errorMap[iter->first]<<endl;
			flag = true;	
		}
		else
			cout<<"warning W"<<iter->first<<":\tline:"<<iter->second.first<<"\tcol:"<<iter->second.second<<":\t"<<errorMap[iter->first]<<endl;
	}
	cout<<"totally "<<numOfErrors<<"error(s)"<<endl;

	return flag;
}

⌨️ 快捷键说明

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