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

📄 sal.cpp

📁 用C++开发的编译程序
💻 CPP
字号:
// SAL.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "SAL.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include "sallib.h"

CWinApp theApp;

FILE* QuaFile;
FILE* SymFile;
int VocPos;
int t;
LinkMan Vocabulary;
LinkMan SymbolSet;

void LEX();
void YACC();
void P();
void P1();
void A();
void B();
void P2();
void F();
void P3();
CString G();
CString H();
CString I();
void Clear();

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	LEX();
	YACC();
	Clear();
	return 0;
}

void LEX()
{
	FILE* fo=fopen("_LEX.txt","w");
	ArrowyVocable* av=NULL;
	bool get_colon=false;
	bool get_end=false;
	CString word_tmp="";
	CString CodeString="";
	int word_pos=-1;
	int colon_pos=-1;
	cout<<"请输入源程序代码:\n";
	while(1)
	{
		char s[1024];
		cin>>s;
		CodeString+=s;
		CodeString+=" ";
		if(CodeString.Find("#")>-1)
		{
			CodeString=CodeString.Mid(0,CodeString.Find("#"));
			break;
		}
	}
	for(int i=0;i<CodeString.GetLength();i++)
	{
		char ch=CodeString.GetAt(i);
		if(GetVocableID(ch)<14||ch==' '||ch=='\t'||ch=='\n'||ch==':'||ch==13)
		{
			if(ch==':')
			{
				get_colon=true;
				if(colon_pos<0)
					colon_pos=i;
			}
			else 
			{
				if(word_tmp!="")
				{
					av=new ArrowyVocable;
					av->Voc=new Vocable;
					av->Voc->Value=new char[word_tmp.GetLength()+1];
					av->sPos=word_pos;
					if(get_colon)
						av->ePos=i-1;
					else
						av->ePos=i;
					av->Voc->ID=GetVocableID(word_tmp);
					strcpy(av->Voc->Value,word_tmp);
					Vocabulary.Add((void*)av,sizeof av);
					fprintf(fo,"(%i,%s)\n",av->Voc->ID,av->Voc->Value);
					word_tmp="";
					word_pos=-1;
				}
				if(GetVocableID(ch)<14)
				{
					av=new ArrowyVocable;
					av->Voc=new Vocable;
					if(get_colon&&ch=='=')
					{
						av->sPos=colon_pos;
						av->Voc->Value=new char[3];
						strcpy(av->Voc->Value,":=");
						get_colon=false;
						colon_pos=-1;
					}
					else
					{
						av->sPos=i;
						av->Voc->Value=new char[2];
						av->Voc->Value[0]=ch;
						av->Voc->Value[1]=NULL;
					}
					av->ePos=i+1;
					av->Voc->ID=GetVocableID(av->Voc->Value);
					Vocabulary.Add((void*)av,sizeof av);
					fprintf(fo,"(%i,%s)\n",av->Voc->ID,av->Voc->Value);
				}
			}

		}
		else
		{
			if(word_pos<0)
				word_pos=i;
			word_tmp+=ch;
		}
	}
	fclose(fo);
}

void YACC()
{
	SymFile=fopen("_Symbol.txt","w");
	QuaFile=fopen("_Quaternion.txt","w");
	VocPos=-1;
	t=-1;
	P();
	fclose(SymFile);
	fclose(QuaFile);
}

void P()
{
	P1();
	P2();
	P3();
	if(Vocabulary.GetAt(VocPos+1))
		P();
}

void P1()
{
	Link* tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
		return;
	ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=0)
		return;
	VocPos++;
	A();
	tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
	{
err_1:
		Error(0,av);
		return;
	}
	av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=5)
		goto err_1;
	VocPos++;
}

void A()
{
	B();
	Link* tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
		return;
	ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=4)
		return;
	VocPos++;
	A();
}

