?? sentencecompile.h
字號:
|
7000 if 7011 expression 7012 then 7013 body 7014 else 7015 body 7016
|
7000 read 7017 ( 7018 ids_list 7019 ) 7020
|
7000 write 7021 ( 7022 simple_list 7023 ) 7024
7001 -> 除"("、assignop外 -> StateIndex--, Check(State[StateIndex],7)
7002
7022 -> 129 -> StateIndex++, State[StateIndex]= 11000
124
122
119
120
121
7004
7006
7010
7016
7020
7024 -> 任意 -> StateIndex--, Check(State[StateIndex],7)
7005 -> 129 -> StateIndex++, State[StateIndex]= 12000
124
122
119
120
121
7007
7011 -> 129 -> StateIndex++, State[StateIndex]= 10000
124
122
119
120
121
7013
7015
7009 -> 102
124
107
110
112
113 -> StateIndex++, State[StateIndex]= 6000
7018 -> 124 -> StateIndex++, State[StateIndex]= 9000
7000->7001: Copying=true;fout<<CurrentLine<<" "<<Parament;
7000->7021: Copying=true;fout<<CurrentLine<<" "<<Parament;
7001 -> 除"("、assignop外 ->Copying=false;fout<<" ;"<<endl;
7004 -> xxxx:Copying=false;fout<<" ;"<<endl;
7006 -> xxxx:Copying=false;fout<<" ;"<<endl;
7024 -> xxxx:Copying=false;fout<<" ;"<<endl;
8 id_list -> 8000 id 8001
|
8000 id 8001 , 8002 id_list 8003
8002 -> 123 -> StateIndex++, State[StateIndex]= 8000
8001 ->除了','外 -> StateIndex--, Check(State[StateIndex],8)
8000->8001: HaveCount++;
VariantIndex++;
VariantType[]=100;等待回填類型信息
VariantBelong[]=Parament*100+HaveCount; parament與SubCount的區別是前者會回到0
8000->8001: if(!Copying) {fout<<CurrentLine<<" "<<Parament<<" ids "<<Value<<endl;}
9 ids_list -> 9000 ids 9001
|
9000 ids 9001 , 9002 ids_list 9003
9002 -> 124 -> StateIndex++, State[StateIndex]= 9000
9001 ->除了','外 -> StateIndex--, Check(State[StateIndex],9)
10 expression -> 10000 simple 10001 relop 10002 simple 10003
10000->
10002-> 129 -> StateIndex++, State[StateIndex]= 12000
124
122
119
120
121
10003-> 任意 -> StateIndex--, Check(State[StateIndex],10)
10000->12000: Copying=true;fout<<CurrentLine<<Parament<<" simple ";
10002->12000: fout<<" simple "<<Parament;
10003->xxxxx: Copying=false;fout<<" ;"<<endl;
11 simple_list -> 11000 simple 11001
|
11000 simple 11001 , 11002 simple_list 11003
11000->129 -> StateIndex++, State[StateIndex]= 12000
124
122
119
120
121
11001->除了','外 -> StateIndex--, Check(State[StateIndex],11)
11002->129 -> StateIndex++, State[StateIndex]= 11000
124
122
119
120
121
11003-> 任意 -> StateIndex--, Check(State[StateIndex],11)
12 simple ->12000 factor 12001
|
12000 factor 12001 op 12002 simple 12003
12001->除了op外
12000
12002->129 -> StateIndex++, State[StateIndex]= 12000 *
124
122
119
120
121
12003 任意 -> StateIndex--, Check(State[StateIndex],12)
13 factor -> 13000 ids 13001
|
13000 ids 13001 ( 13002 simple_list 13003 ) 13004
|
13000 number 13005
|
13000 not 13006 factor 13007
|
13000 true 13008
|
13000 false 13009
|
13000 ( 13010 simple 13011 ) 13012
13002-> 129 -> StateIndex++, State[StateIndex]= 11000
124
122
119
120
121
13006-> 124 -> StateIndex++, State[StateIndex]= 13000
122
119
120
121
13001->除了'('外-> StateIndex--, Check(State[StateIndex],12)
13004
13005
13007
13008
13009-> 任意 -> StateIndex--, Check(State[StateIndex],12)
13000->13001: fout<<Parament<<" "<<NextWord<<" "<<Value<<endl;
******************************************************************************************/
class sentenceCompile
{
private:
char Errors[20][256]; //記錄了各種錯誤信息,并以下標為錯誤標號
int Error_Type; //記錄當前錯誤的標號
int Error_Count; //記錄當前所發生的錯誤數量
char NextWord[256]; //記錄下一個詞
int Next; //記錄下一個詞的編碼
int VariantCount; //記錄變量的總個數
int VariantIndex; //指向變量表頭的指針
int Temp; //暫時記錄子過程的編號數
int SubCount; //子過程的計數
int HaveCount; //參數計數
int Parament; //當前所在的過程編號
int TypeNeed; //所需要回填的變量類型
int VariantKind[100]; //變量所屬
int VariantType[100]; //變量類型
char VariantName[100][256]; //變量名稱
int VariantHave[100]; //變量所包含的參數個數
int VariantBelong[100]; //記錄下每個變量的信息
double Value; //記錄下終結符的值
bool Copying; //判斷當前是否處于將代碼復制到目標文件的狀態
int CurrentLine; //記錄當前行號
int State[100]; //這里的狀態機是按堆棧設計的
//每當根據非終結符進行移進時就狀態進棧,歸約時出棧
int StateIndex; //指向棧頂端的指針
char ExpectedWord[256]; //發現錯誤時將希望得到的詞記錄
ifstream fin;
ifstream fintable;
ofstream fout;
ofstream fouttable; //定義文件的讀寫指針
protected:
void Initialize(); //語法分析器的初始化
void DefineErrors(); //錯誤信息的初始化
void CatchErrors(int num); //獲取錯誤信息
void Coding(); //將NextWord轉化為Next代碼
int Check(int next); //核心部分:狀態轉移模塊
void ReadTable(); //讀取變量表信息
public:
int Compile(char* filename); //主體部分
};
void sentenceCompile::ReadTable() //首先讀取原變量表中的信息
{
int temp;
fintable.open("wordtable1.txt");
VariantCount=0; //記錄了所有變量的總編號
VariantIndex=0; //記錄了函數和過程的編號
while(fintable>>temp)
{
VariantCount++;
VariantKind[VariantCount]=temp;
fintable>>VariantName[VariantCount];
if(VariantKind[VariantCount]==910)
VariantKind[VariantCount]=990;
}
}
void sentenceCompile::Initialize() //初始化
{
CurrentLine=1;
Error_Type=0;
Error_Count=0;
ReadTable();
fin.open("words.txt");
fout.open("sentence.txt");
fouttable.open("wordtable2.txt"); //文件讀寫的準備
//for(int i=1;i<=VariantCount;i++)
// cout<<VariantKind[i]<<" "<<VariantName[i]<<endl;
StateIndex=0;
State[0]=1000;
VariantIndex=0;
SubCount=0;
Copying=false;
}
void sentenceCompile::DefineErrors()
/*
寫入各種詞法分析的錯誤信息
*/
{
strcpy(Errors[0],"syntax error"); //語法的錯誤
}
void sentenceCompile::CatchErrors(int num)
/*
輸出錯誤的類型
*/
{
Error_Count++;
if(num==1)
{
strcpy(Errors[1],ExpectedWord); //缺少應該有的詞
strcat(Errors[1]," expected.");
}
cout<<"Errors ("<<Error_Count<<") : "<<Errors[num]<<" at line: "<<CurrentLine<<endl;
}
void sentenceCompile::Coding()
{
if(strcmp(NextWord,"program")==0) Next=101;
if(strcmp(NextWord,"begin")==0) Next=102;
if(strcmp(NextWord,"end")==0) Next=103;
if(strcmp(NextWord,"def")==0) Next=104;
if(strcmp(NextWord,"function")==0) Next=105;
if(strcmp(NextWord,"procedure")==0) Next=106;
if(strcmp(NextWord,"if")==0) Next=107;
if(strcmp(NextWord,"then")==0) Next=108;
if(strcmp(NextWord,"else")==0) Next=109;
if(strcmp(NextWord,"while")==0) Next=110;
if(strcmp(NextWord,"do")==0) Next=111;
if(strcmp(NextWord,"read")==0) Next=112;
if(strcmp(NextWord,"write")==0) Next=113;
if(strcmp(NextWord,"array")==0) Next=114;
if(strcmp(NextWord,"record")==0) Next=115;
if(strcmp(NextWord,"of")==0) Next=116;
if(strcmp(NextWord,"or")==0) Next=117;
if(strcmp(NextWord,"and")==0) Next=118;
if(strcmp(NextWord,"not")==0) Next=119;
if(strcmp(NextWord,"true")==0) Next=120;
if(strcmp(NextWord,"false")==0) Next=121;
if(strcmp(NextWord,"number")==0) Next=122;
if(strcmp(NextWord,"id")==0) Next=123;
if(strcmp(NextWord,"ids")==0) Next=124;
if(strcmp(NextWord,"op")==0) Next=125;
if(strcmp(NextWord,"relop")==0) Next=126;
if(strcmp(NextWord,":")==0) Next=127;
if(strcmp(NextWord,";")==0) Next=128;
if(strcmp(NextWord,"(")==0) Next=129;
if(strcmp(NextWord,")")==0) Next=130;
if(strcmp(NextWord,"[")==0) Next=131;
if(strcmp(NextWord,"]")==0) Next=132;
if(strcmp(NextWord,".")==0) Next=133;
if(strcmp(NextWord,",")==0) Next=134;
if(strcmp(NextWord,"var")==0) Next=135;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -