?? sal.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 + -