void B()
{
	Link* tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
		return;
	ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=15)
	{
		if(av->Voc->ID<4)
			Error(1,av);
		else if(av->Voc->ID!=14)
		{
			Error(2,av);
			return;
		}
	}
	if(!CanbeSymbol(av->Voc->Value))
	{
		if(ContainIllegalChar(av->Voc->Value))
			Error(3,av);
		else
			Error(4,av);
	}
	Vocable* vt;
	if(FindDefined(SymbolSet,av->Voc->Value))
	{
		vt=av->Voc;
		Error(5,av);
	}
	else
	{
		vt=new Vocable;
		vt->Value=new char[strlen(av->Voc->Value)+1];
		strcpy(vt->Value,av->Voc->Value);
		SymbolSet.Add((void*)vt,sizeof vt);
	}
	VocPos++;
	tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
	{
err_1:
		Error(6,av);
		return;
	}
	av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=6)
		goto err_1;
	VocPos++;
	tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
	{
err_2:
		Error(7,av);
		return;
	}
	av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID==4||av->Voc->ID==5)
		goto err_2;
	if(av->Voc->ID!=14)
		Error(8,av);
	vt->ID=ToInteger(av->Voc->Value);
	fprintf(SymFile,"CONST    %s    %s\n",vt->Value,av->Voc->Value);
	VocPos++;	
}

void P2()
{
	Link* tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
		return;
	ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=1)
		return;
	VocPos++;
	F();
	tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
	{
err_1:
		Error(0,av);
		return;
	}
	av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=5)
		goto err_1;
	VocPos++;
}

void F()
{
	Link* tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
		return;
	ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=15)
	{
		if(av->Voc->ID<4)
			Error(1,av);
		else if(av->Voc->ID!=14)
		{
			Error(2,av);
			return;
		}
	}
	if(!CanbeSymbol(av->Voc->Value))
	{
		if(ContainIllegalChar(av->Voc->Value))
			Error(3,av);
		else
			Error(4,av);
	}
	Vocable* vt;
	if(FindDefined(SymbolSet,av->Voc->Value))
	{
		vt=av->Voc;
		Error(5,av);
	}
	else
	{
		vt=new Vocable;
		vt->Value=new char[strlen(av->Voc->Value)+1];
		strcpy(vt->Value,av->Voc->Value);
		vt->ID=-1;
		SymbolSet.Add((void*)vt,sizeof vt);
	}
	fprintf(SymFile,"VAR         %s\n",vt->Value);
	VocPos++;
	tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
		return;
	av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID!=4)
		return;
	VocPos++;
	F();
}

void P3()
{
	Link* tmp=Vocabulary.GetAt(VocPos+1);
	if(!tmp)
		return;
	bool IsWrite=false;
	ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
	if(av->Voc->ID==2)
	{
do_read:
		VocPos++;
		tmp=Vocabulary.GetAt(VocPos+1);
		if(!tmp)
		{
			Error(9,av);
			return;
		}
		av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=12)
			Error(9,av);
		else
			VocPos++;
		tmp=Vocabulary.GetAt(VocPos+1);
		if(!tmp)
		{
			Error(10,av);
			return;
		}
		av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=15)
		{
			if(av->Voc->ID==13)
			{
				Error(10,av);
				VocPos--;
			}
			else
				Error(11,av);
		}
		else if(!FindDefined(SymbolSet,av->Voc->Value))
			Error(12,av);
		else 
		{	
			if(FindDefined(SymbolSet,av->Voc->Value)->ID>-1)
				if(!IsWrite)
					Error(13,av);
		}
		VocPos++;
		tmp=Vocabulary.GetAt(VocPos+1);
		if(!tmp)
		{
			Error(14,av);
			return;
		}
		av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=13)
			Error(14,av);
		else
			VocPos++;
		tmp=Vocabulary.GetAt(VocPos+1);
		if(!tmp)
		{
			Error(0,av);
			return;
		}
		av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=5)
			Error(0,av);
		else
			VocPos++;
	}
	else if(av->Voc->ID==3)
	{
		IsWrite=true;
		goto do_read;
	}
	else if(CanbeSymbol(av->Voc->Value))
	{
		if(!FindDefined(SymbolSet,av->Voc->Value))
			Error(12,av);
		else
		{
			if(FindDefined(SymbolSet,av->Voc->Value)->ID>-1)
				Error(15,av);
		}
		VocPos++;
		CString _Result=av->Voc->Value;
		tmp=Vocabulary.GetAt(VocPos+1);
		if(!tmp)
		{
			Error(16,av);
			return;
		}
		av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=7)
			Error(16,av);
		else
			VocPos++;
		CString Result_=G();
		fprintf(QuaFile,"(:=,%s,-,%s)\n\n",Result_,_Result);
		tmp=Vocabulary.GetAt(VocPos+1);
		if(!tmp)
		{
			Error(0,av);
			return;
		}
		av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=5)
			Error(0,av);
		else
			VocPos++;
		P3();
	}
	else
	{
		if(av->Voc->ID>1)
		{
			VocPos++;
			if(ContainIllegalChar(av->Voc->Value))
				Error(3,av);
			else
				Error(17,av);
		}
	}
}

