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

📄 error.cpp

📁 Win32 Console下C++实现的PL/0语言编译程序
💻 CPP
字号:
/*
FileName:		error.cpp
Author:			LiWen
Create:			2005-11-23
Last Modified:	2005-12-30
Discription:	错误处理模块
*/
#include "compiler.h"
/////////////////////////////////////////////////////////////////////////////
//由于一般情况下,后跟符号集不正确往往是由于前面的错误引起,只有在语法
//项目后的确多出一个无关符号才会仅其出错,故对于后跟符号集的错误,如果
//错误表里没有任何错误则加入报告,否则,不予报告。因为它给出的提示信息
//往往是比较模糊的,容易使用户感到困惑。相对于报告一堆经常多余的且含糊
//不清的错误报告,我们选择不理会他,但只有他时就显得很有必要了。
//

char errinfo[ERRMAXN][ERRMAXL];		//出错种类及提示信息
ERRT errlist[MAXERR];				//出错列表
int errp;							//出错列表指针

extern char word[];
extern char lastword[];
extern char cursym[];
extern int row;						//当前行
/*=======================================================
函数:report
参数:错误类型
描述:记录出错,以及出错位置当达到最大错误数时返回TMNT信号
返回:正常0,否则TMNT
========================================================*/
int report(ErrType type){
	char *str;
	int tch;
	if(errp>=MAXERR)
		return TMNT;
	if(type>=UNEXPECTED_STATEMENT_FOLLOW && type<= UNEXPECTED_FACTOR_FOLLOW && errp >0)
		return 0;
	if(type==EQL_IN_CONST_EXPECTING||type==NUM_IN_CONST_EXPECTING||type==MISSING_SEMICOLON_IN_PROC||type ==BECOMES_EXPECTING_IN_ASSIGN){
		str=lastword;
	}else if(type==RELATIONOPR_EXPECTING_IN_CDT){
		str=cursym;
	}else if(type==UNKNOWN_SYMBOL){
		tch = (int)cursym[0];
		tch &= 0x000000ff;
		sprintf(cursym,"%#X",tch);
		str = cursym;
	}else if(type==THEN_EXPECTING_IN_IF||type == DO_EXPECTING_IN_WHILE||IDENT_EXPECTING_IN_READ||(type>=UNEXPECTED_STATEMENT_FOLLOW && type<= UNEXPECTED_FACTOR_FOLLOW)){
		str = cursym;
	}else{
		str = word;
	}
	errlist[errp].type = type;
	errlist[errp].row = row;
	strcpy(errlist[errp].str,str);
	errp ++;
	return 0;
}

