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

📄 error.cpp

📁 Cool语言编译器
💻 CPP
字号:
////////////////////////////////////////////
//                                        //
//    Error.cpp                           //
//    错误处理模块                        //
//    接受系统错误报告并屏幕反馈给用户    //
//    最后更新时间:2004年4月23日11:33    //
//                                        //
////////////////////////////////////////////



#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>

#include "Window.h"
#include "Error.h"

extern Window winEdit;

void ShowError
	(
	const ErrorType ErrorCode,	// 错误类型代码
	const int LineNo,			// 发生错误的行号
	const char Extra[MaxY]		// 附加信息,变量、标识符等
	)
{
	char strTemp[MaxY];
	char Message[MaxY];

	// 置错误代码
	Error = ErrorCode;

	if (NoShown)
	{
		// 不显示错误模式

		return;
	}

	switch (ErrorCode)
	{
	case ErrorOpening:
		// 打开文件错误

		strcpy(Message, "Opening file error!");
		break;
	case ErrorSaving:
		// 存储文件错误

		strcpy(Message, "Saving file error!");
		break;
	case ErrorNoFreeMemoryInEdit:
		// 在编辑状态下无可用内存报告

		strcpy(Message, "No free memory. Reduce your codes.");
		break;
	case ErrorTooLong:
		// 不能再添加新的行

		strcpy(Message, "Cannot add a new line.");
		break;
	case ErrorPrint:
		// 打印错误

		strcpy(Message, "Print error.");
		break;
	case ErrorNoFreeMemoryInRun:
		// 在运行状态下无可用内存报告

		strcpy(Message, "No free memory. Reduce your variables.");
		break;



	case ErrorUnwantedPart:
		// 语句后面有多余部分

		strcpy(Message, "Unwanted tail after line");
		break;
	case ErrorVar:
		// 非法的变量名

		strcpy(Message, "Invalid variable name");
		break;

	case ErrorMissingAS:
		// 缺少关键字AS

		strcpy(Message, "Missing AS after variable");
		break;
	case ErrorMissingVarType:
		// 缺少变量类型

		strcpy(Message, "Missing variable type");
		break;
	case ErrorMissingArraySize:
		// 缺少数组大小

		strcpy(Message, "Missing array range size");
		break;



	case ErrorExpression:
		// 表达式错误

		strcpy(Message, "Error in expression");
		break;
	case ErrorMissingExpression:
		// 缺少表达式

		strcpy(Message, "Missing expression");
		break;

	case ErrorPrintSeparate:
		// 非法的分隔符

		strcpy(Message, "Invalid separate symbol");
		break;
	case ErrorQuotation:
		// 字符串后缺少双引号

		strcpy(Message, "Missing '\"' after string");
		break;



	case ErrorMustInteger:
		// 循环变量必须为整数

		sprintf(Message, "Must use integer variable '%s'", Extra);
		break;
	case ErrorUnmatchForVar:
		// NEXT后的循环变量不匹配

		sprintf(Message, "Unmatch loop variable '%s' after 'NEXT'", Extra);
		break;
	case ErrorMissingForVarGiveValue:
		// FOR语句中缺少赋值语句

		strcpy(Message, "Missing giving value to variable");
		break;
	case ErrorMissingTO:
		// FOR语句中缺少TO

		strcpy(Message, "Missing 'TO'");
		break;
	case ErrorMissingSTEP:
		// FOR语句中缺少STEP

		strcpy(Message, "Missing 'STEP'");
		break;
	case ErrorMissingNEXT:
		// 缺少NEXT

		strcpy(Message, "Missing 'NEXT' in program.");
		break;
	case ErrorUnwantedNEXT:
		// 多余的NEXT语句

		strcpy(Message, "Unwanted 'NEXT'");
		break;
	case ErrorUnwantedCONTINUE:
		// 多余的CONTINUE语句

		strcpy(Message, "Unwanted 'CONTINUE'");
		break;
	case ErrorUnwantedBREAK:
		// 多余BREAK语句

		strcpy(Message, "Unwanted 'BREAK'");
		break;
	case ErrorMoreFor:
		// 太多的FOR语句

		strcpy(Message, "Too many loops in program");
		break;
	case ErrorMoreNestFor:
		// 太多的循环嵌套哦

		strcpy(Message, "Too many nested loops in program");
		break;



	case ErrorMissingTHEN:
		// 缺少THEN

		strcpy(Message, "Missing 'THEN' or having unwanted tail");
		break;
	case ErrorMissingENDIF:
		// 缺少ENDIF

		strcpy(Message, "Missing 'END IF' in program.");
		break;
	case ErrorBool:
		// 布尔表达式错误

		strcpy(Message, "Boolean expression error");
		break;
	case ErrorUnwantedELSE:
		// 多余的ELSE

		strcpy(Message, "Unwanted 'ELSE'");
		break;
	case ErrorUnwantedENDIF:
		// 多余的ENDIF

		strcpy(Message, "Unwanted 'END IF'");
		break;
	case ErrorMoreIf:
		// 太多的IF语句

		strcpy(Message, "Too many 'IF' in program.");
		break;
	case ErrorMoreNestIf:
		// 太多的IF嵌套

		strcpy(Message, "Too many nested 'IF' in program.");
		break;



	case ErrorSubName:
		// 错误的过程名

		strcpy(Message, "Sub name error");
		break;
	case ErrorMissingSubName:
		// 缺少过程名

		strcpy(Message, "Missing sub name");
		break;
	case ErrorMissingENDSUB:
		// 缺少ENDSUB

		strcpy(Message, "Missing 'END SUB' in program.");
		break;
	case ErrorUnwantedENDSUB:
		// 多余的END SUB

		strcpy(Message, "Unwanted 'END SUB'");
		break;
	case ErrorUnwantedRETURN:
		// 多余的RETURN语句

		strcpy(Message, "Unwanted 'RETURN'");
		break;
	case ErrorMoreSub:
		// 太多的过程

		strcpy(Message, "Too many sub in program");
		break;
	case ErrorNoSuchSub:
		// 无法找到此过程

		sprintf(Message, "Can not find such sub '%s'", Extra);
		break;
	case ErrorSubPosition:
		// 过程内不得再定义过程

		strcpy(Message, "Sub position error");
		break;



	case ErrorMissingRange:
		// 数组变量中缺少下标

		strcpy(Message, "Missing range in array variable");
		break;
	case ErrorUnwantedComma:
		// 多余的逗号

		strcpy(Message, "Unwanted comma here");
		break;
	case ErrorRangeOverflow:
		// 数组下标溢出

		strcpy(Message, "Array variable range overflow");
		break;



	case ErrorLocatePara:
		// LOCATE参数个数错误

		strcpy(Message, "The bumber of locate parameter error");
		break;
	case ErrorCoordinate:
		// LOCATE语句中坐标错误

		strcpy(Message, "Coordinate in locate is wrong");
		break;



	case ErrorUndefined:
		// 变量未定义

		sprintf(Message, "Undefined variable '%s'", Extra);
		break;



	case ErrorDim:
		// 数组维数不匹配

		sprintf(Message, "Array dimension not match on '%s'", Extra);
		break;
	case ErrorMissingBracketInArray:
		// 数组使用时缺少右括号

		sprintf(Message, "Missing ')' at array variable %s", Extra);
		break;
	case ErrorMissingSubscript:
		// 数组缺少下标

		sprintf(Message, "Missing range subscript");
		break;



	case ErrorMissingVar:
		// 缺少变量

		strcpy(Message, "Missing variable name");
		break;



	case ErrorCannotDelArray:
		// 不能删除数组变量的某个元素

		strcpy(Message, "Can not delete array element");
		break;



	case ErrorDelayTime:
		// 延迟时间错误

		strcpy(Message, "Time of delay error");
		break;



	case ErrorRND:
		// RND参数错误

		strcpy(Message, "RND parameter error");
		break;



	case ErrorZeroDivision:
		// 零做除数

		strcpy(Message, "Divided by zero");
		break;



	case ErrorSyntax:
		// 语法错误

		strcpy(Message, "Syntax error");
		break;



	case ErrorMissingParameter:
		// 在函数后面缺少参数

		strcpy(Message, "Missing parameter after function");
		break;



	case ErrorInput:
		// 输入错误

		strcpy(Message, "Input not match");
		break;



	case ErrorSerious:
		strcpy(Message, Extra);
		exit(0);

	default:
		printf("No error message, add it. %d", Error);
		int Key;
		Receive(Key);
		break;
	}

	// 警报
	Sound();

	// 得到最终显示信息
	char Mess[MaxY] = "";
	if (LineNo > -1)
	{
		sprintf(Mess, "%s at line %d", Message, LineNo + 1);
	}
	else
	{
		sprintf(Mess, " %s ", Message);
	}

	if (LineNo > -1)
	{
		// 有附带行号信息

		puttext(1, 1, 80, 25, TextMirror);

		// 设置错误行为当前行
		TextX = LineNo;
		TextY = LengthOf(TextX);

		if (LineNo < x0 || LineNo >= x0 + winEdit.High())
		{
			// 超处当前屏

			x0 = LineNo;
			PrintText(winEdit.Top() + 1);
		}

		// 计算光标位置
		NowX = LineNo - x0 + winEdit.Top() + 1;
		NowY = winEdit.Left() + TextY + 1;

		ShowPosition();

		// 滚动垂直滚动条
		winEdit.ScrollVertical(TextX);
	}

	// 显示错误窗口
	int Len = strlen(Mess);
	Window Error(6, (76 - Len) / 2 + 2, 10, (76 - Len) / 2 + Len + 5, true, false);
	char ErrorTitle[15] = "";
	sprintf(ErrorTitle, "Error %d#", ErrorCode);
	Error.SetTitle(ErrorTitle);
	Error.SetColor(WHITE, LIGHTGRAY, RED, LIGHTGRAY);
	Error.Add(Mess);
	Error.Show();
	Error.Wait();
	Error.Hide();
}

⌨️ 快捷键说明

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