CString G()
{
	CString _Result=H();
	while(1)
	{
		Link* tmp=(Link*)Vocabulary.GetAt(VocPos+1);
		if(!tmp)
			return _Result;
		ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=8&&av->Voc->ID!=9)
			return _Result;
		VocPos++;
		CString Result_=H();
		CString Result;
		Result.Format("\%%i",++t);
		fprintf(QuaFile,"(%s,%s,%s,%s)\n",av->Voc->Value,_Result,Result_,Result);
		_Result=Result;
	}
	return _Result;
}

CString H()
{
	CString _Result=I();
	while(1)
	{
		Link* tmp=(Link*)Vocabulary.GetAt(VocPos+1);
		if(!tmp)
			return _Result;
		ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=10&&av->Voc->ID!=11)
			return _Result;
		VocPos++;
		CString Result_=I();
		CString Result;
		Result.Format("\%%i",++t);
		fprintf(QuaFile,"(%s,%s,%s,%s)\n",av->Voc->Value,_Result,Result_,Result);
		_Result=Result;
	}
	return _Result;
}

CString I()
{
	CString Result="";
	Link* tmp=(Link*)Vocabulary.GetAt(VocPos+1);
	if(!tmp)
		return Result;
	ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
	VocPos++;
	if(av->Voc->ID==14)
		Result=av->Voc->Value;
	else if(av->Voc->ID==15)
	{
		if(ContainIllegalChar(av->Voc->Value))
			Error(3,av);
		else if(!CanbeSymbol(av->Voc->Value))
			Error(4,av);
		else if(!FindDefined(SymbolSet,av->Voc->Value))
			Error(12,av);
		Result=av->Voc->Value ;
	}
	else if(av->Voc->ID<4)
	{
		Error(1,av);
		Result=av->Voc->Value;
	}
	else if(av->Voc->ID==5)
		Error(18,av);
	else if(av->Voc->ID==4||av->Voc->ID==6||av->Voc->ID==7||av->Voc->ID==13)
		Error(17,av);
	else if(av->Voc->ID==12)
	{
		Result=G();
		tmp=(Link*)Vocabulary.GetAt(VocPos+1);
		if(!tmp)
		{
			Error(14,av);
			return Result;
		}
		av=(ArrowyVocable*)(tmp->Data);
		if(av->Voc->ID!=13)
			Error(14,av);
		VocPos++;
	}
	else
		Error(2,av);
	return Result;
}

void Clear()
{
	Link* tmp;
	Link* head=Vocabulary.Clear();
	while(head->Next)
	{
		tmp=head->Next;
		head->Next=tmp->Next;
		if(tmp)
		{
			ArrowyVocable* av=(ArrowyVocable*)(tmp->Data);
			if(av)
			{
				if(av->Voc)
				{
					if(av->Voc->Value)
						delete[] av->Voc->Value;
					delete av->Voc;
				}
				delete av;
			}
			delete tmp;
		}
	}
	if(head) 
		delete head;
	head=SymbolSet.Clear();
	while(head->Next)
	{
		tmp=head->Next;
		head->Next=tmp->Next;
		if(tmp)
		{
			Vocable* vt=(Vocable*)(tmp->Data);
			if(vt)
			{
				if(vt->Value)
					delete[] vt->Value;
				delete vt;
			}
			delete tmp;
		}
	}
	if(head)
		delete head;
}

⌨️ 快捷键说明

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