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

📄 common.cpp~1~

📁 Cool语言编译器
💻 CPP~1~
📖 第 1 页 / 共 2 页
字号:
	// 计算数组某元素的具体位置

	// 位置
	int Return = 0;

	for (int i = 0; i < pThis->TotDim; i++)
	{
		if (Dim[i] > pThis->Dim[i])
		{
			// 下标溢出

			ShowError(ErrorRangeOverflow, RunLineNo);
			return 0;
		}

		// 累加位置
		Return += (Dim[i] - 1) * pThis->Coefficient[i];
	}

	// 返回位置
	return Return;
}

int LengthOf(const int LineNo)
{
	// 返回文本行的长度,不包括末尾的空格

	// 长度值先在末尾
	int Len = strlen(Text[LineNo]->Line) - 1;

	while (Len >= 0 && Text[LineNo]->Line[Len] == ' ')
	{
		// 若为空格则向前退

		Len--;
	}

	// 返回长度
	return Len + 1;
}

int HeadOf(const int LineNo)
{
	// 返回文本行的开始位置,不包括首空格

	// 首位置
	int i = 0;

	// 文本行的长度
	int Len = LengthOf(LineNo);

	while (i < Len && Text[LineNo]->Line[i] == ' ')
	{
		// 若为空格则向后推

		i++;
	}

	// 返回位置
	return i;
}

void NewLine()
{
	// 申请新的文本行

	// 修改最大可用文本行序号
	TotRoomLine++;

	if (TotRoomLine >= MaxX)
	{
		// 程序太长
		ShowError(ErrorTooLong);
		return;
	}

	// 申请新的文本行
	Text[TotRoomLine] = new LineType;

	if (Text[TotRoomLine] == NULL)
	{
		// 无剩余内存

		// 显示错误并返回
		ShowError(ErrorNoFreeMemoryInEdit);
		return;
	}

	// 对新的文本行进行初始化
	Text[TotRoomLine]->Mark = false;
	Text[TotRoomLine]->Break = false;
	Text[TotRoomLine]->Line[0] = '\0';
	Text[TotRoomLine]->Sign[0] = '\0';

	for (int i = 0; i < MaxY - 1; i++)
	{
		strcat(Text[TotRoomLine]->Line, " ");
		strcat(Text[TotRoomLine]->Sign, " ");
	}
}

void DelLine()
{
	// 删除最后一行文本

	delete Text[TotRoomLine];
	TotRoomLine--;
}

void PrePaint
	(
	const int LineNo,		// 待处理的文本行序号
	char *ReturnSign		// 返回的着色特征串
	)
{
	// 返回着色特征字符串

	// 存储待处理的文本行内容
	char Source[MaxY] = "";

	// 存储单词
	char Word[MaxY] = "";

	// 返回特征串清空
	ReturnSign[0] = '\0';

	// 得到待处理的字符串
	strcpy(Source, Text[LineNo]->Line);

	// 清除尾部空格
	ClearTailBlank(Source);

	if (Source[0] == '\0')
	{
		// 当前行为空行

		while(strlen(ReturnSign) < MaxY - 1)
		{
			// 全部为空格

			strcat(ReturnSign, SignSpace);
		}

		return;
	}

	// 先加入缩进
	int i = 0;
	while(Source[i] == ' ')
	{
		strcat(ReturnSign, SignSpace);
		i++;
	}

	// 取文本行的长度
	int Len = strlen(Source);

	// 锁标志,在字符串处理中使用
	bool Lock = false;

	// 存储关键字的全大写形式
	char WordUpcase[MaxY];

	for (; i <= Len; i++)
	{
		if (Source[i] == '"')
		{
			// 锁标志反转

			Lock = true + false - Lock;
		}

		if (Lock)
		{
			// 当前是字符串的开始引号位置

			if (Word[0] != '\0')
			{
				// 有单词需要处理

				strcpy(WordUpcase, Word);
				strupr(WordUpcase);
				DealWordSign(Word, WordUpcase, ReturnSign);
			}

			// 加入字符串特征符
			strcat(ReturnSign, SignString);

			continue;
		}
		else if (Source[i] == '"')
		{
			// 当前是字符串的结束引号位置

			strcat(ReturnSign, SignString);
			continue;
		}

		if (i == Len)
		{
			// 字符串已扫描完毕

			if (Word[0] != '\0')
			{
				// 处理单词

				strcpy(WordUpcase, Word);
				strupr(WordUpcase);
				DealWordSign(Word, WordUpcase, ReturnSign);
			}
		}
		else if (!Lock && IsSymbol(Source[i]))
		{
			// 非字符串内,且为符号

			if (Word[0] != '\0')
			{
				// 处理单词

				strcpy(WordUpcase, Word);
				strupr(WordUpcase);
				DealWordSign(Word, WordUpcase, ReturnSign);
			}

			// 添加符号特征符
			strcat(ReturnSign, SignSymbol);
		}
		else if (Source[i] == ' ')
		{
			// 当前字符是空格

			if (Word[0] != '\0')
			{
				// 处理单词

				strcpy(WordUpcase, Word);
				strupr(WordUpcase);

				if (strcmp(WordUpcase, "REM") == 0)
				{
					// 前一个单词是REM

					// 加入关键字的3个特征符
					strcat(ReturnSign, SignKeyWord);
					strcat(ReturnSign, SignKeyWord);
					strcat(ReturnSign, SignKeyWord);

					// 加入空格的特征符
					strcat(ReturnSign, SignSpace);

					// 后面的全部添加注释特征符
					for (int j = i; j < Len; j++)
					{
						strcat(ReturnSign, SignREM);
					}

					break;
				}

				// 否则处理单词
				DealWordSign(Word, WordUpcase, ReturnSign);
			}

			// 添加空格特征符
			strcat(ReturnSign, SignSpace);
		}
		else
		{
			// 否则将当前位添加入单词

			strcat(Word, " ");
			Word[strlen(Word) - 1] = Source[i];
		}
	}

	// 在末尾填充空格
	while(strlen(ReturnSign) < MaxY - 1)
	{
		strcat(ReturnSign, SignSpace);
	}
}

