int generateWrite(str a){ if(DEBUG)printf("Generujemy write\n"); int ret=generateP_A(a); if(ret!=0)return ret; addCodeLine("STORE " + op_temp_a); addCodeLine("PRINT " + op_temp_a); return 0; }
/** Funkcja ktora 1. Sprawdza czy VALUE jest liczba- jesli tak- generuj w rejestrze a 2. Sprawdza, czy VALUE jest stala- laduj stala 3. Sprawdza, czy VALUE jest zmienna - laduj zmienna Po wykonaniu tej funkcji rejestr pomocniczy op_temp_a zawiera a, op_temp_b zawiera b */ int generateP_AB(str a, str b){ int ret=generateP_A(a); addCodeLine("STORE " + op_temp_a); if(ret!=0)return ret; ret=generateP_A(b); if(ret!=0)return ret; addCodeLine("STORE " + op_temp_b); return 0; }
void generateThen(){ int pl=tempCode.size(); if(DEBUG)printf("Generuje then w linii %d\n", pl); addCodeLine("JUMP"); jumper(); labeler(); }
void endOfProgram(){ if(DEBUG)printf("Koniec programu, zwracam HALT\nKOD:\n"); addCodeLine("HALT"); for(int i=0; i<tempCode.size(); i++){ if(DEBUG || LINECODE)printf("%d. ", i); printf("%s\n", tempCode.at(i).c_str()); } }
void generateDo(){ int pl=tempCode.size(); if(DEBUG)printf("Generuje else w linii %d\n", pl); addCodeLine("JUMP"); jumper(); labeler(); fixWhileLabels(); }
void binaryNumberToCode(str bin){ vec<str> v; addCodeLine("ZERO"); //printf("ZMIANA\n"); while(bin!="0"){ //printf("BIN %s\n", bin.c_str()); char l=bin.at(bin.size()-1); if(l=='1'){ v.push_back("INC"); bin.at(bin.size()-1)='0'; }else if(l=='0'){ v.push_back("SHL"); bin.erase(bin.size()-1, 1); } } for(int i=v.size()-1; i>=0; i--){ addCodeLine(v.at(i)); } }
int generateVariableAssign(str varName, str varVal){ if(DEBUG)printf("\tPrzypisuje zmiennej <%s> wartosc <%s>\n", varName.c_str(), varVal.c_str()); int varIndex=variableManager.getItemIndex(varName); if(varIndex==-1){ int cVarIndex=constantManager.getItemIndex(varName); if(cVarIndex==-1){ // jezeli nie istnieje ani stala ani zmienna return 1; }else{ // jezeli istnieje stala return 2; } } // istnieje indeks zmiennej if(DEBUG)printf("Indeks zmiennej to %d\n", varIndex); char temp[50]; sprintf(temp, "STORE %d", varIndex); addCodeLine(temp); return 0; }
int generateRead(str a){ if(DEBUG)printf("Generujemy read\n"); if(isNumber(a)){ return -2; }else{ int AvarIndex=variableManager.getItemIndex(a); if(AvarIndex==-1){ // jezeli nie istnieje zmienna a AvarIndex=constantManager.getItemIndex(a); if(AvarIndex==-1){ if(ERR)printf("*******WRITERR"); return -1; }else{ return -3; } }else{ // jezeli istnieje zmienna char temp[50]; sprintf(temp, "SCAN %d", AvarIndex); addCodeLine(temp); } } return 0; }
int generateP_A(str a){ if(isNumber(a)){ generateValue(a); }else{ int AvarIndex=variableManager.getItemIndex(a); if(AvarIndex==-1){ // jezeli nie istnieje zmienna a AvarIndex=constantManager.getItemIndex(a); if(AvarIndex==-1){ if(ERR)printf("*******ARITH OP NIE ZNALEZIONO"); return -1; }else{ generateValue(constantManager.getItemValue(AvarIndex)); // generuj wartosc stalej } }else{ // jezeli istnieje zmienna char temp[50]; sprintf(temp, "LOAD %d", AvarIndex); addCodeLine(temp); } } return 0; }
int generateBoolOp(str op, str a, str b){ generateP_AB(a, b); //w tym miejscu w REJ_A jest 'b', pierwszy w p_666 if(op==S_GET){ addCodeLine("SUB " + op_temp_a); // REJ_A=b-a addCodeLine("JG"); // if b-a > 0 <=> b > a -> skacz, }else if(op==S_EQ){ addCodeLine("STORE " + op_temp_b); addCodeLine("SUB " + op_temp_a); // REJ_A=b-a addCodeLine("STORE " + op_temp_c); addCodeLine("LOAD " + op_temp_a); addCodeLine("SUB " + op_temp_b); // REJ_A=a-b addCodeLine("ADD " + op_temp_c); // w Z by sie to skrocilo; dla N wynik > 0 swiadczy o niezerowosci ktoregos ze skladnikow addCodeLine("JG"); //skaczemy gry (b-a) + (a-b) > 0, wtedy sa nierowne }else if(op==S_NEQ){ addCodeLine("STORE " + op_temp_b); addCodeLine("SUB " + op_temp_a); // REJ_A=b-a addCodeLine("STORE " + op_temp_c); addCodeLine("LOAD " + op_temp_a); addCodeLine("SUB " + op_temp_b); // REJ_A=a-b addCodeLine("ADD " + op_temp_c); // w Z by sie to skrocilo; dla N wynik > 0 swiadczy o niezerowosci ktoregos ze addCodeLine("JZ"); }else if(op==S_GT){ addCodeLine("STORE " + op_temp_b); addCodeLine("SUB " + op_temp_a); // REJ_A = b-a addCodeLine("STORE " + op_temp_c); addCodeLine("LOAD " + op_temp_a); addCodeLine("SUB " + op_temp_b); // REJ_A = a-b addCodeLine("SUB " + op_temp_c); addCodeLine("JZ"); }else{ return -1; if(ERR)printf("Nieznany operator %s", op.c_str()); } jumper(); return 0; }
int generateArithOp(str op, str a, str b){ generateP_AB(a, b); if(op==S_PLUS){ addCodeLine("ADD " +op_temp_a); }else if(op==S_MINUS){ addCodeLine("LOAD " + op_temp_a); addCodeLine("SUB " + op_temp_b); }else if(op==S_MULT){ char temp[50]; if(DEBUG)addCodeLine("-----------POCZATEK MNOZENIA"); addCodeLine("ZERO"); addCodeLine("STORE " + op_temp_c); int startLineNumber=tempCode.size(); // ETYKIETA START addCodeLine("LOAD " + op_temp_b); sprintf(temp, "JZ %d", tempCode.size()+19); addCodeLine(temp); sprintf(temp, "JODD %d", tempCode.size()+8); addCodeLine(temp); addCodeLine("LOAD " + op_temp_a); addCodeLine("SHL"); addCodeLine("STORE " + op_temp_a); addCodeLine("LOAD " + op_temp_b); addCodeLine("SHR"); addCodeLine("STORE " + op_temp_b); sprintf(temp, "JUMP %d", startLineNumber); addCodeLine(temp); //KONIEC DLA PARZYSTEGO addCodeLine("LOAD " + op_temp_c); addCodeLine("ADD " + op_temp_a); addCodeLine("STORE " + op_temp_c); addCodeLine("LOAD " + op_temp_a); addCodeLine("SHL"); addCodeLine("STORE " + op_temp_a); addCodeLine("LOAD " + op_temp_b); addCodeLine("SHR"); addCodeLine("STORE " + op_temp_b); sprintf(temp, "JUMP %d", startLineNumber); addCodeLine(temp); addCodeLine("LOAD " + op_temp_c); //addCodeLine("DEC"); addCodeLine("STORE " + op_temp_a); // reg_a=a if(DEBUG)addCodeLine("-----------KONIEC MNOZENIA"); }else if(op==S_DIV){ generateDivision(); }else if(op==S_MOD){ generateDivision(); addCodeLine("LOAD " + op_temp_b); addCodeLine("STORE " + op_temp_a); } else{ if(ERR)printf("Nieznany operator %s\n", op.c_str()); } return 0; }
void labeler(){ if(DEBUG)addCodeLine("---ETYKIETA---"); int line=tempCode.size()-1; labelStack.push_back(line); if(DEBUG)printf("Tymczasowy label w linii %d\n", line); }
void generateDivision(){ char temp[50]; int mod=0; //c=0, d=1 addCodeLine("LOAD " + op_temp_b); addCodeLine("STORE " + op_temp_c); //jezeli b=0 to skaczemy //addCodeLine("JZ " + tempCode.size()+66); sprintf(temp, "JZ %d", tempCode.size()+mod+66);addCodeLine(temp); addCodeLine("ZERO"); addCodeLine("STORE " + op_temp_c); addCodeLine("INC"); addCodeLine("STORE " + op_temp_d); //jesli b parzyste -> skacz (czyt. jezeli b+1 nieparzyste -> skacz) // ********** 0 ********* int label[7]; label[0] = tempCode.size(); addCodeLine("LOAD " + op_temp_b); //addCodeLine("INC"); // dopokia b+1 jest nieparzyste (b jest parzyste) sprintf(temp, "JODD %d", tempCode.size()+mod+17);addCodeLine(temp); addCodeLine("LOAD " + op_temp_d); addCodeLine("SHL"); addCodeLine("STORE " + op_temp_d); //jezeli a+1 nieparzyste -> 2 addCodeLine("LOAD " + op_temp_a); addCodeLine("INC"); sprintf(temp, "JODD %d", tempCode.size()+mod+4);addCodeLine(temp); addCodeLine("LOAD " + op_temp_d); addCodeLine("INC"); addCodeLine("STORE " + op_temp_d); // ************ 2 ********** addCodeLine("LOAD " + op_temp_a); addCodeLine("SHR"); addCodeLine("STORE " + op_temp_a); addCodeLine("LOAD " + op_temp_b); addCodeLine("SHR"); addCodeLine("STORE " + op_temp_b); sprintf(temp, "JUMP %d", label[0]);addCodeLine(temp); // **************** 1 label[1]=tempCode.size(); addCodeLine("LOAD " + op_temp_b); addCodeLine("SUB " + op_temp_a); sprintf(temp, "JG %d", tempCode.size()+mod+5);addCodeLine(temp); //3 addCodeLine("LOAD " + op_temp_b); addCodeLine("SHL"); addCodeLine("STORE " + op_temp_b); sprintf(temp, "JUMP %d", label[1]);addCodeLine(temp); //1 // ************* 3 label[3]=tempCode.size(); addCodeLine("LOAD " + op_temp_b); sprintf(temp, "JODD %d", tempCode.size()+mod+16);addCodeLine(temp); //4 addCodeLine("LOAD " + op_temp_c); addCodeLine("SHL"); addCodeLine("STORE " + op_temp_c); addCodeLine("LOAD " + op_temp_b); addCodeLine("SHR"); addCodeLine("STORE " + op_temp_b); addCodeLine("SUB " + op_temp_a); sprintf(temp, "JG %d", tempCode.size()+mod+7);addCodeLine(temp); // -> 5 addCodeLine("LOAD " + op_temp_c); addCodeLine("INC"); addCodeLine("STORE " + op_temp_c); addCodeLine("LOAD " + op_temp_a); addCodeLine("SUB " + op_temp_b); addCodeLine("STORE " + op_temp_a); // ****************** 5 sprintf(temp, "JUMP %d", label[3]);addCodeLine(temp); // ->3 // jezeli d>0 (r>0) to rob; jesli rowna- skacz // ***************** 4 label[4]=tempCode.size(); addCodeLine("LOAD " + op_temp_d); sprintf(temp, "JZ %d", tempCode.size()+mod+14);addCodeLine(temp); // -> 6 addCodeLine("LOAD " + op_temp_a); addCodeLine("SHL"); addCodeLine("STORE " + op_temp_a); addCodeLine("LOAD " + op_temp_d); addCodeLine("INC"); sprintf(temp, "JODD %d", tempCode.size()+mod+4);addCodeLine(temp); // -> 7 addCodeLine("LOAD " + op_temp_a); addCodeLine("INC"); addCodeLine("STORE " + op_temp_a); // ************* 7 addCodeLine("LOAD " + op_temp_d); addCodeLine("SHR"); addCodeLine("STORE " + op_temp_d); sprintf(temp, "JUMP %d", label[4]);addCodeLine(temp); // -> 4 // **************** 6 addCodeLine("LOAD " + op_temp_a); addCodeLine("SHR"); addCodeLine("STORE " + op_temp_a); addCodeLine("STORE " + op_temp_b); //reszta w b addCodeLine("LOAD " + op_temp_c); // przepisac wynik z c do a addCodeLine("STORE " + op_temp_a); }
void generateCodeForSearchPathInclude(const char* header, char*** codeLines, unsigned* numLines) { char* relativeInclude = concatenateStrings(3, "#include <", header, ">"); addCodeLine(relativeInclude, codeLines, numLines); free(relativeInclude); }