Skip to content

Commit

Permalink
sync
Browse files Browse the repository at this point in the history
  • Loading branch information
AveryQi115 committed May 19, 2021
1 parent 89d24e7 commit 9459f91
Show file tree
Hide file tree
Showing 19 changed files with 1,229 additions and 1,158 deletions.
Binary file added Common.o
Binary file not shown.
Binary file added IntermediateCode.o
Binary file not shown.
Binary file added LexicalAnalyser.o
Binary file not shown.
Binary file added MyCompiler
Binary file not shown.
55 changes: 53 additions & 2 deletions ObjectCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,15 @@ bool isControlOp(string op) {
return false;
}

bool isArrItem(string name) {
return name.find("[")!=string::npos;
}

string getArrName(string name) {
cout << name.substr(0,name.find('[')) << endl;
return name.substr(0,name.find('['));
}

VarInfomation::VarInfomation(int next, bool active) {
this->next = next;
this->active = active;
Expand Down Expand Up @@ -193,7 +202,12 @@ string ObjectCodeGenerator::allocateReg(string var) {

//如果该变量没有在某个寄存器中
string ret = allocateReg();
objectCodes.push_back(string("lw ") + ret + " " + to_string(varOffset[var]) + "($sp)");
if (isArrItem(var)){

}
else{
objectCodes.push_back(string("lw ") + ret + " " + to_string(varOffset[var]) + "($sp)");
}
Avalue[var].insert(ret);
Rvalue[ret].insert(var);
return ret;
Expand Down Expand Up @@ -259,6 +273,23 @@ void ObjectCodeGenerator::analyseBlock(map<string, vector<Block> >*funcBlocks) {
use.insert(citer->src2);
}
}
// TODO:arr[index]目前的设计是整个数组会被加入到def和use中
// TODO:arr_declare目前的设计是arr名会被加入到def中
else if (citer->op == "array_declare"){//arr_declare,space,_,arr
if (!isNum(citer->src1) || !isVar(citer->des)){
outputError("数组定义不合法");
}
if (isVar(citer->des) && use.count(citer->des) == 0) {//如果目的操作数还没有被引用
int length = atoi(citer->src1.c_str());
if (length<=0){
outputError(citer->des+"数组容量不合法");
}
for(int i=0;i<length;i++){
def.insert(citer->des+"["+to_string(i)+"]");
}
arrays.push_back(ArrInfo{citer->des,atoi(citer->src1.c_str()),false});
}
}
else {
if (isVar(citer->src1) && def.count(citer->src1) == 0) {//如果源操作数1还没有被定值
use.insert(citer->src1);
Expand Down Expand Up @@ -581,6 +612,12 @@ void ObjectCodeGenerator::generateCodeForQuatenary(int nowBaseBlockIndex, int &a
}
Rvalue[src1Pos].insert(nowQuatenary->q.des);
Avalue[nowQuatenary->q.des].insert(src1Pos);
}
else if (nowQuatenary->q.op == "array_declare"){

}
else if (nowQuatenary->q.op == "[]="){//[]= src _ arr[index]

}
else {// + - * /
string src1Pos = allocateReg(nowQuatenary->q.src1);
Expand Down Expand Up @@ -673,8 +710,22 @@ void ObjectCodeGenerator::generateCodeForFuncBlocks(map<string, vector<IBlock> >
}
}

void ObjectCodeGenerator::generateDataSegment() {
if(arrays.size()==0)
return;

objectCodes.push_back(".data");
for(auto iter = arrays.begin();iter!=arrays.end();iter++){
objectCodes.push_back(iter->name + ": .space "+to_string(iter->length * 4));
}
}

void ObjectCodeGenerator::generateCode() {
objectCodes.push_back("lui $sp,0x1001");
// generate data segment
generateDataSegment();

// TODO: check stack address
// objectCodes.push_back("lui $sp,0x1001");
objectCodes.push_back("j main");
for (map<string, vector<IBlock> >::iterator fiter = funcIBlocks.begin(); fiter != funcIBlocks.end(); fiter++) {//对每一个函数块
generateCodeForFuncBlocks(fiter);
Expand Down
9 changes: 9 additions & 0 deletions ObjectCodeGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ struct IBlock {
int next2;
};

// 数组相关信息
struct ArrInfo {
string name; // 数组名,寻址基址
int length; // 数组长度(本项目中只存在int和void型所以数组元素大小为4)
bool active; // 在当前context中是否活跃
};

//保存临时常数 t0 t1寄存器
//保存函数的返回值 v0寄存器
class ObjectCodeGenerator {
Expand All @@ -47,6 +54,7 @@ class ObjectCodeGenerator {
vector<IBlock>::iterator nowIBlock;//当前分析的基本块
vector<QuaternaryWithInfo>::iterator nowQuatenary;//当前分析的四元式
vector<string>objectCodes;
vector<ArrInfo>arrays;

void outputIBlocks(ostream& out);
void outputObjectCode(ostream& out);
Expand All @@ -60,6 +68,7 @@ class ObjectCodeGenerator {
void generateCodeForFuncBlocks(map<string, vector<IBlock> >::iterator &fiter);
void generateCodeForBaseBlocks(int nowBaseBlockIndex);
void generateCodeForQuatenary(int nowBaseBlockIndex, int &arg_num, int &par_num, list<pair<string, bool> > &par_list);
void generateDataSegment();
public:
ObjectCodeGenerator();
void generateCode();
Expand Down
Binary file added ObjectCodeGenerator.o
Binary file not shown.
Binary file added Optimizer.o
Binary file not shown.
21 changes: 19 additions & 2 deletions ParserAndSemanticAnalyser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -680,12 +680,29 @@ void ParserAndSemanticAnalyser::analyse(list<Token>&words, ostream& out) {
pushSymbol(sentence_block);
break;
}
case 17://inner_var_declare ::= int ID
case 16://inner_declare ::= int ID var_declare inner_declare
{
Symbol* inner_declare = popSymbol();
Symbol* var_declare = popSymbol();
Id* ID = (Id*)popSymbol();
Symbol* _int = popSymbol();
pushSymbol(new Symbol(reductPro.left));
varTable.push_back(Var{ ID->name,D_INT,nowLevel });
pushSymbol(new Symbol(reductPro.left));
break;
}
case 17://inner_declare ::= int ID array_declare_list inner_declare
{
Symbol* inner_declare = popSymbol();
ArrayDeclareList* array_declare_list = (ArrayDeclareList*)popSymbol();
Id* ID = (Id*)popSymbol();
Symbol* _int = popSymbol();
if (array_declare_list->total_size <= 0)
outputError(string("语法错误:第") + to_string(lineCount) + "行,数组" + ID->name + "容量不合法");

string name = ID->name;
varTable.push_back(Var{ name,D_INT_ARRAY,nowLevel,array_declare_list->size});
code.emit("array_declare",to_string(array_declare_list->total_size),"_",name);
pushSymbol(new Symbol(reductPro.left));
break;
}
case 18://sentence_list ::= sentence M sentence_list
Expand Down
Binary file added ParserAndSemanticAnalyser.o
Binary file not shown.
16 changes: 8 additions & 8 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,19 @@ int main() {
//productions.txt中存放语法规则
ParserAndSemanticAnalyser parserAndSemanticAnalyser("productions.txt");
parserAndSemanticAnalyser.outputDFA("result/DFA.txt");

//根据移进规约表分析词法结果并将分析结果输出到SLR1_analyse.txt
parserAndSemanticAnalyser.analyse(lexicalAnalyser.getResult(), "result/SLR1_analyse.txt");
parserAndSemanticAnalyser.outputIntermediateCode("result/Intermediate.txt");

// IntermediateCode* code = parserAndSemanticAnalyser.getIntermediateCode();
// code->divideBlocks(parserAndSemanticAnalyser.getFuncEnter());
// code->outputBlocks("result/funBlocks.txt");
IntermediateCode* code = parserAndSemanticAnalyser.getIntermediateCode();
code->divideBlocks(parserAndSemanticAnalyser.getFuncEnter());
code->outputBlocks("result/funBlocks.txt");

// ObjectCodeGenerator objectCodeGenerator;
// objectCodeGenerator.analyseBlock(code->getFuncBlock());
// objectCodeGenerator.outputIBlocks();
// objectCodeGenerator.generateCode();
ObjectCodeGenerator objectCodeGenerator;
objectCodeGenerator.analyseBlock(code->getFuncBlock());
objectCodeGenerator.outputIBlocks();
objectCodeGenerator.generateCode();
// objectCodeGenerator.outputObjectCode();
// objectCodeGenerator.outputObjectCode("result/program.asm");

Expand Down
Binary file added main.o
Binary file not shown.
4 changes: 2 additions & 2 deletions productions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ parameter_list ::= param , parameter_list
param ::= int ID
sentence_block ::= { inner_declare sentence_list }
inner_declare ::=
inner_declare ::= inner_var_declare ; inner_declare
inner_var_declare ::= int ID
inner_declare ::= int ID var_declare inner_declare
inner_declare ::= int ID array_declare_list inner_declare
sentence_list ::= sentence M sentence_list
sentence_list ::= sentence
sentence ::= if_sentence
Expand Down
Loading

0 comments on commit 9459f91

Please sign in to comment.