Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- #include <iostream>
- #include <stack>
- #include <map>
- #include <string>
- #include <sstream>
- #include <vector>
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <gmpxx.h>
- #include <gmp.h>
- using namespace std;
- void yyerror(char const *);
- long long memory = 5;
- long long a = 0;
- long long k = 0;
- int yylex();
- map<string,long long> variables;
- vector<string> assembler;
- stack<long long> stacks;
- vector<long long> p;
- map<string, int> init;
- int strToInt(string n)
- {
- int number = atoi(n.c_str());
- return number;
- }
- template <class T>
- inline string numToStr(const T& t)
- {
- stringstream out;
- out << t;
- return out.str();
- }
- void checkVariables(string S)
- {
- if(variables.count(S) == 0)
- {
- yyerror("Unknown ID");
- exit(1);
- }
- }
- bool isExist(string S)
- {
- if(variables[S])
- return false;
- else
- return true;
- }
- void loadACU(long long number)
- {
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE " + numToStr(0));
- long long no_bits = floor(log2(number)+1);
- long long tab[no_bits];
- long long mask = 1;
- long long i;
- for(i = 0; i <= no_bits; i++)
- {
- if((mask&number) >= 1)
- tab[i] = 1;
- else
- tab[i] = 0;
- mask<<=1;
- }
- for(i = no_bits-2; i >= 0; i--)
- {
- if(tab[i] == 1)
- {
- k++;
- assembler.push_back("SHL "+numToStr(0));
- k++;
- assembler.push_back("INC");
- }
- else
- {
- k++;
- assembler.push_back("SHL "+numToStr(0));
- }
- }
- }
- %}
- %union
- {
- char *idi;
- long long num;
- }
- %token DECLARE
- %token IN
- %token END
- %token ASSIGN
- %token IF
- %token THEN
- %token ELSE
- %token ENDIF
- %token WHILE
- %token DO
- %token ENDWHILE
- %token GET
- %token PUT
- %token PLUS
- %token MINUS
- %token TIMES
- %token DIV
- %token MOD
- %token EQ
- %token DIFF
- %token LE
- %token GE
- %token LEQ
- %token GEQ
- %token SEMICOLON
- %token <idi> ID
- %token <num> NUM
- %token ERROR
- %%
- assembler: DECLARE vdeclarations IN commands END {
- assembler.push_back("HALT");
- }
- vdeclarations:
- | vdeclarations ID {
- string temp($<idi>2);
- if(variables.count(temp) > 0)
- {
- yyerror("Double declaration!");
- exit(1);
- }
- else
- {
- variables[temp] = memory;
- memory++;
- p.resize(memory);
- free($<idi>2);
- }
- }
- ;
- commands:
- | commands command
- ;
- command:
- ID ASSIGN expression SEMICOLON {
- string temp($<idi>1);
- if(variables.count(temp) == 0)
- {
- yyerror("Unknown ID");
- exit(1);
- }
- else
- {
- k++;
- assembler.push_back("STORE " + numToStr(variables[temp]));
- init[temp] = 1;
- //free($<idi>1);
- }
- }
- | IF condition THEN commands ENDIF {
- //cout<<stacks.top()<<endl;
- assembler[stacks.top()] = assembler[stacks.top()] + numToStr(assembler.size());
- stacks.pop();
- stacks.pop();
- }
- | IF condition THEN commands else commands ENDIF {
- assembler[stacks.top()] = assembler[stacks.top()]+numToStr(assembler.size());
- stacks.pop();
- stacks.pop();
- }
- | WHILE condition DO commands ENDWHILE {
- assembler[stacks.top()] += numToStr( assembler.size()+1 );
- stacks.pop();
- k++;
- assembler.push_back( "JUMP " + numToStr( stacks.top() ) );
- stacks.pop();
- }
- | GET ID SEMICOLON {
- string temp($<idi>2);
- checkVariables(temp);
- k++;
- assembler.push_back("READ");
- k++;
- assembler.push_back("STORE " + numToStr(variables[temp]));
- init[temp] = 1;
- free($<idi>2);
- }
- | PUT ID SEMICOLON {
- string temp($<idi>2);
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("WRITE");
- }
- | PUT NUM SEMICOLON {
- string temp(numToStr($<num>2));
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp) > 0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("WRITE");
- }
- else: ELSE {
- assembler[stacks.top()] += numToStr( assembler.size()+1 );
- stacks.pop();
- stacks.push( assembler.size());
- k++;
- assembler.push_back( "JUMP " );
- }
- expression:
- | value
- | ID PLUS ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp]));
- k++;
- assembler.push_back("ADD "+numToStr(variables[temp1]));
- }
- | ID PLUS NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("ADD "+ numToStr(variables[temp]));
- }
- | NUM PLUS ID {
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("ADD "+ numToStr(variables[temp1]));
- }
- | NUM PLUS NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- k++;
- assembler.push_back("RESET");
- long long number = strToInt(temp) + strToInt(temp1);
- loadACU(number);
- }
- | ID MINUS ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp]));
- k++;
- assembler.push_back("SUB "+numToStr(variables[temp1]));
- }
- | ID MINUS NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- }
- | NUM MINUS ID {
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("SUB "+ numToStr(variables[temp1]));
- }
- | NUM MINUS NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- k++;
- assembler.push_back("RESET");
- long long number = strToInt(temp) - strToInt(temp1);
- loadACU(number);
- }
- | ID TIMES ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET ");
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp]));
- k++;
- assembler.push_back("JZERO " + numToStr(k+7));
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("RESET ");
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("JUMP " + numToStr(k+6));
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("RESET ");
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE 1");
- //0-wynik
- //1-pierwsza y
- //2-druga x
- //3-jedynka
- k++;
- assembler.push_back("JZERO " + numToStr(k + 12)); //jeżeli jest 0 to koniec, mamy wynik
- k++;
- assembler.push_back("JODD " + numToStr(k + 1)); //jeżeli nieparzysta to do 0 dodajemy 1
- k++;
- assembler.push_back("JUMP " + numToStr(k + 3)); // jak jest parzysta to nie dodajemy
- k++;
- assembler.push_back("LOAD 0"); //ladujemy wynik
- k++;
- assembler.push_back("ADD 2"); //dodajemy druga czyli x
- k++;
- assembler.push_back("STORE 0"); //zapisujemy w wyniku
- k++;
- assembler.push_back("LOAD 2"); //ladujemy x
- k++;
- assembler.push_back("SHL 3"); //mnozymy x*2
- k++;
- assembler.push_back("STORE 2"); //zapisujemy w x
- k++;
- assembler.push_back("LOAD 1"); //ladujemy y
- k++;
- assembler.push_back("SHR 3"); //y dzielimy przez 2
- k++;
- assembler.push_back("STORE 1"); //zapisujemy
- k++;
- assembler.push_back("JUMP " + numToStr(k-13)); //teraz skaczemy do JZERO zeby sprawdzić czy y jest 0
- k++;
- assembler.push_back("LOAD 0");
- }
- |ID TIMES NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET ");
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("RESET ");
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("JZERO " + numToStr(k + 12)); //jeżeli jest 0 to koniec, mamy wynik
- k++;
- assembler.push_back("JODD " + numToStr(k + 1)); //jeżeli nieparzysta to do 0 dodajemy 1
- k++;
- assembler.push_back("JUMP " + numToStr(k + 3)); // jak jest parzysta to nie dodajemy
- k++;
- assembler.push_back("LOAD 0"); //ladujemy wynik
- k++;
- assembler.push_back("ADD 2"); //dodajemy druga czyli x
- k++;
- assembler.push_back("STORE 0"); //zapisujemy w wyniku
- k++;
- assembler.push_back("LOAD 2"); //ladujemy x
- k++;
- assembler.push_back("SHL 3"); //mnozymy x*2
- k++;
- assembler.push_back("STORE 2"); //zapisujemy w x
- k++;
- assembler.push_back("LOAD 1"); //ladujemy y
- k++;
- assembler.push_back("SHR 3"); //y dzielimy przez 2
- k++;
- assembler.push_back("STORE 1"); //zapisujemy
- k++;
- assembler.push_back("JUMP " + numToStr(k-13)); //teraz skaczemy do JZERO zeby sprawdzić czy y jest 0
- k++;
- assembler.push_back("LOAD 0");
- }
- |NUM TIMES ID{
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("JZERO " + numToStr(k + 12)); //jeżeli jest 0 to koniec, mamy wynik
- k++;
- assembler.push_back("JODD " + numToStr(k + 1)); //jeżeli nieparzysta to do 0 dodajemy 1
- k++;
- assembler.push_back("JUMP " + numToStr(k + 3)); // jak jest parzysta to nie dodajemy
- k++;
- assembler.push_back("LOAD 0"); //ladujemy wynik
- k++;
- assembler.push_back("ADD 2"); //dodajemy druga czyli x
- k++;
- assembler.push_back("STORE 0"); //zapisujemy w wyniku
- k++;
- assembler.push_back("LOAD 2"); //ladujemy x
- k++;
- assembler.push_back("SHL 3"); //mnozymy x*2
- k++;
- assembler.push_back("STORE 2"); //zapisujemy w x
- k++;
- assembler.push_back("LOAD 1"); //ladujemy y
- k++;
- assembler.push_back("SHR 3"); //y dzielimy przez 2
- k++;
- assembler.push_back("STORE 1"); //zapisujemy
- k++;
- assembler.push_back("JUMP " + numToStr(k-13)); //teraz skaczemy do JZERO zeby sprawdzić czy y jest 0
- k++;
- assembler.push_back("LOAD 0");
- }
- |NUM TIMES NUM{
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- k++;
- assembler.push_back("RESET");
- long long number = strToInt(temp) * strToInt(temp1);
- loadACU(number);
- }
- | ID DIV ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE " + numToStr(4));
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("JZERO " + numToStr(k+32));
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("SUB 1");
- k++;
- assembler.push_back("JZERO " + numToStr(k+8));
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SHL 4");
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("SHL 4");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("LOAD 0");
- k++;
- assembler.push_back("JUMP " + numToStr(k-10));
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("JZERO " + numToStr(k+17));
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SUB 0");
- k++;
- assembler.push_back("JZERO " + numToStr(k+1));
- k++;
- assembler.push_back("JUMP " + numToStr(k+6));
- k++;
- assembler.push_back("LOAD 3");
- k++;
- assembler.push_back("ADD 2");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("LOAD 0");
- k++;
- assembler.push_back("SUB 1");
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SHR 4");
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("SHR 4");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("JUMP " + numToStr(k-19));
- k++;
- assembler.push_back("LOAD 3");
- }
- |ID DIV NUM{
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE " + numToStr(4));
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("SUB 1");
- k++;
- assembler.push_back("JZERO " + numToStr(k+8));
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SHL 4");
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("SHL 4");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("LOAD 0");
- k++;
- assembler.push_back("JUMP " + numToStr(k-10));
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("JZERO " + numToStr(k+17));
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SUB 0");
- k++;
- assembler.push_back("JZERO " + numToStr(k+1));
- k++;
- assembler.push_back("JUMP " + numToStr(k+6));
- k++;
- assembler.push_back("LOAD 3");
- k++;
- assembler.push_back("ADD 2");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("LOAD 0");
- k++;
- assembler.push_back("SUB 1");
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SHR 4");
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("SHR 4");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("JUMP " + numToStr(k-18));
- k++;
- assembler.push_back("LOAD 3");
- }
- |NUM DIV ID{
- string temp(numToStr$<num>1);
- string temp1(($<idi>3));
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE " + numToStr(4));
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE 1");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("SUB 1");
- k++;
- assembler.push_back("JZERO " + numToStr(k+8));
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SHL 4");
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("SHL 4");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("LOAD 0");
- k++;
- assembler.push_back("JUMP " + numToStr(k-10));
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("JZERO " + numToStr(k+17));
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SUB 0");
- k++;
- assembler.push_back("JZERO " + numToStr(k+1));
- k++;
- assembler.push_back("JUMP " + numToStr(k+6));
- k++;
- assembler.push_back("LOAD 3");
- k++;
- assembler.push_back("ADD 2");
- k++;
- assembler.push_back("STORE 3");
- k++;
- assembler.push_back("LOAD 0");
- k++;
- assembler.push_back("SUB 1");
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD 1");
- k++;
- assembler.push_back("SHR 4");
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD 2");
- k++;
- assembler.push_back("SHR 4");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("JUMP " + numToStr(k-18));
- k++;
- assembler.push_back("LOAD 3");
- }
- |NUM DIV NUM{
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp) != 0 && strToInt(temp1) != 0)
- {
- long long number = strToInt(temp) / strToInt(temp1);
- loadACU(number);
- }
- }
- | ID MOD ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 4");
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("LOAD "+ numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("LOAD "+ numToStr(variables[temp]));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("JZERO "+ numToStr( k+8));
- k++;
- assembler.push_back("LOAD "+ numToStr( 1));
- k++;
- assembler.push_back("SHL "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("LOAD "+ numToStr( 2));
- k++;
- assembler.push_back("SHL "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(2));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- k++;
- assembler.push_back("JUMP "+ numToStr(k-11));
- k++;
- assembler.push_back("LOAD "+ numToStr( 0));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("JZERO "+ numToStr(k+3));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("LOAD "+ numToStr( 1));
- k++;
- assembler.push_back("SHR "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("LOAD "+ numToStr( 2));
- k++;
- assembler.push_back("SHR "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(2));
- k++;
- assembler.push_back("JZERO "+ numToStr(k+1));
- k++;
- assembler.push_back("JUMP "+ numToStr(k-15));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- }
- | ID MOD NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 4");
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("LOAD "+ numToStr(variables[temp]));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("JZERO "+ numToStr( k+8));
- k++;
- assembler.push_back("LOAD "+ numToStr( 1));
- k++;
- assembler.push_back("SHL "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("LOAD "+ numToStr( 2));
- k++;
- assembler.push_back("SHL "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(2));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- k++;
- assembler.push_back("JUMP "+ numToStr(k-11));
- k++;
- assembler.push_back("LOAD "+ numToStr( 0));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("JZERO "+ numToStr(k+3));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("LOAD "+ numToStr( 1));
- k++;
- assembler.push_back("SHR "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("LOAD "+ numToStr( 2));
- k++;
- assembler.push_back("SHR "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(2));
- k++;
- assembler.push_back("JZERO "+ numToStr(k+1));
- k++;
- assembler.push_back("JUMP "+ numToStr(k-15));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- }
- | NUM MOD ID {
- string temp(numToStr($<num>1));
- string temp1(($<idi>3));
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 4");
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("INC");
- k++;
- assembler.push_back("STORE 2");
- k++;
- assembler.push_back("LOAD "+ numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("JZERO "+ numToStr( k+8));
- k++;
- assembler.push_back("LOAD "+ numToStr( 1));
- k++;
- assembler.push_back("SHL "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("LOAD "+ numToStr( 2));
- k++;
- assembler.push_back("SHL "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(2));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- k++;
- assembler.push_back("JUMP "+ numToStr(k-11));
- k++;
- assembler.push_back("LOAD "+ numToStr( 0));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("JZERO "+ numToStr(k+3));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("LOAD "+ numToStr( 1));
- k++;
- assembler.push_back("SHR "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(1));
- k++;
- assembler.push_back("LOAD "+ numToStr( 2));
- k++;
- assembler.push_back("SHR "+ numToStr(4));
- k++;
- assembler.push_back("STORE "+ numToStr(2));
- k++;
- assembler.push_back("JZERO "+ numToStr(k+1));
- k++;
- assembler.push_back("JUMP "+ numToStr(k-15));
- k++;
- assembler.push_back("LOAD "+ numToStr(0));
- }
- | NUM MOD NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp) != 0 && strToInt(temp1) != 0)
- {
- long long number = strToInt(temp) % strToInt(temp1);
- loadACU(number);
- }
- }
- value:
- NUM {
- string temp(numToStr($<num>1));
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- }
- | ID {
- string temp($<idi>1);
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp]));
- free($<idi>1);
- }
- condition:
- ID EQ ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp]));
- k++;
- assembler.push_back("SUB "+numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("SUB "+numToStr(variables[temp]));
- k++;
- assembler.push_back("ADD 0");
- k++;
- assembler.push_back("JZERO " + numToStr(k+1));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JUMP ");
- }
- | ID EQ NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("STORE 0"); //tutaj jest liczba
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp]));
- k++;
- assembler.push_back("STORE 1"); //wynik pierwszego odejmowania
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("SUB 0");
- k++;
- assembler.push_back("ADD 1");
- k++;
- assembler.push_back("JZERO " + numToStr(k+1));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JUMP ");
- }
- | NUM EQ ID {
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("STORE 0"); //tutaj jest liczba- pierwsza
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE 1"); //wynik pierwszego odejmowania
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("SUB 0");
- k++;
- assembler.push_back("ADD 1");
- k++;
- assembler.push_back("JZERO " + numToStr(k+1));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JUMP ");
- }
- | NUM EQ NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- if(!(strToInt(temp) == strToInt(temp1)))
- {
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 0");
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | ID DIFF ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET ");
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp]));
- k++;
- assembler.push_back("SUB "+ numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp1]));
- k++;
- assembler.push_back("SUB "+ numToStr(variables[temp]));
- k++;
- assembler.push_back("ADD "+numToStr(0));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO " );
- }
- | ID DIFF NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("STORE 1");
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp]));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("LOAD "+numToStr(1));
- k++;
- assembler.push_back("SUB "+ numToStr(variables[temp]));
- k++;
- assembler.push_back("ADD "+numToStr(0));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | NUM DIFF ID {
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("STORE 1");
- stacks.push(k);
- k++;
- assembler.push_back("SUB "+ numToStr(variables[temp1]));
- k++;
- assembler.push_back("STORE "+ numToStr(0));
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp1]));
- k++;
- assembler.push_back("SUB "+ numToStr(1));
- k++;
- assembler.push_back("ADD "+numToStr(0));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | NUM DIFF NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- if(strToInt(temp) == strToInt(temp1))
- {
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 0");
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | ID LE ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("LOAD "+numToStr(variables[temp1]));
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp]));
- stacks.push(assembler.size());
- k++;
- assembler.push_back( "JZERO ");
- }
- | ID LE NUM{
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp]));
- stacks.push(assembler.size());
- k++;
- assembler.push_back( "JZERO ");
- }
- | NUM LE ID{
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("STORE " + numToStr(0));
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("SUB "+numToStr(0));
- stacks.push(assembler.size());
- k++;
- assembler.push_back( "JZERO ");
- }
- | NUM LE NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- if(!(strToInt(temp) > strToInt(temp1)))
- {
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 0");
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | ID GE ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("LOAD " +numToStr(variables[temp]));
- k++;
- assembler.push_back("SUB "+numToStr(variables[temp1]));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | ID GE NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("STORE " + numToStr(0));
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("SUB "+numToStr(0));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | NUM GE ID {
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp1]));
- stacks.push(assembler.size());
- k++;
- assembler.push_back( "JZERO ");
- }
- | NUM GE NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- if(!(strToInt(temp) < strToInt(temp1)))
- {
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 0");
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | ID LEQ ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp]));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | ID LEQ NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>=0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp]));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | NUM LEQ ID {
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>=0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp1]));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB " + numToStr(0));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | NUM LEQ NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- if(!(strToInt(temp) <= strToInt(temp1)))
- {
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 0");
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | ID GEQ ID {
- string temp($<idi>1);
- string temp1($<idi>3);
- checkVariables(temp);
- checkVariables(temp1);
- if(init[temp] == 0 || init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp1]));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | ID GEQ NUM {
- string temp($<idi>1);
- string temp1(numToStr($<num>3));
- checkVariables(temp);
- if(init[temp] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp1)>0)
- loadACU(strToInt(temp1));
- k++;
- assembler.push_back("STORE 0");
- k++;
- assembler.push_back("LOAD " + numToStr(variables[temp]));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB " + numToStr(0));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | NUM GEQ ID {
- string temp(numToStr($<num>1));
- string temp1($<idi>3);
- checkVariables(temp1);
- if(init[temp1] == 0)
- {
- yyerror("Variable is not initialized!");
- exit(1);
- }
- k++;
- assembler.push_back("RESET");
- if(strToInt(temp)>0)
- loadACU(strToInt(temp));
- k++;
- assembler.push_back("INC ");
- k++;
- assembler.push_back("SUB " + numToStr(variables[temp1]));
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- | NUM GEQ NUM {
- string temp(numToStr($<num>1));
- string temp1(numToStr($<num>3));
- if(!(strToInt(temp) >= strToInt(temp1)))
- {
- k++;
- assembler.push_back("RESET");
- k++;
- assembler.push_back("STORE 0");
- }
- stacks.push(assembler.size());
- k++;
- assembler.push_back("JZERO ");
- }
- ;
- %%
- void yyerror(char const *s)
- {
- fprintf(stderr,"Error: %s\n", s);
- assembler.clear();
- }
- int main()
- {
- yyparse();
- int i;
- for(i = 0; i<assembler.size(); i++)
- {
- cout << assembler[i] << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement