示例#1
0
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;
}
示例#2
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;
}
示例#3
0
void generateThen(){
	int pl=tempCode.size();
	if(DEBUG)printf("Generuje then w linii %d\n", pl);
	addCodeLine("JUMP");
	jumper();
	labeler();
}
示例#4
0
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());
	}
}
示例#5
0
void generateDo(){
	int pl=tempCode.size();
	if(DEBUG)printf("Generuje else w linii %d\n", pl);
	addCodeLine("JUMP");
	jumper();
	labeler();
	fixWhileLabels();
}
示例#6
0
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));
	}
}
示例#7
0
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;
}
示例#8
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;
}
示例#9
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;
}
示例#10
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;
}
示例#11
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;
}
示例#12
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);
}
示例#13
0
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);
}
示例#14
0
void generateCodeForSearchPathInclude(const char* header, char*** codeLines, unsigned* numLines) {
	char* relativeInclude = concatenateStrings(3, "#include <", header, ">");
	addCodeLine(relativeInclude, codeLines, numLines);
	free(relativeInclude);
}