/*=======================================================
函数:errorinit
参数:无
描述:错误初始化,主要是错误表和errp
返回:无
========================================================*/
void errorinit(){
	errp = 0;
	strcpy(errinfo[UNEXPECTED_FILE_END],"不可预期的文件末尾!");
	strcpy(errinfo[UNEXPECTED_EXTERN_CODE],"程序末尾有多余代码!");
	strcpy(errinfo[TABLE_OVERFLOW],"代码中标识符过多,符号表溢出!");
	strcpy(errinfo[CODELIST_OVERFLOW],"代码过长,中间代码表溢出!");
	
	strcpy(errinfo[IDENT_TOO_LONG],"标识符%s过长!");
	strcpy(errinfo[NUM_TOO_BIG],"数字常量%s过大!");
	strcpy(errinfo[UNKNOWN_SYMBOL],"不可识别的符号%s!");
	
	strcpy(errinfo[IDENT_REDECLARED],"标识符%s重复声明!");
	strcpy(errinfo[IDENT_IN_CONST_EXPECTING],"常量%s的声明必须以标识符开始!");
	strcpy(errinfo[EQL_IN_CONST_EXPECTING],"常量%s的声明中间应该为'='符号!");
	strcpy(errinfo[NUM_IN_CONST_EXPECTING],"常量%s的声明的值必须是数字常量!");
	strcpy(errinfo[MISSING_SEMICOLON_IN_CONST],"常量声明末尾丢掉了';'!");

	strcpy(errinfo[IDENT_IN_VAR_EXPECTING],"变量必须为标识符!");
	strcpy(errinfo[MISSING_SEMICOLON_IN_VAR],"变量声明末尾丢掉了';'!");

	strcpy(errinfo[PROC_LEV_TOO_DEEP],"过程名必须为标识符(%s不是合法标识符)!");
	strcpy(errinfo[IDENT_IN_PROC_EXPECTING],"过程名必须为标识符(%s不是合法标识符)!");
	strcpy(errinfo[MISSING_SEMICOLON_IN_PROC],"过程%s声明末尾丢掉了';'!");
	strcpy(errinfo[MISSING_SEMICOLON_END_PROC],"过程定义末尾丢掉了';'!");

	strcpy(errinfo[UNEXPECTED_STATEMENT_BEGIN],"语句不应该以%s开始!");
	strcpy(errinfo[VAR_UNDECLARED],"未声明的变量%s!");
	strcpy(errinfo[PROC_UNDECLARED],"未声明的过程%s!");

	strcpy(errinfo[IDENT_CONST_IN_ASSIGN],"不可为常量%s赋值!");
	strcpy(errinfo[IDENT_PROC_IN_ASSIGN],"赋值语句左边不可为过程名%S!");
	strcpy(errinfo[BECOMES_EXPECTING_IN_ASSIGN],"%s的赋值语句中间应该为\":=\"!");
	strcpy(errinfo[MISSING_SEMICOLON_IN_STATEMENT],"语句末尾丢掉了';'符号!");

	strcpy(errinfo[THEN_EXPECTING_IN_IF],"if语句条件后面应该为then(而非%s)!");
	strcpy(errinfo[DO_EXPECTING_IN_WHILE],"while语句条件后面应该为do(而非%s)!");
	strcpy(errinfo[PROC_EXPECTING_IN_CALL],"call 后面必须是过程名(%s不是过程名)!");
	strcpy(errinfo[IDENT_CONST_IN_READ],"read 语句中不应有常量%s!");
	strcpy(errinfo[IDENT_PROC_IN_READ],"read 语句中不应有过程名%s!");
	strcpy(errinfo[KEYWORD_APPEAR_IN_READ],"read 语句中不应该出现关键字%s!");
	strcpy(errinfo[IDENT_EXPECTING_IN_READ],"read 语句中'('或者','后面应为变量(而非%s)!");
	strcpy(errinfo[IDENT_PROC_IN_EXP],"表达式中不因该出现过程名%s!");
	strcpy(errinfo[RELATIONOPR_EXPECTING_IN_CDT],"条件中不应出现非关系运算符%s!");

	strcpy(errinfo[MISSING_LPAREN],"丢掉了'('符号!");
	strcpy(errinfo[MISSING_RPAREN],"丢掉了')'符号或者与'('不匹配!");
	strcpy(errinfo[MISSING_END],"丢掉了end关键字或者与begin不匹配!");
	strcpy(errinfo[MISSING_PERIOD],"丢掉了'.'符号!");

	strcpy(errinfo[UNEXPECTED_STATEMENT_FOLLOW],"语句后的非法符号%s!");
	strcpy(errinfo[UNEXPECTED_CONST_FOLLOW],"常量声明后的非法符号%s!");
	strcpy(errinfo[UNEXPECTED_VAR_FOLLOW],"变量声明后的非法符号%s!");
	strcpy(errinfo[UNEXPECTED_PROCDECL_FOLLOW],"过程声明后的非法符号%s!");
	strcpy(errinfo[UNEXPECTED_PROCBODY_FOLLOW],"过程定义后的非法符号%s!");
	strcpy(errinfo[UNEXPECTED_FACTOR_FOLLOW],"因子后的非法符号!%s");
	strcpy(errinfo[UNEXPECTED_CDT_FOLLOW],"条件后的非法符号!%s");
}

⌨️ 快捷键说明

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