void DealWordSign
	(
	char *strWord,			// 原单词
	char *strUpcase,		// 全大写形式
	char *ReturnSign		// 返回特征符字符串
	)
{
	// 处理单词

	// 记录保留字序号
	int WordValue = -1;

	if (isalpha(strWord[0]))
	{
		// 第一个是字母才有可能是关键字

		for (int k = 0; k < TotKeyWord; k++)
		{
			if (strcmp(KeyWord[k], strUpcase) == 0)
			{
				// 找到关键字匹配

				WordValue = k;
				break;
			}
		}
	}

	// 暂存最后加入的特征符
	char strSign[2];
	double Temp;

	if (WordValue >= 0)
	{
		// 是关键字

		strcpy(strSign, SignKeyWord);
	}
	else if (IsNumber(strWord, Temp))
	{
		// 是数字

		strcpy(strSign, SignNumber);
	}
	else
	{
		// 是标识符

		strcpy(strSign, SignVar);
	}

	// 加入特征符
	for (int j = 0; j < strlen(strWord); j++)
	{
		strcat(ReturnSign, strSign);
	}

	// 单词清空
	strWord[0] = '\0';
}

int NextLine(const int LineNo)
{
	// 返回当前行(含)以后的应该执行的行号
	// 即越过空行和注释行

	// 行号循环变量
	int i = LineNo;

	// 语句行的第一个关键字
	char Cmd[MaxY];

	// 得到语句行的第一个关键字
	GetPart(Text[i]->Line, 1, ' ', Cmd);

	while (i <= EndLine && (LengthOf(i) == 0 || strcmp(Cmd, "REM") == 0))
	{
		// 当前行是空行或是注释行,应当越过

		// 继续下一行
		i++;
		GetPart(Text[i]->Line, 1, ' ', Cmd);
	}

	if (i > EndLine)
	{
		// 已经没有下一行

		// 设置完成标志
		Finished = true;

		return -1;
	}

	// 返回行号
	return i;
}

bool IsNumber
	(
	const char strExp[MaxY],	// 源字符串
	double &Value				// 若是数字,返回它的值
	)
{
	// 判断字符串是否为数字

	char *endptr;

	Value = strtod(strExp, &endptr);
	return *endptr == NULL;
}

bool IsSymbol(const char Chr)
{
	// 判断字符是否为符号

	return (bool)strchr(Symbol, Chr);
}

bool IsSeparator(const char Chr)
{
	// 判断是否为分隔符

	return IsSymbol(Chr) || Chr == ' ' || Chr == '"';
}

bool IsIndent(const int LineNo)
{
	// 判断第LineNo行文本的下一行是否需要自动向里缩进一个Tab

	// 存储关键字
	char Word[MaxY];

	// 取LineNo行文本的第一部分
	GetPart(Text[LineNo]->Line, 1, ' ', Word);

	// 变为大写
	strupr(Word);

	// 关键字为下列情况则需要自动缩进:
	// FOR、IF、ELSE、SUB
	
	return 
		(
		strcmp(Word, "FOR") == 0 ||
		strcmp(Word, "IF") == 0 ||
		strcmp(Word, "ELSE") == 0 ||
		strcmp(Word, "SUB") == 0
		);
}

bool IsFileName(const char Name[MaxLenOfFileName])
{
	// 判断文件名是否合法

	for (int i = 0; i < strlen(Name); i++)
	{
		if (!isalpha(Name[i]) && !isdigit(Name[i]) && !strchr("-_~", Name[i]))
		{
			return false;
		}
	}

	return true;
}

⌨️ 快捷键说明

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