编译原理课设之简单编译器实现
来源:互联网 发布:sybase恢复数据库 编辑:程序博客网 时间:2024/06/06 08:48
转自:http://blog.csdn.net/u012480599/article/details/50435472
能够实现基本C文法,条件语句、循环语句、数组、函数等,目标代码为80X86汇编,可通过汇编。详情见编译原理课设实验报告。
Preset.h
#ifndef PRESET_H_INCLUDED#define PRESET_H_INCLUDED#include <iostream>#include <string>#include <cstdio>#include <vector>#include <cmath>#include <cstdlib>#include <stack>#include <sstream>using namespace std;/*lexical analysis*/enum Tag{ NUM=256,REAL,ID,AND,OR,EQ,NE,GE,LE,STR,TYPE,KEY,THEN,ELSE,IFEND,WHILE,DO,WHEND,FOR,FOR_CHECK,FOR_DO,FOR_JUMP,FOR_END,CONTINUE,BREAK,RET,SSP,SPP,CALL,RETAX,RETT,FUN_S,FUN_E};string Tag_Str[]={ "NUM","REAL","ID","AND","OR","EQ","NE","GE","LE","STR","TYPE","KEY","THEN","ELSE","IFEND","WHILE","DO","WHEND","FOR","FOR_C","FOR_D","FOR_J","FOR_E","CON","BRE","RET","SSP","SPP","CALL","RETAX","RETT","FUN_S","FUN_E"};#define NUM_SIZE 2#define REAL_SIZE 8#define CHAR_SIZE 1const int k_w_len=8;const int t_w_len=4;string keywords[k_w_len]={"if","else","for","while","do","break","continue","return"};string typewords[t_w_len]={"int","real","char","const"};vector<string> idwords;vector<string> strwords;class Token{ private: int tag; public: Token(){} Token(int i) { tag=i; } int get_tag() { return tag; } virtual int get_numvalue(){} virtual double get_realvalue(){} virtual int get_lexeme(){} virtual string get_lexeme_str(){}};class Num: public Token{ private: int value; public: Num(int t,int v):Token(t),value(v){}; int get_numvalue() { return value; }};class Real: public Token{ private: double value; public: Real(int t,double v):Token(t),value(v){}; double get_realvalue() { return value; }};class Word: public Token{ private: int lexeme; public: Word(int t,int v):Token(t),lexeme(v){}; int get_lexeme() { return lexeme; } string get_lexeme_str() { if((this->get_tag())==ID) return idwords[lexeme]; else if((this->get_tag())==TYPE) return typewords[lexeme]; else if((this->get_tag())==KEY) return keywords[lexeme]; else return strwords[lexeme]; }};string symbols=",;+-*/(){}[]^?:!~";int get_keyindex(string a);int get_typeindex(string a);int get_idindex(string a);int get_strindex(string a);bool isletter(char c);bool isdigit(char c);bool issymbol(char c);void show_Token_List();bool lexical_error=false;string error_message="";string buffer="";string tmp="";vector<Token*> Token_List;/* 递归子程序语法分析*/bool synax_error=false;bool semantic_error=false;void Semantic_Error(string msg);//符号表设计int curpid;struct Synb{ int tid;//token_index int typ; /* i r c a 1 2 3 4 */ int cat; /* c v f 1 2 3 */ int addr; int pid; Synb(int tid) { this->tid=tid; this->pid=curpid; this->typ=this->cat=this->addr=0; }};int Data_Size(int typ);vector<Synb> Synbl;int Tid_To_Sid(int tid);vector<double> Consl;int Vall=0;struct Typeu{ int typ; vector<int> Tlen; /*eg: itp len1 len2 ... */ Typeu(int typ) { this->typ=typ; }};vector<Typeu> Typel;struct Declar_Unit{ int tid; vector<int> Array_Len_List; Declar_Unit(int tid) { this->tid=tid; } void Declar_Unit_Push(int len) { this->Array_Len_List.push_back(len); }};//四元式结构定义struct Node{ int Ein; // 0: empty 1:identifier 2:num 3:arr 4.ret 5.fun int Addr; int Size; double Num; string Name;};// function liststruct Pfinf{ int Size; Node Ret;};vector<Pfinf> Pfinfl;int mainpid;void Synbl_Push_Name(int tid);void Synbl_Push(Declar_Unit du,int typ,bool cat,bool arr,double val); //typ:Type_Op cat:Const_Type_Op arr:Array_Opint Synbl_Push_Fun_Typ(int tid,int typ);void Synbl_Push_Fun_Size(int tid,int Size);bool Const_Type_Op=false;int Type_Op;int Fun_Type_Op;bool Array_Op=false;bool Ret_Op=false;void Show_Synbl();void Semantic_Error(string msg);stack<Node> Sem;stack<int> Syn;Node Tid_To_Node(int tid);Node Num_To_Node(int num);struct Middle_Code_Unit{ int Operator;// Node Target1;//为零表示空 Node Target2;//为零表示为空 Node Result;//为零表示为空,为-1表示此处为跳转地址};Middle_Code_Unit Get_Ssp(int pid);Middle_Code_Unit Get_Spp();Middle_Code_Unit Call(int tid);Middle_Code_Unit Fun_Start(int tid);Middle_Code_Unit Fun_End(int tid);Middle_Code_Unit Get_Retax(Node node);Middle_Code_Unit Get_Ret();Middle_Code_Unit Get_Rett(int typ);vector<Middle_Code_Unit> Middle_Code;void Show_Middle_Code();vector< vector< Middle_Code_Unit> > Block;/*翻译文法*///动作函数声明void init();void Pop_Sem();void Pop_Syn();void Push_Sem(int tid);void Push_Syn(int op);void Quat();void Quat_a();//array address transfromvoid Unary_Quat();void Assign();//if elsevoid Genth();void Genel();void Genie();//whilevoid Genwh();void Gendo();void Genwe();//forvoid Genfr();void Genfc();void Genfd();void Genfj();void Genfe();void Continue();void Break();int Tid_To_Sid(int tid);Node Num_To_Node(int num);Node Tid_To_Node(int tid);//by 何雪int Token_List_Index;void Conditional_Expression();void Constant_Expression();void Logical_Or_Expression();void Expression();void Logical_And_Expression();void Inclusive_Or_Expression();void Exclusive_Or_Expression();void And_Expression();void Equality_Expression();void Relational_Expression();void Additive_Expression();void Multiplicative_Expression();void Unary_Expression();void Primary_Expression();void Assignment_Expression();//double Constant();double Real_Constant();int Integer_Constant();//by 王千阁int TokenList_Index;void Assignment_Operator();void Unary_Operator();void Type_Name();int Type_Specifier();Declar_Unit Declarator();void Declaration();void Init_Declarator();void Initializer();void Initializer_List();void Initializer_End();void Compound_Statement();void Statement();void Expression_Statement();void Selection_Statement();void Iteration_Statement();void Jump_Statement();//void Return_Statement();void Oringinal_Statements();int Function_Call_Expression();/*目标代码声明*/int acc;int acc_k;int ii,jj;string Temp_Op;void Basic_Block_Partition();string num2str(double t){ stringstream ss; ss<<t; return ss.str();}static int Label_Index=0;string Final_Label;static vector<string>Label;static vector<string>For_Label;static vector<string>For_Do_Label;struct Final_Code_Unit{ int Label_Index; string Op; string Dst; string Sour;};static vector<Final_Code_Unit>Final_Code;void Condition_Check_Final_Code(Node t);Final_Code_Unit t,t1,t2;void Send_To_Acc();void Load1_To_Ax();void Load2_To_Ax();void TempOp1();void TempOp2();void BackEnd();#endif // PRESET_H_INCLUDED
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
main.c
#include "Preset.h"int main(){ freopen("test.in","r",stdin); freopen("Lexical.c","w",stdout); while(getline(cin,tmp)) { buffer=buffer+tmp+"\n"; } cout<<buffer<<endl; int buffer_size=buffer.length(); int lexemeBegin=0,forword=0; while(lexemeBegin<buffer_size&&!lexical_error) { char c=buffer[forword]; //cout<<"c=="<<c<<endl; while(c==' '||c=='\n'||c=='\t') { forword++; lexemeBegin++; if(forword>=buffer_size||lexemeBegin>=buffer_size) break; c=buffer[forword]; } if(c=='<'||c=='>'||c=='='||c=='!') { forword++; if(forword<buffer_size&&buffer[forword]=='=') { switch (c) { case '<': Token_List.push_back(new Token(LE)); break; case '>': Token_List.push_back(new Token(GE)); break; case '!': Token_List.push_back(new Token(NE)); break; case '=': Token_List.push_back(new Token(EQ)); break; } forword++; lexemeBegin+=2; } else { Token_List.push_back(new Token(c)); lexemeBegin++; } } else if(isletter(c)) { while(true) { forword++; if(forword>=buffer_size) break; c=buffer[forword]; if(!(isletter(c)||isdigit(c))) break; } //cout<<"tokenlis push back="<<buffer.substr(lexemeBegin,forword-lexemeBegin)<<endl; //cout<<"now buffer[forword] is "<<buffer[forword]<<endl; string tmp=buffer.substr(lexemeBegin,forword-lexemeBegin); int index=get_keyindex(tmp); if(index!=-1) Token_List.push_back(new Word(KEY,index)); else { index=get_typeindex(tmp); if(index!=-1) Token_List.push_back(new Word(TYPE,index)); else { Token_List.push_back(new Word(ID,get_idindex(tmp))); //Synbl_Push_Name(Token_List.size()-1); } } lexemeBegin=forword; } else if(isdigit(c)) { //number //cout<<"number="<<c<<endl; bool endofinput=false; double ans=c-'0'; while(true) { forword++; if(forword>=buffer_size) { endofinput=true; break; } c=buffer[forword]; if(!isdigit(c)) break; ans=ans*10+c-'0'; } if(endofinput) { Token_List.push_back(new Num(NUM,ans)); lexemeBegin=forword; } else { if(c=='.') { forword++; if(forword>=buffer_size||!isdigit(buffer[forword])) lexical_error=true; else { double w=10; ans+=(buffer[forword]-'0')/w; while(true) { forword++; w*=10; if(forword>=buffer_size) { endofinput=true; break; } c=buffer[forword]; if(!isdigit(c)) break; ans=ans+(c-'0')/w; } if(endofinput) { Token_List.push_back(new Real(REAL,ans)); lexemeBegin=forword; } else { if(c=='e'||c=='E') { double ord=0; forword++; if(forword>=buffer_size) { lexical_error=true; } else { c=buffer[forword]; bool ispos=true; if(c=='+'||c=='-') { if(c=='-') ispos=false; forword++; if(forword>=buffer_size||!isdigit(buffer[forword])) lexical_error=true; else { c=buffer[forword]; ord=c-'0'; } } else if(!isdigit(c)) { lexical_error=true; } else { ord=c-'0'; } if(!lexical_error) { while(true) { forword++; if(forword>=buffer_size) break; c=buffer[forword]; if(!isdigit(c)) break; ord=ord*10+c-'0'; } if(!ispos) ord=-ord; ans=ans*pow(10,ord); Token_List.push_back(new Real(REAL,ans)); lexemeBegin=forword; } } } else { Token_List.push_back(new Real(REAL,ans)); lexemeBegin=forword; } } } } else if(c=='e'||c=='E') { double ord=0; forword++; if(forword>=buffer_size) { lexical_error=true; } else { c=buffer[forword]; bool ispos=true; if(c=='+'||c=='-') { if(c=='-') ispos=false; forword++; if(forword>=buffer_size||!isdigit(buffer[forword])) lexical_error=true; else { c=buffer[forword]; ord=c-'0'; } } else if(!isdigit(c)) { lexical_error=true; } else { ord=c-'0'; } if(!lexical_error) { while(true) { forword++; if(forword>=buffer_size) break; c=buffer[forword]; if(!isdigit(c)) break; ord=ord*10+c-'0'; } if(!ispos) ord=-ord; ans=ans*pow(10,ord); Token_List.push_back(new Real(REAL,ans)); lexemeBegin=forword; } } } else { Token_List.push_back(new Num(NUM,int(ans))); lexemeBegin=forword; } } } else if(c=='\'') { if((forword+2>=buffer_size)||(buffer[forword+2]!='\'')) { lexical_error=true; } else { Token_List.push_back(new Num(NUM,buffer[forword+1])); forword+=3; lexemeBegin+=3; } } else if(c=='"') { do { forword++; if(forword>=buffer_size) { lexical_error=true; break; } c=buffer[forword]; }while(buffer[forword]!='"'); if(!lexical_error) { Token_List.push_back(new Word(STR,get_strindex(buffer.substr(lexemeBegin+1,forword-lexemeBegin-1)))); forword++; lexemeBegin=forword; } } else if(issymbol(c)) { Token_List.push_back(new Token(c)); forword++; lexemeBegin++; } else if(c=='&') { if((forword+1>=buffer_size)||(buffer[forword+1]!='&')) { Token_List.push_back(new Token(c)); forword++; lexemeBegin++; } else { Token_List.push_back(new Token(AND)); forword+=2; lexemeBegin+=2; } } else if(c=='|') { if((forword+1>=buffer_size)||(buffer[forword+1]!='|')) { Token_List.push_back(new Token(c)); forword++; lexemeBegin++; } else { Token_List.push_back(new Token(OR)); forword+=2; lexemeBegin+=2; } } } if(lexical_error) { error_message="Lexical analysis error!"; cout<<error_message<<endl; } else { show_Token_List(); cout<<"Lexical analysis accepted!"<<endl; //语法分析开始 error_message="Synax analysis error!"; Token_List_Index=0; /* Init */ init(); for(int i=0;i<=3;i++) Typel.push_back(Typeu(i)); //Compound_Statement(); Oringinal_Statements(); if(synax_error) { cout<<error_message<<endl; } else { cout<<"Synax analysis and Semantic analysis accepted!"<<endl; freopen("Synbl.c","w",stdout); Show_Synbl(); Show_Middle_Code(); freopen("Target.c","w",stdout); Basic_Block_Partition(); BackEnd(); } } return 0;}int get_keyindex(string a){ for(int i=0;i<k_w_len;i++) { if(keywords[i]==a) return i; } return -1;}int get_typeindex(string a){ for(int i=0;i<t_w_len;i++) { if(typewords[i]==a) return i; } return -1;}int get_idindex(string a){ int len=idwords.size(); for(int i=0;i<len;i++) { if(idwords[i]==a) return i; } idwords.push_back(a); return len;}int get_strindex(string a){ int len=strwords.size(); for(int i=0;i<len;i++) { if(strwords[i]==a) return i; } strwords.push_back(a); return len;}bool isletter(char c){ if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c=='_')) return true; else return false;}bool isdigit(char c){ if(c>='0'&&c<='9') return true; else return false;}bool issymbol(char c){ for(int i=0;i<symbols.length();i++) { if(c==symbols[i]) return true; } return false;}void show_Token_List(){ int len=Token_List.size(); for(int i=0;i<len;i++) { int tmp=Token_List[i]->get_tag(); cout<<tmp<<"\t"; if(tmp<NUM) { cout<<char(tmp)<<endl; } else if(tmp==NUM) { cout<<Token_List[i]->get_numvalue()<<endl; } else if(tmp==REAL) { cout<<Token_List[i]->get_realvalue()<<endl; } else if(tmp==ID||tmp==STR||tmp==KEY||tmp==TYPE) { cout<<Token_List[i]->get_lexeme_str()<<endl; } else cout<<endl; }}int Data_Size(int typ){ if(typ==1) return NUM_SIZE; else if(typ==2) return REAL_SIZE; else if(typ==3) return CHAR_SIZE; else return 0;}void Synbl_Push_Name(int tid){ for(int i=0;i<Synbl.size();i++) { if(Token_List[Synbl[i].tid]->get_lexeme_str()==Token_List[tid]->get_lexeme_str()&&Synbl[i].pid==curpid) return; } Synbl.push_back(Synb(tid)); return ;}void Synbl_Push(Declar_Unit du,int typ,bool cat,bool arr,double val) //typ:Type_Op cat:Const_Type_Op arr:Array_Op{ int tid=du.tid; for(int i=0;i<Synbl.size();i++) { if((Token_List[Synbl[i].tid]->get_lexeme_str()==Token_List[tid]->get_lexeme_str())&&Synbl[i].pid==curpid) { if(Synbl[i].typ!=0) { Semantic_Error("Variable redeclation confict!"); } else { Synbl[i].pid=curpid; if(arr) { Synbl[i].cat=2; Synbl[i].typ=Typel.size(); Typel.push_back(Typeu(4)); Typel[Synbl[i].typ].Tlen.push_back(typ); int sum=1; for(int k=0;k<du.Array_Len_List.size();k++) { sum*=du.Array_Len_List[k]; Typel[Synbl[i].typ].Tlen.push_back(du.Array_Len_List[k]); } Synbl[i].addr=Vall; Vall+=sum*Data_Size(typ); } else { Synbl[i].typ=typ; if(cat) { Synbl[i].cat=1; Synbl[i].addr=Consl.size(); Consl.push_back(val); } else { Synbl[i].cat=2; Synbl[i].addr=Vall; Vall+=Data_Size(typ); } } } return ; } }}int Synbl_Push_Fun_Typ(int tid,int typ){ for(int i=0;i<Synbl.size();i++) { if(Token_List[Synbl[i].tid]->get_lexeme_str()==Token_List[tid]->get_lexeme_str()) { if(Synbl[i].cat!=0) { Semantic_Error("Function redeclation confict!"); } else { Synbl[i].cat=3; Synbl[i].tid=tid; Synbl[i].typ=typ; Synbl[i].pid=-1; Synbl[i].addr=Pfinfl.size(); Pfinfl.push_back(Pfinf()); return Synbl[i].addr; } } }}void Synbl_Push_Fun_Size(int tid,int Size){ for(int i=0;i<Synbl.size();i++) { if(Token_List[Synbl[i].tid]->get_lexeme_str()==Token_List[tid]->get_lexeme_str()) { Pfinfl[Synbl[i].addr].Size=Size; return ; } }}void Show_Synbl(){ cout<<"Synbl:"<<endl; cout<<"name\ttyp\tcat\taddr\tpid\n"; for(int i=0;i<Synbl.size();i++) { cout<<Token_List[Synbl[i].tid]->get_lexeme_str(); cout<<"\t"<<Synbl[i].typ<<"\t"<<Synbl[i].cat<<"\t"<<Synbl[i].addr<<"\t"<<Synbl[i].pid<<endl; }}void Semantic_Error(string msg){ semantic_error=true; error_message=msg; cout<<error_message<<endl; exit(0);}Middle_Code_Unit Get_Ssp(int pid){ Middle_Code_Unit tmp; //PUSH SP ADD SP, VALL tmp.Operator=SSP; tmp.Target1.Ein=2; tmp.Target1.Addr=pid; tmp.Target1.Size=NUM_SIZE; tmp.Target2.Ein=0; tmp.Result.Ein=0; return tmp;}Middle_Code_Unit Get_Spp(){ Middle_Code_Unit tmp; tmp.Operator=SPP; //POP SP tmp.Target1.Ein=0; tmp.Target2.Ein=0; tmp.Result.Ein=0; return tmp;}Middle_Code_Unit Call(int tid){ Middle_Code_Unit tmp; tmp.Operator=CALL; tmp.Target1.Ein=5; tmp.Target1.Name=Token_List[tid]->get_lexeme_str(); tmp.Target2.Ein=0; tmp.Result.Ein=0; return tmp;}Middle_Code_Unit Fun_Start(int tid){ Middle_Code_Unit tmp; tmp.Operator=FUN_S; tmp.Target1.Ein=5; tmp.Target1.Name=Token_List[tid]->get_lexeme_str(); tmp.Target2.Ein=0; tmp.Result.Ein=0; return tmp;}Middle_Code_Unit Fun_End(int tid){ Middle_Code_Unit tmp; tmp.Operator=FUN_E; tmp.Target1.Ein=5; tmp.Target1.Name=Token_List[tid]->get_lexeme_str(); tmp.Target2.Ein=0; tmp.Result.Ein=0; return tmp;}Middle_Code_Unit Get_Retax(Node node){ Middle_Code_Unit tmp; tmp.Operator=RETAX; //MOV AX,[] tmp.Target1=node; tmp.Target2.Ein=0; tmp.Result.Ein=0; return tmp;}Middle_Code_Unit Get_Ret(){ Middle_Code_Unit tmp; tmp.Operator=RET; //RET tmp.Target1.Ein=0; tmp.Target2.Ein=0; tmp.Result.Ein=0; return tmp;}Middle_Code_Unit Get_Rett(int typ){ Middle_Code_Unit tmp; tmp.Operator=RETT; //MOV [],AX tmp.Target1.Ein=1; tmp.Target1.Size=Data_Size(typ); tmp.Target1.Addr=Vall; Vall+=tmp.Target1.Size; Sem.push(tmp.Target1); tmp.Target2.Ein=0; tmp.Result.Ein=0; return tmp;}void Show_Middle_Code(){ cout<<"Middle Code List:"<<endl; for(int i=0;i<Middle_Code.size();i++) { if(Middle_Code[i].Operator<256) { printf("%c",Middle_Code[i].Operator); } else { cout<<Tag_Str[Middle_Code[i].Operator-256]; } cout<<"\t"; if(Middle_Code[i].Target1.Ein==0) { cout<<" "; } else if(Middle_Code[i].Target1.Ein==1) { cout<<"["<<Middle_Code[i].Target1.Addr<<"]"; } else if(Middle_Code[i].Target1.Ein==2) { if(Middle_Code[i].Target1.Size<REAL_SIZE) printf("%d",int(Middle_Code[i].Target1.Num)); else printf("%.2f",Middle_Code[i].Target1.Num); } else if(Middle_Code[i].Target1.Ein==3) { cout<<"[["<<Middle_Code[i].Target1.Addr<<"]]"; } else { cout<<Middle_Code[i].Target1.Name; } cout<<"\t"; if(Middle_Code[i].Target2.Ein==0) { cout<<" "; } else if(Middle_Code[i].Target2.Ein==1) { cout<<"["<<Middle_Code[i].Target2.Addr<<"]"; } else if(Middle_Code[i].Target2.Ein==2) { if(Middle_Code[i].Target2.Size<REAL_SIZE) printf("%d",int(Middle_Code[i].Target2.Num)); else printf("%.2f",Middle_Code[i].Target2.Num); } else { cout<<"[["<<Middle_Code[i].Target2.Addr<<"]]"; } cout<<"\t"; if(Middle_Code[i].Result.Ein==0) { cout<<" "; } else if(Middle_Code[i].Result.Ein==1) { cout<<"["<<Middle_Code[i].Result.Addr<<"]"; } else if(Middle_Code[i].Result.Ein==2) { if(Middle_Code[i].Result.Size<REAL_SIZE) printf("%d",int(Middle_Code[i].Result.Num)); else printf("%.2f",Middle_Code[i].Result.Num); } else { cout<<"[["<<Middle_Code[i].Result.Addr<<"]]"; } cout<<endl; }}int Tid_To_Sid(int tid){ for(int i=0;i<Synbl.size();i++) { if(Token_List[tid]->get_lexeme_str()==Token_List[Synbl[i].tid]->get_lexeme_str()) { return i; } } return -1;}Node Num_To_Node(int num){ Node node; node.Ein=2; node.Size=NUM_SIZE; node.Num=num; return node;}Node Tid_To_Node(int tid){ Node node; if(Token_List[tid]->get_tag()==NUM) { node.Ein=2; node.Num=Token_List[tid]->get_numvalue(); node.Size=NUM_SIZE; } else if(Token_List[tid]->get_tag()==REAL) { node.Ein=2; node.Num=Token_List[tid]->get_realvalue(); node.Size=REAL_SIZE; } else if(Token_List[tid]->get_tag()==ID) { bool is_found=false; for(int i=0;i<Synbl.size();i++) { if(Token_List[tid]->get_lexeme_str()==Token_List[Synbl[i].tid]->get_lexeme_str()) { if(Synbl[i].typ>=4) { ///数组 node.Size=Data_Size(Typel[Synbl[i].typ].Tlen[0]); node.Ein=2; node.Num=Synbl[i].addr; } else { node.Size=Data_Size(Synbl[i].typ); if(Synbl[i].cat==1) { node.Ein=2; node.Num=Consl[Synbl[i].addr]; } else { node.Ein=1; node.Addr=Synbl[i].addr; } } is_found=true; } } if(!is_found) Semantic_Error("Variable was not declared."); } return node;}void init(){ while(!Sem.empty()) Pop_Sem(); while(!Syn.empty()) Syn.pop();}void Pop_Sem(){ //cout<<"pop sem"<<endl; Sem.pop();}void Pop_Syn(){ //cout<<"pop syn"<<endl; Syn.pop();}void Push_Sem(int tid){ //cout<<"push sem"<<endl; Sem.push(Tid_To_Node(tid));}void Push_Syn(int op){ //cout<<"push syn"<<endl; Syn.push(op);}void Quat(){ Middle_Code_Unit T; T.Operator=Syn.top(); Pop_Syn(); T.Target2=Sem.top(); Pop_Sem(); T.Target1=Sem.top(); Pop_Sem(); T.Result=Node(); T.Result.Ein=1; T.Result.Addr=Vall; T.Result.Size=max(T.Target1.Size,T.Target2.Size); Vall+=T.Result.Size; Sem.push(T.Result); Middle_Code.push_back(T);}void Quat_a(){ Middle_Code_Unit T; T.Operator=Syn.top(); Pop_Syn(); T.Target2=Sem.top(); Pop_Sem(); T.Target1=Sem.top(); Pop_Sem(); T.Result=Node(); T.Result.Ein=1; T.Result.Addr=Vall; T.Result.Size=max(T.Target1.Size,T.Target2.Size); Vall+=T.Result.Size; Middle_Code.push_back(T); T.Result.Ein=3; Sem.push(T.Result);}void Unary_Quat(){ Middle_Code_Unit T; T.Operator=Syn.top(); Pop_Syn(); T.Target1=Sem.top(); Pop_Sem(); T.Result=Node(); T.Result.Ein=1; T.Result.Addr=Vall; T.Result.Size=T.Target1.Size; Vall+=T.Result.Size; Sem.push(T.Result); T.Target2=Node(); T.Target2.Ein=0; Middle_Code.push_back(T);}void Assign(){ Middle_Code_Unit T; T.Operator=Syn.top(); Pop_Syn(); T.Target1=Sem.top(); Pop_Sem(); T.Result=Sem.top(); Pop_Sem(); T.Target2=Node(); T.Target2.Ein=0; if(T.Result.Size<T.Target1.Size) { //Show_Synbl(); //cout<<T.Result.Size<<T.Target1.Size<<endl; Semantic_Error("Type mismatch in assign expression!"); } if(T.Result.Ein==0||T.Result.Ein==2) { Semantic_Error("Left value error!"); } Middle_Code.push_back(T);}//if elsevoid Genth(){ Middle_Code_Unit T; T.Operator=THEN; T.Target1=Sem.top(); Pop_Sem(); T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Genel(){ Middle_Code_Unit T; T.Operator=ELSE; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Genie(){ Middle_Code_Unit T; T.Operator=IFEND; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}//whilevoid Genwh(){ Middle_Code_Unit T; T.Operator=WHILE; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Gendo(){ Middle_Code_Unit T; T.Operator=DO; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Genwe(){ Middle_Code_Unit T; T.Operator=WHEND; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}//forvoid Genfr(){ Middle_Code_Unit T; T.Operator=FOR; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Genfc(){ Middle_Code_Unit T; T.Operator=FOR_CHECK; T.Target1=Sem.top(); Pop_Sem(); T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Genfd(){ Middle_Code_Unit T; T.Operator=FOR_DO; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Genfj(){ Middle_Code_Unit T; T.Operator=FOR_JUMP; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Genfe(){ Middle_Code_Unit T; T.Operator=FOR_END; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Continue(){ Middle_Code_Unit T; T.Operator=CONTINUE; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}void Break(){ Middle_Code_Unit T; T.Operator=BREAK; T.Target1=Node(); T.Target1.Ein=0; T.Target2=Node(); T.Target2.Ein=0; T.Result=Node(); T.Result.Ein=0; Middle_Code.push_back(T);}int Identifier() { if(Token_List[Token_List_Index]->get_tag()!=ID) synax_error=true; Token_List_Index++; return Token_List_Index-1; }void Constant_Expression(){ Conditional_Expression();}void Conditional_Expression(){ Logical_Or_Expression(); while(Token_List[Token_List_Index]->get_tag()=='?') { Token_List_Index++; Genth(); Expression(); if(Token_List[Token_List_Index]->get_tag()==':') { Token_List_Index++; Genel(); Conditional_Expression(); Genie(); } else synax_error=true; }}void Logical_Or_Expression(){ Logical_And_Expression(); while(Token_List[Token_List_Index]->get_tag()==OR) { Push_Syn(OR); Token_List_Index++; Logical_And_Expression(); Quat(); }}void Logical_And_Expression(){ Inclusive_Or_Expression(); while(Token_List[Token_List_Index]->get_tag()==AND) { Push_Syn(AND); Token_List_Index++; Inclusive_Or_Expression(); Quat(); }}void Inclusive_Or_Expression(){ Exclusive_Or_Expression(); while(Token_List[Token_List_Index]->get_tag()=='|') { Push_Syn('|'); Token_List_Index++; Exclusive_Or_Expression(); Quat(); }}void Exclusive_Or_Expression(){ And_Expression(); while(Token_List[Token_List_Index]->get_tag()=='^') { Push_Syn('^'); Token_List_Index++; And_Expression(); Quat(); }}void And_Expression(){ Equality_Expression(); while(Token_List[Token_List_Index]->get_tag()=='&') { Push_Syn('&'); Token_List_Index++; Equality_Expression(); Quat(); }}void Equality_Expression(){ Relational_Expression(); while(Token_List[Token_List_Index]->get_tag()==EQ || Token_List[Token_List_Index]->get_tag()==NE) { Push_Syn(Token_List[Token_List_Index]->get_tag()); Token_List_Index++; Relational_Expression(); Quat(); }}void Relational_Expression(){ Additive_Expression(); while(Token_List[Token_List_Index]->get_tag()==LE || Token_List[Token_List_Index]->get_tag()==GE || Token_List[Token_List_Index]->get_tag()=='>' || Token_List[Token_List_Index]->get_tag()=='<') { Push_Syn(Token_List[Token_List_Index]->get_tag()); Token_List_Index++; Additive_Expression(); Quat(); }}void Additive_Expression(){ Multiplicative_Expression(); while(Token_List[Token_List_Index]->get_tag()=='+' || Token_List[Token_List_Index]->get_tag()=='-') { Push_Syn(Token_List[Token_List_Index]->get_tag()); Token_List_Index++; Multiplicative_Expression(); Quat(); }}void Multiplicative_Expression(){ Unary_Expression(); while(Token_List[Token_List_Index]->get_tag()=='*' || Token_List[Token_List_Index]->get_tag()=='/' || Token_List[Token_List_Index]->get_tag()=='%') { Push_Syn(Token_List[Token_List_Index]->get_tag()); Token_List_Index++; Unary_Expression(); Quat(); }}void Unary_Expression(){ if(Token_List[Token_List_Index]->get_tag()=='-' || Token_List[Token_List_Index]->get_tag()=='~' || Token_List[Token_List_Index]->get_tag()=='!') { Push_Syn(Token_List[Token_List_Index]->get_tag()); Unary_Operator(); Unary_Expression(); Unary_Quat(); } else if(Token_List[Token_List_Index]->get_tag()=='(') { Token_List_Index++; Constant_Expression(); if(Token_List[Token_List_Index]->get_tag()==')') Token_List_Index++; else synax_error=true; } else if(Token_List[Token_List_Index]->get_tag()==ID) { if(Token_List_Index+1==Token_List.size()) { synax_error=true; } else if(Token_List[Token_List_Index+1]->get_tag()=='(') { int typ=Function_Call_Expression(); Middle_Code.push_back(Get_Rett(typ)); } else { Primary_Expression(); } } else { Constant(); }}void Primary_Expression(){ if(Token_List[Token_List_Index]->get_tag()==ID) { Push_Sem(Token_List_Index); Token_List_Index++; if(Token_List[Token_List_Index]->get_tag()=='[') { int sid=Tid_To_Sid(Token_List_Index-1); if(sid==-1) Semantic_Error("Variable was not declared."); int tpid=Synbl[sid].typ; bool first_level=true; int k=2; while(Token_List[Token_List_Index]->get_tag()=='[') { Push_Syn('+'); Token_List_Index++; Constant_Expression(); if(first_level) first_level=false; else Quat(); if(Token_List[Token_List_Index]->get_tag()==']') { Token_List_Index++; if(k<Typel[tpid].Tlen.size()) { Push_Syn('*'); Sem.push(Num_To_Node(Typel[tpid].Tlen[k])); k++; } if(k!=Typel[tpid].Tlen.size()) Quat(); else { Push_Syn('*'); Sem.push(Num_To_Node(4)); Quat(); Quat_a(); } } else synax_error=true; } if(k!=Typel[tpid].Tlen.size()) Semantic_Error("Array's dimension mismatch!"); } }}double Constant(){ if(Token_List[Token_List_Index]->get_tag()==NUM ) return Integer_Constant(); else return Real_Constant();}int Integer_Constant(){ if(Token_List[Token_List_Index]->get_tag()!=NUM) synax_error=true; Push_Sem(Token_List_Index); Token_List_Index++; return Token_List[Token_List_Index-1]->get_numvalue();}double Real_Constant(){ if(Token_List[Token_List_Index]->get_tag()!=REAL) synax_error=true; Push_Sem(Token_List_Index); Token_List_Index++; return Token_List[Token_List_Index-1]->get_realvalue();}void Assignment_Expression(){ Primary_Expression(); Assignment_Operator(); Constant_Expression(); Assign();}void Expression(){ Assignment_Expression(); while(Token_List[Token_List_Index]->get_tag()==',') { Token_List_Index++; Assignment_Expression(); }}void Assignment_Operator(){ if (Token_List[Token_List_Index]->get_tag()=='=') { Push_Syn('='); Token_List_Index++; } else { synax_error=true; }}void Unary_Operator(){ if (Token_List[Token_List_Index]->get_tag()=='-') Token_List_Index++; else if (Token_List[Token_List_Index]->get_tag()=='~') Token_List_Index++; else if (Token_List[Token_List_Index]->get_tag()=='!') Token_List_Index++; else { synax_error=true; }}void Type_Name(){ if (Token_List[Token_List_Index]->get_tag()==TYPE&&Token_List[Token_List_Index]->get_lexeme_str()=="const") { Const_Type_Op=true; Token_List_Index++; Type_Specifier(); } else { Type_Specifier(); }}int Type_Specifier(){ if (Token_List[Token_List_Index]->get_lexeme_str()=="int") { Token_List_Index++; Type_Op=1; } else if (Token_List[Token_List_Index]->get_lexeme_str()=="real") { Token_List_Index++; Type_Op=2; } else if (Token_List[Token_List_Index]->get_lexeme_str()=="char") { Token_List_Index++; Type_Op=3; } else { synax_error=true; } return Type_Op;}Declar_Unit Declarator(){ Declar_Unit du(Identifier()); if(Const_Type_Op&&Token_List[Token_List_Index]->get_tag()=='[') { Semantic_Error("const array is not allowed!"); } while (Token_List[Token_List_Index]->get_tag()=='[') { Token_List_Index++; Array_Op=true; du.Declar_Unit_Push(Integer_Constant()); if (Token_List[Token_List_Index]->get_tag()==']') Token_List_Index++; else { synax_error=true; } } return du;}void Declaration(){ Type_Name(); Init_Declarator(); while (Token_List[Token_List_Index]->get_tag()==',') { Token_List_Index++; Init_Declarator(); } Const_Type_Op=false; if(Token_List[Token_List_Index]->get_tag()!=';') synax_error=true; else Token_List_Index++;}void Init_Declarator(){ bool is_assign=false; Declar_Unit du=Declarator(); if(Const_Type_Op&&Token_List[Token_List_Index]->get_tag()!='=') { Semantic_Error("const init-declarator needs initializer."); } if(Array_Op&&Token_List[Token_List_Index]->get_tag()=='=') { Semantic_Error("array init-declarator has no initializer."); } double val; if (Token_List[Token_List_Index]->get_tag()=='=') { Token_List_Index++; val=Constant(); is_assign=true; //Initializer(); } Synbl_Push_Name(du.tid); Synbl_Push(du,Type_Op,Const_Type_Op,Array_Op,val); //typ:Type_Op cat:Const_Type_Op arr:Array_Op Array_Op=false; if(is_assign&&!Const_Type_Op) { Node tmp=Sem.top(); Sem.pop(); Push_Sem(du.tid); Sem.push(tmp); Push_Syn('='); Assign(); }}void Initializer(){ if (Token_List[Token_List_Index]->get_tag()=='{') { Token_List_Index++; Initializer_List(); Initializer_End(); } else Constant_Expression();}void Initializer_List(){ Initializer(); while(Token_List[Token_List_Index]->get_tag()==',') { Token_List_Index++; Initializer_List(); }}void Initializer_End(){ if (Token_List[Token_List_Index]->get_tag()==',') { Token_List_Index++; if (Token_List[Token_List_Index]->get_tag()=='}') Token_List_Index++; else synax_error=true; } else if (Token_List[Token_List_Index]->get_tag()=='}') { Token_List_Index++; }else synax_error=true;}void Compound_Statement(){ if (Token_List[Token_List_Index]->get_tag()=='{') Token_List_Index++; else synax_error=true; while(Token_List[Token_List_Index]->get_tag()==TYPE) { Declaration(); } while(Token_List[Token_List_Index]->get_tag()!='}') Statement(); Token_List_Index++;}void Area_Statement(){ if (Token_List[Token_List_Index]->get_tag()=='{') Token_List_Index++; else synax_error=true; while(Token_List[Token_List_Index]->get_tag()!='}') Statement(); Token_List_Index++;}void Area_Jump_Statement(){ if (Token_List[Token_List_Index]->get_tag()=='{') Token_List_Index++; else synax_error=true; while(Token_List[Token_List_Index]->get_tag()!='}') Jump_Statement(); Token_List_Index++;}void Statement(){ if (Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="return") Return_Statement(); else if (Token_List[Token_List_Index]->get_tag()==KEY&&(Token_List[Token_List_Index]->get_lexeme_str()=="while"||Token_List[Token_List_Index]->get_lexeme_str()=="for")) Iteration_Statement(); else if(Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="if") Selection_Statement(); else if(Token_List[Token_List_Index]->get_tag()=='{') Area_Statement(); else Expression_Statement();}void Expression_Statement(){ if(Token_List[Token_List_Index]->get_tag()!=';') Expression(); if(Token_List[Token_List_Index]->get_tag()==';') Token_List_Index++;}void Selection_Statement(){ if(Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="if") Token_List_Index++; else synax_error=true; if (Token_List[Token_List_Index]->get_tag()=='(') Token_List_Index++; else synax_error=true; Constant_Expression(); Genth(); if (Token_List[Token_List_Index]->get_tag()==')') Token_List_Index++; else synax_error=true; Area_Statement(); if(Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="else") { Genel(); Token_List_Index++; Area_Statement(); } Genie();}void Selection_Jump_Statement(){ if(Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="if") Token_List_Index++; else synax_error=true; if (Token_List[Token_List_Index]->get_tag()=='(') Token_List_Index++; else synax_error=true; Constant_Expression(); Genth(); if (Token_List[Token_List_Index]->get_tag()==')') Token_List_Index++; else synax_error=true; Area_Jump_Statement(); if(Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="else") { Genel(); Token_List_Index++; Area_Jump_Statement(); } Genie();}void Iteration_Statement(){ if (Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="while") { Genwh(); Token_List_Index++; if (Token_List[Token_List_Index]->get_tag()=='(') { Token_List_Index++; } else { synax_error=true; } Constant_Expression(); Gendo(); if (Token_List[Token_List_Index]->get_tag()!=')') synax_error=true; Token_List_Index++; Area_Jump_Statement(); Genwe(); } else if (Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="for") { Token_List_Index++; if (Token_List[Token_List_Index]->get_tag()=='(') Token_List_Index++; else synax_error=true; if (Token_List[Token_List_Index]->get_tag()!=';') Expression(); if (Token_List[Token_List_Index]->get_tag()==';') Token_List_Index++; else synax_error=true; Genfr(); if (Token_List[Token_List_Index]->get_tag()!=';') Constant_Expression(); if (Token_List[Token_List_Index]->get_tag()==';') Token_List_Index++; else synax_error=true; Genfc(); Genfd(); if (Token_List[Token_List_Index]->get_tag()!=')') Expression(); if (Token_List[Token_List_Index]->get_tag()==')') Token_List_Index++; else synax_error=true; Genfj(); Area_Jump_Statement(); Genfe(); }}void Jump_Statement(){ if (Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="continue") { Token_List_Index++; if (Token_List[Token_List_Index]->get_tag()==';') Token_List_Index++; else synax_error=true; Continue(); } else if (Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="break") { Token_List_Index++; if (Token_List[Token_List_Index]->get_tag()==';') Token_List_Index++; else synax_error=true; Break(); } else if (Token_List[Token_List_Index]->get_tag()==KEY&&(Token_List[Token_List_Index]->get_lexeme_str()=="while"||Token_List[Token_List_Index]->get_lexeme_str()=="for")) Iteration_Statement(); else if (Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="return") Return_Statement(); else if(Token_List[Token_List_Index]->get_tag()==KEY&&Token_List[Token_List_Index]->get_lexeme_str()=="if") Selection_Statement(); else if(Token_List[Token_List_Index]->get_tag()=='{') Area_Jump_Statement(); else Expression_Statement();}void Oringinal_Statements(){ mainpid=-1; curpid=-1; while(Token_List_Index<Token_List.size()&&Token_List[Token_List_Index]->get_tag()==TYPE) { Vall=0; Fun_Type_Op=Type_Specifier(); int tid=Identifier(); Middle_Code.push_back(Fun_Start(tid)); Synbl_Push_Name(tid); curpid=Synbl_Push_Fun_Typ(tid,Type_Op); if(Token_List[tid]->get_lexeme_str()=="main") mainpid=curpid; if(Token_List[Token_List_Index]->get_tag()!='(') synax_error=true; else Token_List_Index++; if(Token_List_Index==Token_List.size()) synax_error=true; //params if(Token_List[Token_List_Index]->get_tag()!=')') synax_error=true; else Token_List_Index++; if(Token_List_Index==Token_List.size()) synax_error=true; Compound_Statement(); Middle_Code.push_back(Fun_End(tid)); Synbl_Push_Fun_Size(tid,Vall); } if(Token_List_Index<Token_List.size()) synax_error=true; if(mainpid==-1) Semantic_Error("No main function!"); for(int i=0;i<Middle_Code.size();i++) { if(Middle_Code[i].Operator==SSP) { Middle_Code[i].Target1.Num=Pfinfl[Middle_Code[i].Target1.Addr].Size; } }}int Function_Call_Expression(){ //SSP SIZE int tid=Identifier(); int sid=Tid_To_Sid(tid); if(sid==-1) Semantic_Error("Undeclared function!"); Middle_Code.push_back(Get_Ssp(curpid)); if(Token_List[Token_List_Index]->get_tag()!='(') synax_error=true; else Token_List_Index++; if(Token_List_Index==Token_List.size()) synax_error=true; //params if(Token_List[Token_List_Index]->get_tag()!=')') synax_error=true; else Token_List_Index++; if(Token_List_Index==Token_List.size()) synax_error=true; //CALL Middle_Code.push_back(Call(tid)); //SPP Middle_Code.push_back(Get_Spp()); return Synbl[sid].typ;}void Return_Statement(){ Token_List_Index++; Constant_Expression(); Node tmp=Sem.top(); Sem.pop(); if(tmp.Size>Data_Size(Fun_Type_Op)) Semantic_Error("Function return type mismatch!"); Middle_Code.push_back(Get_Retax(tmp)); Middle_Code.push_back(Get_Ret()); if(Token_List[Token_List_Index]->get_tag()!=';') synax_error=true; Token_List_Index++;}void Condition_Check_Final_Code(Node t){ if (t.Ein==1) { t1.Op="MOV"; t1.Dst="BX"; t1.Sour=num2str(t.Addr); t1.Label_Index=-1; Final_Code.push_back(t1); t1.Op="MOV"; t1.Dst="DX"; t1.Sour="0"; t1.Label_Index=-1; Final_Code.push_back(t1); t1.Op="CMP"; t1.Dst="[BX]"; t1.Sour="DX"; t1.Label_Index=-1; Final_Code.push_back(t1); } else if(t.Ein==2) { t1.Label_Index=-1; t1.Op="PUSH"; t1.Dst="AX"; t1.Sour=""; Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="MOV"; t1.Dst="AX"; t1.Sour=num2str(t.Num); Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="CMP"; t1.Dst="AX"; t1.Sour="0"; Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="POP"; t1.Dst="AX"; t1.Sour=""; Final_Code.push_back(t1); } else if(t.Ein==3) { t1.Label_Index=-1; t1.Op="PUSH"; t1.Dst="AX"; t1.Sour=""; Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="PUSH"; t1.Dst="DI"; t1.Sour=""; Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="MOV"; t1.Dst="BX"; t1.Sour=num2str(t.Addr); Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="MOV"; t1.Dst="DI"; t1.Sour="[BX]"; Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="CMP"; t1.Dst="AX"; t1.Sour="0"; Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="POP"; t1.Dst="DI"; t1.Sour=""; Final_Code.push_back(t1); t1.Label_Index=-1; t1.Op="POP"; t1.Dst="AX"; t1.Sour=""; Final_Code.push_back(t1); }}//中间代码生成函数。void Basic_Block_Partition(){ Middle_Code_Unit t1; vector<Middle_Code_Unit> Temp; for (int i=0;i<Middle_Code.size();i++) { if (Middle_Code[i].Operator>KEY&&Middle_Code[i].Operator<=FOR) { Block.push_back(Temp); Temp.clear(); t1.Operator=Middle_Code[i].Operator; t1.Target1=Middle_Code[i].Target1; t1.Target2=Middle_Code[i].Target2; t1.Result=Middle_Code[i].Result; Temp.push_back(t1); } else if (Middle_Code[i].Operator<=KEY) { t1.Operator=Middle_Code[i].Operator; t1.Target1=Middle_Code[i].Target1; t1.Target2=Middle_Code[i].Target2; t1.Result=Middle_Code[i].Result; Temp.push_back(t1); } else if(Middle_Code[i].Operator>FOR) { t1.Operator=Middle_Code[i].Operator; t1.Target1=Middle_Code[i].Target1; t1.Target2=Middle_Code[i].Target2; t1.Result=Middle_Code[i].Result; Temp.push_back(t1); Block.push_back(Temp); Temp.clear(); } } if (Temp.empty()) { return; } else{ Block.push_back(Temp); Temp.clear(); }}void Send_To_Acc(){ if(acc!=-1) { if(acc_k==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(acc); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="[BX]"; t.Sour="AX"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(acc); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="[DI]"; t.Sour="AX"; Final_Code.push_back(t); } }}void Load1_To_Ax(){ if(Block[ii][jj].Target1.Ein==2) { t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour=num2str(Block[ii][jj].Target1.Num); Final_Code.push_back(t); } else if(Block[ii][jj].Target1.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target1.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="[BX]"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target1.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="[DI]"; Final_Code.push_back(t); }}void Load2_To_Ax(){ if(Block[ii][jj].Target2.Ein==2) { t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour=num2str(Block[ii][jj].Target2.Num); Final_Code.push_back(t); } else if(Block[ii][jj].Target2.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="[BX]"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="[DI]"; Final_Code.push_back(t); }}void TempOp1(){ if(Block[ii][jj].Target1.Ein==2) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target1.Num); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="BX"; Final_Code.push_back(t); } else if(Block[ii][jj].Target1.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target1.Addr); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="[BX]"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target1.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="[DI]"; Final_Code.push_back(t); }}void TempOp2(){ if(Block[ii][jj].Target2.Ein==2) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Num); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="BX"; Final_Code.push_back(t); } else if(Block[ii][jj].Target2.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="[BX]"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="[DI]"; Final_Code.push_back(t); }}void BackEnd(){ cout << endl << "Final Code:" << endl << endl; t.Op="SSEG"; t.Label_Index=-1; t.Dst="SEGMENT"; t.Sour=""; Final_Code.push_back(t); t.Op="SSEG"; t.Label_Index=-1; t.Dst="ENDS"; t.Sour=""; Final_Code.push_back(t); t.Op="DSEG"; t.Label_Index=-1; t.Dst="SEGMENT"; t.Sour=""; Final_Code.push_back(t); t.Op="DSEG"; t.Label_Index=-1; t.Dst="ENDS"; t.Sour=""; Final_Code.push_back(t); t.Op="CSEG"; t.Label_Index=-1; t.Dst="SEGMENT"; t.Sour=""; Final_Code.push_back(t); t.Op="ASSUME"; t.Label_Index=-1; t.Dst="CS:CSEG,DS:DSEG"; t.Sour=""; Final_Code.push_back(t); t.Op="ASSUME"; t.Label_Index=-1; t.Dst="SS:SSEG"; t.Sour=""; Final_Code.push_back(t); t1.Label_Index=Label_Index; t1.Op="LABEL"+num2str(Label_Index); t1.Dst=""; t1.Sour=""; Final_Code.push_back(t1); Label_Index++; t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="DSEG"; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DS"; t.Sour="AX"; Final_Code.push_back(t); for(ii=0;ii<Block.size();ii++) { acc=-1; acc_k=-1; for(jj=0;jj<Block[ii].size();jj++) { switch(Block[ii][jj].Operator) { case '+': case '&': case '|': case '^': if(Block[ii][jj].Operator=='+') Temp_Op="ADD"; else if(Block[ii][jj].Operator=='&') Temp_Op="AND"; else if(Block[ii][jj].Operator=='|') Temp_Op="OR"; else if(Block[ii][jj].Operator=='^') Temp_Op="XOR"; if(acc==-1 || !((Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc)|| (Block[ii][jj].Target2.Ein==acc_k && Block[ii][jj].Target2.Addr==acc))) { Send_To_Acc(); Load1_To_Ax(); TempOp2(); } else { if(Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc &&Block[ii][jj].Target2.Ein==acc_k && Block[ii][jj].Target2.Addr==acc) { if(acc_k==1) { t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="AX"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="AX"; Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="[DI]"; Final_Code.push_back(t); } } else if(Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc) TempOp2(); else if(Block[ii][jj].Target2.Ein==acc_k && Block[ii][jj].Target2.Addr==acc) TempOp1(); } acc=Block[ii][jj].Result.Addr; acc_k=Block[ii][jj].Result.Ein; break; case '-': Temp_Op="SUB"; if(acc==-1 || !((Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc))) { Send_To_Acc(); Load1_To_Ax(); TempOp2(); } else TempOp2(); acc=Block[ii][jj].Result.Addr; acc_k=Block[ii][jj].Result.Ein; break; case '/': case '*': if(Block[ii][jj].Operator=='*') Temp_Op="MUL"; else if(Block[ii][jj].Operator=='*') Temp_Op="DIV"; if(acc==-1 || !((Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc))) { Send_To_Acc(); Load1_To_Ax(); if(Block[ii][jj].Target2.Ein==2) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Num); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="BX"; t.Sour=""; Final_Code.push_back(t); } else if(Block[ii][jj].Target2.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="[BX]"; t.Sour=""; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="[DI]"; t.Sour=""; Final_Code.push_back(t); } } else { if(Block[ii][jj].Target2.Ein==2) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Num); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="BX"; t.Sour=""; Final_Code.push_back(t); } else if(Block[ii][jj].Target2.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="[BX]"; t.Sour=""; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="[DI]"; t.Sour=""; Final_Code.push_back(t); } } acc=Block[ii][jj].Result.Addr; acc_k=Block[ii][jj].Result.Ein; break; case '~': if(acc==-1 || !(Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc)) { Send_To_Acc(); Load1_To_Ax(); } t.Op="NOT"; t.Label_Index=-1; t.Dst="AX"; t.Sour=""; Final_Code.push_back(t); acc=Block[ii][jj].Result.Addr; acc_k=Block[ii][jj].Result.Ein; break; case AND: case OR: if(Block[ii][jj].Operator==AND) Temp_Op="AND"; else if(Block[ii][jj].Operator==OR) Temp_Op="OR"; if(acc==-1 || !((Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc))) { Send_To_Acc(); Load1_To_Ax(); } t.Op="CMP"; t.Label_Index=-1; t.Dst="AX"; t.Sour="0"; Final_Code.push_back(t); t.Op="JE"; t.Label_Index=-1; t.Dst="LABEL"+num2str(Label_Index); t.Sour=""; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="1"; Final_Code.push_back(t); t.Op="LABEL"+num2str(Label_Index); t.Label_Index=Label_Index; t.Dst=""; t.Sour=""; Label_Index++; Final_Code.push_back(t); if(Block[ii][jj].Target2.Ein==2) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Num); Final_Code.push_back(t); } else if(Block[ii][jj].Target2.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="DX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour="DX"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour="[DI]"; Final_Code.push_back(t); } t.Op="CMP"; t.Label_Index=-1; t.Dst="BX"; t.Sour="0"; Final_Code.push_back(t); t.Op="JE"; t.Label_Index=-1; t.Dst="LABEL"+num2str(Label_Index); t.Sour=""; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour="1"; Final_Code.push_back(t); t.Op="LABEL"+num2str(Label_Index); t.Label_Index=Label_Index; t.Dst=""; t.Sour=""; Label_Index++; Final_Code.push_back(t); t.Op=Temp_Op; t.Label_Index=-1; t.Dst="AX"; t.Sour="BX"; Final_Code.push_back(t); acc=Block[ii][jj].Result.Addr; acc_k=Block[ii][jj].Result.Ein; break; case '!': if(acc!=-1 && !((Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc))) { Send_To_Acc(); Load1_To_Ax(); } t.Op="CMP"; t.Label_Index=-1; t.Dst="AX"; t.Sour="0"; Final_Code.push_back(t); t.Op="JE"; t.Label_Index=-1; t.Dst="LABEL"+num2str(Label_Index); t.Sour=""; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="0"; Final_Code.push_back(t); t.Op="JMP"; t.Label_Index=-1; t.Dst="LABEL"+num2str(Label_Index); t.Sour=""; Final_Code.push_back(t); t.Op="LABEL"+num2str(Label_Index); t.Label_Index=Label_Index; t.Dst=""; t.Sour=""; Label_Index++; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="1"; Final_Code.push_back(t); t.Op="LABEL"+num2str(Label_Index); t.Label_Index=Label_Index; t.Dst=""; t.Sour=""; Label_Index++; Final_Code.push_back(t); acc=Block[ii][jj].Result.Addr; acc_k=Block[ii][jj].Result.Ein; break; case '<': case '>': case GE: case LE: if(Block[ii][jj].Operator=='<') Temp_Op="JL"; else if(Block[ii][jj].Operator=='>') Temp_Op="JG"; else if(Block[ii][jj].Operator==GE) Temp_Op="JGE"; else if(Block[ii][jj].Operator==LE) Temp_Op="JLE"; if(acc==-1 || !((Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc))) { Send_To_Acc(); Load1_To_Ax(); } if(Block[ii][jj].Target2.Ein==2) { t.Op="CMP"; t.Label_Index=-1; t.Dst="AX"; t.Sour=num2str(Block[ii][jj].Target2.Num); Final_Code.push_back(t); } else if(Block[ii][jj].Target2.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op="CMP"; t.Label_Index=-1; t.Dst="AX"; t.Sour="[BX]"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target2.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op="CMP"; t.Label_Index=-1; t.Dst="AX"; t.Sour="DI"; Final_Code.push_back(t); } t.Op=Temp_Op; t.Label_Index=-1; t.Dst="LABEL"+num2str(Label_Index); t.Sour=""; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="0"; Final_Code.push_back(t); t.Op="JMP"; t.Label_Index=-1; t.Dst="LABEL"+num2str(Label_Index+1); t.Sour=""; Final_Code.push_back(t); t.Op="LABEL"+num2str(Label_Index); t.Label_Index=Label_Index; t.Dst=""; t.Sour=""; Label_Index++; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="AX"; t.Sour="1"; Final_Code.push_back(t); t.Op="LABEL"+num2str(Label_Index); t.Label_Index=Label_Index; t.Dst=""; t.Sour=""; Label_Index++; Final_Code.push_back(t); acc=Block[ii][jj].Result.Addr; acc_k=Block[ii][jj].Result.Ein; break; case '=': if(acc==-1 || !(Block[ii][jj].Target1.Ein==acc_k && Block[ii][jj].Target1.Addr==acc)) { Send_To_Acc(); Load1_To_Ax(); } if(Block[ii][jj].Result.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Result.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="[BX]"; t.Sour="AX"; Final_Code.push_back(t); acc=-1; acc_k=-1; } else if(Block[ii][jj].Result.Ein==3) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Result.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); acc=-1; acc_k=-1; t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="AX"; Final_Code.push_back(t); acc=-1; acc_k=-1; } break; case THEN: Condition_Check_Final_Code(Block[ii][jj].Target1); t.Label_Index=-1; t.Op="JZ"; t.Dst="IFEMPTY"; t.Sour=""; Final_Code.push_back(t); break; case ELSE: t.Op="JMP"; t.Label_Index=-1; t.Sour=""; t.Dst="IFEMPTY"; for (int i=Final_Code.size()-1;i>=0;i--) { if (Final_Code[i].Op=="JZ"&&Final_Code[i].Dst=="IFEMPTY") { Final_Code[i].Dst="LABEL"+num2str(Label_Index); break; } } t1.Op="LABEL"+num2str(Label_Index); t1.Label_Index=Label_Index; t1.Dst=""; t1.Sour=""; Label_Index++; Final_Code.push_back(t); Final_Code.push_back(t1); break; case IFEND: for (int i=Final_Code.size()-1;i>=0;i--) { if ((Final_Code[i].Op=="JZ"||Final_Code[i].Op=="JMP")&&Final_Code[i].Dst=="IFEMPTY") { Final_Code[i].Dst="LABEL"+num2str(Label_Index); break; } } t.Op="LABEL"+num2str(Label_Index); t.Label_Index=Label_Index; t.Dst=""; t.Sour=""; Label_Index++; Final_Code.push_back(t); break; case WHILE: t.Label_Index=Label_Index; t.Op="LABEL"+num2str(Label_Index); t.Dst=""; t.Sour=""; Label.push_back(t.Op); Label_Index++; Final_Code.push_back(t); break; case DO: Condition_Check_Final_Code(Block[ii][jj].Target1); t.Label_Index=-1; t.Op="JZ"; t.Dst="WHENEMPTY"; t.Sour=""; Final_Code.push_back(t); break; case WHEND: t.Op="JMP"; t.Label_Index=-1; t.Sour=""; for (int i=Final_Code.size()-1;i>=0;i--) if (Final_Code[i].Dst=="WHENEMPTY") { Final_Code[i].Dst="LABEL"+num2str(Label_Index); break; } t1.Op="LABEL"+num2str(Label_Index); t1.Label_Index=Label_Index; t1.Dst=""; t1.Sour=""; Label_Index++; t.Dst=Label.back(); Label.pop_back(); Final_Code.push_back(t); Final_Code.push_back(t1); break; case FOR: t.Label_Index=Label_Index; t.Op="LABEL"+num2str(Label_Index); t.Dst=""; t.Sour=""; Label_Index++; Final_Code.push_back(t); For_Label.push_back(t.Op); break; case FOR_CHECK: Condition_Check_Final_Code(Block[ii][jj].Target1); t.Op="JZ"; t.Dst="FOR_CHECKEMPTY"; t.Sour=""; t.Label_Index=-1; Final_Code.push_back(t); break; case FOR_DO: t.Op="JMP"; t.Label_Index=-1; t.Dst="FOR_DOEMPTY"; t.Sour=""; Final_Code.push_back(t); t1.Op="LABEL"+num2str(Label_Index); t1.Label_Index=Label_Index; t1.Dst=""; t1.Sour=""; Label_Index++; Final_Code.push_back(t1); For_Do_Label.push_back(t1.Op); break; case FOR_JUMP: t.Op="JMP"; t.Label_Index=-1; t.Dst=For_Label.back(); For_Label.pop_back(); t.Sour=""; Final_Code.push_back(t); t1.Label_Index=Label_Index; t1.Op="LABEL"+num2str(Label_Index); Label_Index++; t1.Dst=""; t1.Sour=""; Final_Code.push_back(t1); for (int i=Final_Code.size()-1;i>=0;i--) if (Final_Code[i].Dst=="FOR_DOEMPTY") { Final_Code[i].Dst=t1.Op; break; } break; case FOR_END: t.Op="JMP"; t.Label_Index=-1; t.Dst=For_Do_Label.back(); t.Sour=""; For_Do_Label.pop_back(); Final_Code.push_back(t); t1.Label_Index=Label_Index; t1.Op="LABEL"+num2str(Label_Index); t1.Dst=""; t1.Sour=""; Final_Code.push_back(t1); Label_Index++; for (int i=Final_Code.size()-1;i>=0;i--) if (Final_Code[i].Dst=="FOR_CHECKEMPTY") { Final_Code[i].Dst=t1.Op; break; } break; case FUN_S: if(Block[ii][jj].Target1.Name!="main") { t.Op=Block[ii][jj].Target1.Name; t.Label_Index=-1; t.Dst="PROC"; t.Sour="NEAR"; Final_Code.push_back(t); } break; case SPP: t.Op="POP"; t.Dst="SP"; t.Label_Index=-1; t.Sour=""; Final_Code.push_back(t); t.Op="MOV"; t.Dst="AX"; t.Label_Index=-1; t.Sour="SP"; Final_Code.push_back(t); t.Op="MOV"; t.Dst="DS"; t.Label_Index=-1; t.Sour="AX"; Final_Code.push_back(t); break; case SSP: t.Op="PUSH"; t.Dst="SP"; t.Label_Index=-1; t.Sour=""; Final_Code.push_back(t); t.Op="ADD"; t.Dst="SP"; t.Label_Index=-1; t.Sour=num2str(Block[ii][jj].Target1.Num); Final_Code.push_back(t); t.Op="MOV"; t.Dst="AX"; t.Label_Index=-1; t.Sour="SP"; Final_Code.push_back(t); t.Op="MOV"; t.Dst="DS"; t.Label_Index=-1; t.Sour="AX"; Final_Code.push_back(t); break; case FUN_E: if(Block[ii][jj].Target1.Name!="main") { t.Op=Block[ii][jj].Target1.Name; t.Label_Index=-1; t.Dst="ENDP"; t.Sour=""; Final_Code.push_back(t); } break; case CALL: t.Op="CALL"; t.Label_Index=-1; t.Dst=Block[ii][jj].Target1.Name; t.Sour=""; Final_Code.push_back(t); break; case RETAX: if(Block[ii][jj].Target1.Ein==2) { t.Op="MOV"; t.Label_Index=-1; t.Dst="CX"; t.Sour=num2str(Block[ii][jj].Target1.Num); Final_Code.push_back(t); } else if(Block[ii][jj].Target1.Ein==1) { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target1.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="CX"; t.Sour="[BX]"; Final_Code.push_back(t); } else { t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target1.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="DI"; t.Sour="[BX]"; Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="CX"; t.Sour="DI"; Final_Code.push_back(t); } break; case RETT: t.Op="MOV"; t.Label_Index=-1; t.Dst="BX"; t.Sour=num2str(Block[ii][jj].Target1.Addr); Final_Code.push_back(t); t.Op="MOV"; t.Label_Index=-1; t.Dst="[BX]"; t.Sour="CX"; Final_Code.push_back(t); break; } } } t.Op="NOP"; t.Label_Index=-1; t.Dst=""; t.Sour=""; Final_Code.push_back(t); t.Op="CSEG"; t.Label_Index=-1; t.Dst="ENDS"; t.Sour=""; Final_Code.push_back(t); t.Op="END"; t.Label_Index=-1; t.Dst="LABEL0"; t.Sour=""; Final_Code.push_back(t); int flag=0; for(int i=0;i<Final_Code.size();i++) { if(Final_Code[i].Dst=="PROC")cout << endl; if(Final_Code[i].Op=="ASSUME" || Final_Code[i].Op=="END") cout << "\t\t"+Final_Code[i].Op+'\t'+Final_Code[i].Dst+'\n'; else if(Final_Code[i].Label_Index!=-1) { cout << Final_Code[i].Op+":"; flag=1; } else if(Final_Code[i].Dst=="ENDS" || Final_Code[i].Dst=="SEGMENT") { cout << Final_Code[i].Op+"\t"+Final_Code[i].Dst+'\n'; } else if(Final_Code[i].Dst=="ENDP" || Final_Code[i].Dst=="PROC") { cout << Final_Code[i].Op+"\t"+Final_Code[i].Dst+'\t'+Final_Code[i].Sour+'\n'; } else if(Final_Code[i].Sour=="") { if(!flag)cout << '\t'; else flag=!flag; cout << '\t'+Final_Code[i].Op+"\t\t"+Final_Code[i].Dst+'\n'; } else { if(!flag)cout << '\t'; else flag=!flag; cout << '\t' << Final_Code[i].Op+"\t\t"+Final_Code[i].Dst+','+Final_Code[i].Sour+'\n'; } if(Final_Code[i].Dst=="ENDP")cout << endl; }}
阅读全文
0 0
- 编译原理课设之简单编译器实现
- 编译原理课设之简单编译器实现
- 编译原理课设——《TINY编译器》,用lex生成词法扫描实现编译器
- 编译原理课设——《TINY编译器》,用yacc生成语法扫描实现编译器
- 编译原理课设——《TINY编译器》,用lex和yacc生成词法语法分析源码,实现编译器
- 编译原理-简单模拟编译器判错
- 2015年广东工业大学编译原理课设
- 编译原理课设实验报告
- 编译原理之编译器的结构
- 初探编译器static、const之实现原理
- 编译原理第二章简单的一遍编译器
- 小白说编译原理-9-最简单minus-c语言编译器
- 编译原理Pl/0语言 简单编译器思路
- 编译器编译原理详解
- 编译器编译原理详解
- 【编译器、编译原理相关】
- TINY编译器《编译原理》
- 编译器编译原理详解
- 【图文】关于Android内存和性能优化的使用教程
- ValueError: too many values to unpack (expected 2)
- java socke t一个服务器可以向多个客服端发送信息实现步骤
- java运算符的优先级别
- 大数据正式29
- 编译原理课设之简单编译器实现
- 反射简单使用
- 【模板】nlogn的LIS
- Eclipse 安装Activiti 插件失败解决方法(总结)
- 万能头文件#include <bits/stdc++.h>
- nonlocal
- php 获取客户端的真实IP地址 和 检查客户端从什么地方过来的请求
- Android WiFi开发教程(一)——WiFi热点的创建与关闭
- Linux软件安装总结