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

📄 sallib.h

📁 用C++开发的编译程序
💻 H
字号:

#if !defined(_SALLIB_H_)
#define _SALLIB_H_

#include "linklib.h"
#include "iostream.h"

typedef struct
{
	int ID;
	char* Value;
} Vocable;

typedef struct 
{
	int sPos;
	int ePos;
	Vocable* Voc;
} ArrowyVocable;

Vocable Keywords[]=
{
	{0,"CONST"},
	{1,"VAR"},
	{2,"READ"},
	{3,"WRITE"},
	{4,","},
	{5,";"},
	{6,"="},
	{7,":="},
	{8,"+"},
	{9,"-"},
	{10,"*"},
	{11,"/"},
	{12,"("},
	{13,")"},
	{14,"<数值>"},
	{15,"<标识符>"}
};

void Error(int ErrCode,ArrowyVocable* av)
{
	CString tmp;
	tmp.Format("错误(%d,%d): ",av->sPos,av->ePos);
	switch(ErrCode)
	{
	case 0:
		tmp+="缺少';'\n";
		break;
	case 1:
		tmp+="保留字不能作为标识符\n";
		break;
	case 2:
		tmp+="缺少标识符\n";
		break;
	case 3:
		tmp+="标识符中含有非法字符\n";
		break;
	case 4:
		tmp+="错误的标识符\n";
		break;
	case 5:
		tmp+="标识符重定义\n";
		break;
	case 6:
		tmp+="缺少'='\n";
		break;
	case 7:
		tmp+="缺少赋值\n";
		break;
	case 8:
		tmp+="错误的赋值\n";
		break;
	case 9:
		tmp+="缺少'('\n";
		break;
	case 10:
		tmp+="缺少参数\n";
		break;
	case 11:
		tmp+="参数使用错误\n";
		break;
	case 12:
		tmp+="标识符未定义\n";
		break;
	case 13:
		tmp+="不能对常量使用READ\n";
		break;
	case 14:
		tmp+="缺少')'\n";
		break;
	case 15:
		tmp+="不能对常量赋值\n";
		break;
	case 16:
		tmp+="缺少':='\n";
		break;
	case 17:
		tmp+="表达式错误\n";
		break;
	case 18:
		tmp+="缺少表达式\n";
		break;
	default:
		tmp+="Unkown Error.\n";
	}
	cout<<tmp;
}

bool IsNumeral(char ch)
{
	return ch>='0'&&ch<='9';
}

bool IsNumeralString(CString str)
{
	int len=str.GetLength();
	for(int i=0;i<len;i++)
		if(!IsNumeral(str.GetAt(i)))
			return false;
	return true;
}

int ToInteger(CString str)
{
	int result=0;
	int n=0;
	int len=str.GetLength();
	for(int i=0;i<len;i++)
		result=result*10+str.GetAt(i)-'0';
	return result;
}

bool IsChar(char ch)
{
	return IsCharLower(ch)||IsCharUpper(ch);
}

int GetVocableID(CString str)
{
	for(int i=0;i<14;i++)
		if(str==Keywords[i].Value)
			return i;
	if(IsNumeralString(str))
		return 14;
	return 15;
}

bool ContainIllegalChar(CString str)
{
	int len=str.GetLength();
	for(int i=0;i<len;i++)
		if(GetVocableID(str.GetAt(i))>14&&!IsChar(str.GetAt(i)))
			return true;
	return false;
}

bool CanbeSymbol(CString str)
{
	int len=str.GetLength();
	if(len<1)
		return false;
	if(!IsChar(str.GetAt(0))&&!::IsCharUpper(str.GetAt(0)))
		return false;
	for(int i=1;i<len;i++)
		if(!IsChar(str.GetAt(i))&&!IsNumeral(str.GetAt(i)))
			return false;
	return GetVocableID(str)==15;
}

Vocable* FindDefined(LinkMan& SymLnk,CString SymName)
{
	Link* h=SymLnk.Head;
	while(h->Next)
	{
		Vocable* vt=(Vocable*)(h->Next->Data);
		if(vt)
			if(vt->Value)
				if(SymName.Compare(vt->Value)==0)
					return vt;
		h=h->Next;
	}
	return NULL;
}

#endif

⌨️ 快捷键说明

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