Advertisement
Guest User

Untitled

a guest
Jan 26th, 2015
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 55.01 KB | None | 0 0
  1. %{
  2. #include <iostream>
  3. #include <stack>
  4. #include <map>
  5. #include <string>
  6. #include <sstream>
  7. #include <vector>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <math.h>
  11. #include <gmpxx.h>
  12. #include <gmp.h>
  13.  
  14.  
  15. using namespace std;
  16. void yyerror(char const *);
  17. long long memory = 5;
  18. long long a = 0;
  19. long long k = 0;
  20.  
  21. int yylex();
  22.  
  23. map<string,long long> variables;
  24. vector<string> assembler;
  25. stack<long long> stacks;
  26. vector<long long> p;
  27. map<string, int> init;
  28.  
  29.  
  30.  
  31. int strToInt(string n)
  32. {
  33. int number = atoi(n.c_str());
  34. return number;
  35. }
  36.  
  37. template <class T>
  38. inline string numToStr(const T& t)
  39. {
  40. stringstream out;
  41. out << t;
  42. return out.str();
  43. }
  44.  
  45. void checkVariables(string S)
  46. {
  47. if(variables.count(S) == 0)
  48. {
  49. yyerror("Unknown ID");
  50. exit(1);
  51. }
  52. }
  53.  
  54. bool isExist(string S)
  55. {
  56. if(variables[S])
  57. return false;
  58. else
  59. return true;
  60. }
  61.  
  62. void loadACU(long long number)
  63. {
  64. k++;
  65. assembler.push_back("INC");
  66.  
  67. k++;
  68. assembler.push_back("STORE " + numToStr(0));
  69.  
  70. long long no_bits = floor(log2(number)+1);
  71. long long tab[no_bits];
  72. long long mask = 1;
  73. long long i;
  74. for(i = 0; i <= no_bits; i++)
  75. {
  76. if((mask&number) >= 1)
  77. tab[i] = 1;
  78. else
  79. tab[i] = 0;
  80. mask<<=1;
  81. }
  82. for(i = no_bits-2; i >= 0; i--)
  83. {
  84. if(tab[i] == 1)
  85. {
  86. k++;
  87. assembler.push_back("SHL "+numToStr(0));
  88. k++;
  89. assembler.push_back("INC");
  90. }
  91. else
  92. {
  93. k++;
  94. assembler.push_back("SHL "+numToStr(0));
  95. }
  96. }
  97. }
  98.  
  99. %}
  100.  
  101. %union
  102. {
  103. char *idi;
  104. long long num;
  105. }
  106.  
  107.  
  108.  
  109. %token DECLARE
  110. %token IN
  111. %token END
  112. %token ASSIGN
  113. %token IF
  114. %token THEN
  115. %token ELSE
  116. %token ENDIF
  117. %token WHILE
  118. %token DO
  119. %token ENDWHILE
  120. %token GET
  121. %token PUT
  122. %token PLUS
  123. %token MINUS
  124. %token TIMES
  125. %token DIV
  126. %token MOD
  127. %token EQ
  128. %token DIFF
  129. %token LE
  130. %token GE
  131. %token LEQ
  132. %token GEQ
  133. %token SEMICOLON
  134. %token <idi> ID
  135. %token <num> NUM
  136. %token ERROR
  137. %%
  138.  
  139. assembler: DECLARE vdeclarations IN commands END {
  140.  
  141. assembler.push_back("HALT");
  142. }
  143.  
  144.  
  145. vdeclarations:
  146. | vdeclarations ID {
  147. string temp($<idi>2);
  148. if(variables.count(temp) > 0)
  149. {
  150. yyerror("Double declaration!");
  151. exit(1);
  152. }
  153. else
  154. {
  155. variables[temp] = memory;
  156. memory++;
  157. p.resize(memory);
  158. free($<idi>2);
  159. }
  160. }
  161. ;
  162.  
  163. commands:
  164. | commands command
  165. ;
  166.  
  167. command:
  168. ID ASSIGN expression SEMICOLON {
  169. string temp($<idi>1);
  170. if(variables.count(temp) == 0)
  171. {
  172. yyerror("Unknown ID");
  173. exit(1);
  174. }
  175. else
  176. {
  177. k++;
  178. assembler.push_back("STORE " + numToStr(variables[temp]));
  179. init[temp] = 1;
  180. //free($<idi>1);
  181. }
  182. }
  183.  
  184. | IF condition THEN commands ENDIF {
  185. //cout<<stacks.top()<<endl;
  186. assembler[stacks.top()] = assembler[stacks.top()] + numToStr(assembler.size());
  187. stacks.pop();
  188. stacks.pop();
  189. }
  190.  
  191. | IF condition THEN commands else commands ENDIF {
  192. assembler[stacks.top()] = assembler[stacks.top()]+numToStr(assembler.size());
  193. stacks.pop();
  194. stacks.pop();
  195. }
  196.  
  197. | WHILE condition DO commands ENDWHILE {
  198. assembler[stacks.top()] += numToStr( assembler.size()+1 );
  199. stacks.pop();
  200. k++;
  201. assembler.push_back( "JUMP " + numToStr( stacks.top() ) );
  202. stacks.pop();
  203. }
  204.  
  205. | GET ID SEMICOLON {
  206. string temp($<idi>2);
  207. checkVariables(temp);
  208.  
  209. k++;
  210. assembler.push_back("READ");
  211.  
  212. k++;
  213. assembler.push_back("STORE " + numToStr(variables[temp]));
  214.  
  215. init[temp] = 1;
  216. free($<idi>2);
  217. }
  218.  
  219. | PUT ID SEMICOLON {
  220. string temp($<idi>2);
  221. checkVariables(temp);
  222.  
  223. if(init[temp] == 0)
  224. {
  225. yyerror("Variable is not initialized!");
  226. exit(1);
  227. }
  228.  
  229. k++;
  230. assembler.push_back("LOAD " + numToStr(variables[temp]));
  231. k++;
  232. assembler.push_back("WRITE");
  233. }
  234.  
  235. | PUT NUM SEMICOLON {
  236. string temp(numToStr($<num>2));
  237.  
  238. k++;
  239. assembler.push_back("RESET");
  240. if(strToInt(temp) > 0)
  241. loadACU(strToInt(temp));
  242.  
  243. k++;
  244. assembler.push_back("WRITE");
  245. }
  246. else: ELSE {
  247. assembler[stacks.top()] += numToStr( assembler.size()+1 );
  248. stacks.pop();
  249. stacks.push( assembler.size());
  250. k++;
  251. assembler.push_back( "JUMP " );
  252. }
  253.  
  254. expression:
  255. | value
  256. | ID PLUS ID {
  257. string temp($<idi>1);
  258. string temp1($<idi>3);
  259.  
  260. checkVariables(temp);
  261. checkVariables(temp1);
  262.  
  263. if(init[temp] == 0 || init[temp1] == 0)
  264. {
  265. yyerror("Variable is not initialized!");
  266. exit(1);
  267. }
  268.  
  269. k++;
  270. assembler.push_back("LOAD "+numToStr(variables[temp]));
  271.  
  272. k++;
  273. assembler.push_back("ADD "+numToStr(variables[temp1]));
  274. }
  275. | ID PLUS NUM {
  276. string temp($<idi>1);
  277. string temp1(numToStr($<num>3));
  278. checkVariables(temp);
  279.  
  280. if(init[temp] == 0)
  281. {
  282. yyerror("Variable is not initialized!");
  283. exit(1);
  284. }
  285.  
  286. k++;
  287. assembler.push_back("RESET");
  288.  
  289. loadACU(strToInt(temp1));
  290.  
  291. k++;
  292. assembler.push_back("ADD "+ numToStr(variables[temp]));
  293. }
  294. | NUM PLUS ID {
  295. string temp(numToStr($<num>1));
  296. string temp1($<idi>3);
  297. checkVariables(temp1);
  298.  
  299. if(init[temp1] == 0)
  300. {
  301. yyerror("Variable is not initialized!");
  302. exit(1);
  303. }
  304.  
  305. k++;
  306. assembler.push_back("RESET");
  307.  
  308. loadACU(strToInt(temp));
  309.  
  310. k++;
  311. assembler.push_back("ADD "+ numToStr(variables[temp1]));
  312. }
  313. | NUM PLUS NUM {
  314. string temp(numToStr($<num>1));
  315. string temp1(numToStr($<num>3));
  316. k++;
  317. assembler.push_back("RESET");
  318.  
  319. long long number = strToInt(temp) + strToInt(temp1);
  320. loadACU(number);
  321. }
  322.  
  323. | ID MINUS ID {
  324. string temp($<idi>1);
  325. string temp1($<idi>3);
  326.  
  327. checkVariables(temp);
  328. checkVariables(temp1);
  329.  
  330. if(init[temp] == 0 || init[temp1] == 0)
  331. {
  332. yyerror("Variable is not initialized!");
  333. exit(1);
  334. }
  335.  
  336. k++;
  337. assembler.push_back("LOAD "+numToStr(variables[temp]));
  338.  
  339. k++;
  340. assembler.push_back("SUB "+numToStr(variables[temp1]));
  341. }
  342. | ID MINUS NUM {
  343. string temp($<idi>1);
  344. string temp1(numToStr($<num>3));
  345.  
  346. checkVariables(temp);
  347.  
  348. if(init[temp] == 0)
  349. {
  350. yyerror("Variable is not initialized!");
  351. exit(1);
  352. }
  353.  
  354. k++;
  355. assembler.push_back("RESET");
  356.  
  357. loadACU(strToInt(temp1));
  358.  
  359. k++;
  360. assembler.push_back("STORE 1");
  361.  
  362. k++;
  363. assembler.push_back("LOAD " + numToStr(variables[temp]));
  364.  
  365. k++;
  366. assembler.push_back("SUB "+ numToStr(1));
  367. }
  368. | NUM MINUS ID {
  369. string temp(numToStr($<num>1));
  370. string temp1($<idi>3);
  371.  
  372. checkVariables(temp1);
  373.  
  374. if(init[temp1] == 0)
  375. {
  376. yyerror("Variable is not initialized!");
  377. exit(1);
  378. }
  379.  
  380. k++;
  381. assembler.push_back("RESET");
  382.  
  383. loadACU(strToInt(temp));
  384.  
  385. k++;
  386. assembler.push_back("SUB "+ numToStr(variables[temp1]));
  387. }
  388. | NUM MINUS NUM {
  389. string temp(numToStr($<num>1));
  390. string temp1(numToStr($<num>3));
  391.  
  392. k++;
  393. assembler.push_back("RESET");
  394.  
  395. long long number = strToInt(temp) - strToInt(temp1);
  396. loadACU(number);
  397. }
  398. | ID TIMES ID {
  399. string temp($<idi>1);
  400. string temp1($<idi>3);
  401. checkVariables(temp);
  402. checkVariables(temp1);
  403.  
  404. if(init[temp] == 0 || init[temp1] == 0)
  405. {
  406. yyerror("Variable is not initialized!");
  407. exit(1);
  408. }
  409.  
  410. k++;
  411. assembler.push_back("RESET ");
  412. k++;
  413. assembler.push_back("INC ");
  414. k++;
  415. assembler.push_back("STORE 3");
  416.  
  417. k++;
  418. assembler.push_back("RESET");
  419.  
  420. k++;
  421. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  422.  
  423. k++;
  424. assembler.push_back("SUB " + numToStr(variables[temp]));
  425.  
  426. k++;
  427. assembler.push_back("JZERO " + numToStr(k+7));
  428.  
  429.  
  430.  
  431.  
  432. k++;
  433. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  434.  
  435. k++;
  436. assembler.push_back("STORE 2");
  437.  
  438. k++;
  439. assembler.push_back("RESET ");
  440.  
  441. k++;
  442. assembler.push_back("STORE 0");
  443.  
  444. k++;
  445. assembler.push_back("LOAD " + numToStr(variables[temp]));
  446.  
  447. k++;
  448. assembler.push_back("STORE 1");
  449.  
  450.  
  451. k++;
  452. assembler.push_back("JUMP " + numToStr(k+6));
  453.  
  454. k++;
  455. assembler.push_back("LOAD " + numToStr(variables[temp]));
  456.  
  457. k++;
  458. assembler.push_back("STORE 2");
  459.  
  460. k++;
  461. assembler.push_back("RESET ");
  462.  
  463. k++;
  464. assembler.push_back("STORE 0");
  465.  
  466. k++;
  467. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  468.  
  469. k++;
  470. assembler.push_back("STORE 1");
  471.  
  472.  
  473.  
  474. //0-wynik
  475. //1-pierwsza y
  476. //2-druga x
  477. //3-jedynka
  478.  
  479.  
  480.  
  481. k++;
  482. assembler.push_back("JZERO " + numToStr(k + 12)); //jeżeli jest 0 to koniec, mamy wynik
  483.  
  484. k++;
  485. assembler.push_back("JODD " + numToStr(k + 1)); //jeżeli nieparzysta to do 0 dodajemy 1
  486.  
  487. k++;
  488. assembler.push_back("JUMP " + numToStr(k + 3)); // jak jest parzysta to nie dodajemy
  489.  
  490. k++;
  491. assembler.push_back("LOAD 0"); //ladujemy wynik
  492.  
  493. k++;
  494. assembler.push_back("ADD 2"); //dodajemy druga czyli x
  495.  
  496. k++;
  497. assembler.push_back("STORE 0"); //zapisujemy w wyniku
  498.  
  499. k++;
  500. assembler.push_back("LOAD 2"); //ladujemy x
  501.  
  502. k++;
  503. assembler.push_back("SHL 3"); //mnozymy x*2
  504.  
  505. k++;
  506. assembler.push_back("STORE 2"); //zapisujemy w x
  507.  
  508. k++;
  509. assembler.push_back("LOAD 1"); //ladujemy y
  510.  
  511. k++;
  512. assembler.push_back("SHR 3"); //y dzielimy przez 2
  513.  
  514. k++;
  515. assembler.push_back("STORE 1"); //zapisujemy
  516.  
  517. k++;
  518. assembler.push_back("JUMP " + numToStr(k-13)); //teraz skaczemy do JZERO zeby sprawdzić czy y jest 0
  519. k++;
  520. assembler.push_back("LOAD 0");
  521.  
  522. }
  523. |ID TIMES NUM {
  524. string temp($<idi>1);
  525. string temp1(numToStr($<num>3));
  526. checkVariables(temp);
  527.  
  528. if(init[temp] == 0)
  529. {
  530. yyerror("Variable is not initialized!");
  531. exit(1);
  532. }
  533.  
  534. k++;
  535. assembler.push_back("RESET ");
  536. k++;
  537. assembler.push_back("INC ");
  538. k++;
  539. assembler.push_back("STORE 3");
  540.  
  541. k++;
  542. assembler.push_back("RESET");
  543.  
  544. if(strToInt(temp1)>0)
  545. loadACU(strToInt(temp1));
  546.  
  547. k++;
  548. assembler.push_back("STORE 2");
  549.  
  550. k++;
  551. assembler.push_back("RESET ");
  552.  
  553. k++;
  554. assembler.push_back("STORE 0");
  555.  
  556. k++;
  557. assembler.push_back("LOAD " + numToStr(variables[temp]));
  558.  
  559. k++;
  560. assembler.push_back("STORE 1");
  561.  
  562.  
  563.  
  564. k++;
  565. assembler.push_back("JZERO " + numToStr(k + 12)); //jeżeli jest 0 to koniec, mamy wynik
  566.  
  567. k++;
  568. assembler.push_back("JODD " + numToStr(k + 1)); //jeżeli nieparzysta to do 0 dodajemy 1
  569.  
  570. k++;
  571. assembler.push_back("JUMP " + numToStr(k + 3)); // jak jest parzysta to nie dodajemy
  572.  
  573. k++;
  574. assembler.push_back("LOAD 0"); //ladujemy wynik
  575.  
  576. k++;
  577. assembler.push_back("ADD 2"); //dodajemy druga czyli x
  578.  
  579. k++;
  580. assembler.push_back("STORE 0"); //zapisujemy w wyniku
  581.  
  582. k++;
  583. assembler.push_back("LOAD 2"); //ladujemy x
  584.  
  585. k++;
  586. assembler.push_back("SHL 3"); //mnozymy x*2
  587.  
  588. k++;
  589. assembler.push_back("STORE 2"); //zapisujemy w x
  590.  
  591. k++;
  592. assembler.push_back("LOAD 1"); //ladujemy y
  593.  
  594. k++;
  595. assembler.push_back("SHR 3"); //y dzielimy przez 2
  596.  
  597. k++;
  598. assembler.push_back("STORE 1"); //zapisujemy
  599.  
  600. k++;
  601. assembler.push_back("JUMP " + numToStr(k-13)); //teraz skaczemy do JZERO zeby sprawdzić czy y jest 0
  602. k++;
  603. assembler.push_back("LOAD 0");
  604. }
  605. |NUM TIMES ID{
  606. string temp(numToStr($<num>1));
  607. string temp1($<idi>3);
  608. checkVariables(temp1);
  609.  
  610. if(init[temp1] == 0)
  611. {
  612. yyerror("Variable is not initialized!");
  613. exit(1);
  614. }
  615.  
  616. k++;
  617. assembler.push_back("RESET");
  618. k++;
  619. assembler.push_back("INC");
  620. k++;
  621. assembler.push_back("STORE 3");
  622.  
  623. k++;
  624. assembler.push_back("RESET");
  625.  
  626. if(strToInt(temp)>0)
  627. loadACU(strToInt(temp));
  628.  
  629. k++;
  630. assembler.push_back("STORE 2");
  631.  
  632. k++;
  633. assembler.push_back("RESET");
  634.  
  635. k++;
  636. assembler.push_back("STORE 0");
  637.  
  638. k++;
  639. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  640.  
  641. k++;
  642. assembler.push_back("STORE 1");
  643.  
  644. k++;
  645. assembler.push_back("JZERO " + numToStr(k + 12)); //jeżeli jest 0 to koniec, mamy wynik
  646.  
  647. k++;
  648. assembler.push_back("JODD " + numToStr(k + 1)); //jeżeli nieparzysta to do 0 dodajemy 1
  649.  
  650. k++;
  651. assembler.push_back("JUMP " + numToStr(k + 3)); // jak jest parzysta to nie dodajemy
  652.  
  653. k++;
  654. assembler.push_back("LOAD 0"); //ladujemy wynik
  655.  
  656. k++;
  657. assembler.push_back("ADD 2"); //dodajemy druga czyli x
  658.  
  659. k++;
  660. assembler.push_back("STORE 0"); //zapisujemy w wyniku
  661.  
  662. k++;
  663. assembler.push_back("LOAD 2"); //ladujemy x
  664.  
  665. k++;
  666. assembler.push_back("SHL 3"); //mnozymy x*2
  667.  
  668. k++;
  669. assembler.push_back("STORE 2"); //zapisujemy w x
  670.  
  671. k++;
  672. assembler.push_back("LOAD 1"); //ladujemy y
  673.  
  674. k++;
  675. assembler.push_back("SHR 3"); //y dzielimy przez 2
  676.  
  677. k++;
  678. assembler.push_back("STORE 1"); //zapisujemy
  679.  
  680. k++;
  681. assembler.push_back("JUMP " + numToStr(k-13)); //teraz skaczemy do JZERO zeby sprawdzić czy y jest 0
  682.  
  683. k++;
  684. assembler.push_back("LOAD 0");
  685. }
  686. |NUM TIMES NUM{
  687. string temp(numToStr($<num>1));
  688. string temp1(numToStr($<num>3));
  689.  
  690. k++;
  691. assembler.push_back("RESET");
  692.  
  693. long long number = strToInt(temp) * strToInt(temp1);
  694.  
  695. loadACU(number);
  696. }
  697. | ID DIV ID {
  698. string temp($<idi>1);
  699. string temp1($<idi>3);
  700. checkVariables(temp);
  701. checkVariables(temp1);
  702.  
  703. if(init[temp] == 0 || init[temp1] == 0)
  704. {
  705. yyerror("Variable is not initialized!");
  706. exit(1);
  707. }
  708.  
  709. k++;
  710. assembler.push_back("RESET");
  711. k++;
  712. assembler.push_back("INC");
  713. k++;
  714. assembler.push_back("STORE " + numToStr(4));
  715.  
  716. k++;
  717. assembler.push_back("RESET");
  718. k++;
  719. assembler.push_back("STORE 3");
  720. k++;
  721. assembler.push_back("INC");
  722. k++;
  723. assembler.push_back("STORE 2");
  724. k++;
  725. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  726. k++;
  727. assembler.push_back("JZERO " + numToStr(k+32));
  728. k++;
  729. assembler.push_back("STORE 1");
  730.  
  731.  
  732.  
  733. k++;
  734. assembler.push_back("LOAD " + numToStr(variables[temp]));
  735. k++;
  736. assembler.push_back("STORE 0");
  737.  
  738.  
  739.  
  740. k++;
  741. assembler.push_back("SUB 1");
  742. k++;
  743. assembler.push_back("JZERO " + numToStr(k+8));
  744. k++;
  745. assembler.push_back("LOAD 1");
  746. k++;
  747. assembler.push_back("SHL 4");
  748. k++;
  749. assembler.push_back("STORE 1");
  750. k++;
  751. assembler.push_back("LOAD 2");
  752. k++;
  753. assembler.push_back("SHL 4");
  754. k++;
  755. assembler.push_back("STORE 2");
  756. k++;
  757. assembler.push_back("LOAD 0");
  758. k++;
  759. assembler.push_back("JUMP " + numToStr(k-10));
  760.  
  761.  
  762. k++;
  763. assembler.push_back("LOAD 2");
  764. k++;
  765. assembler.push_back("JZERO " + numToStr(k+17));
  766. k++;
  767. assembler.push_back("LOAD 1");
  768. k++;
  769. assembler.push_back("SUB 0");
  770. k++;
  771. assembler.push_back("JZERO " + numToStr(k+1));
  772. k++;
  773. assembler.push_back("JUMP " + numToStr(k+6));
  774. k++;
  775. assembler.push_back("LOAD 3");
  776. k++;
  777. assembler.push_back("ADD 2");
  778. k++;
  779. assembler.push_back("STORE 3");
  780. k++;
  781. assembler.push_back("LOAD 0");
  782. k++;
  783. assembler.push_back("SUB 1");
  784. k++;
  785. assembler.push_back("STORE 0");
  786. k++;
  787. assembler.push_back("LOAD 1");
  788. k++;
  789. assembler.push_back("SHR 4");
  790. k++;
  791. assembler.push_back("STORE 1");
  792. k++;
  793. assembler.push_back("LOAD 2");
  794. k++;
  795. assembler.push_back("SHR 4");
  796. k++;
  797. assembler.push_back("STORE 2");
  798. k++;
  799. assembler.push_back("JUMP " + numToStr(k-19));
  800. k++;
  801. assembler.push_back("LOAD 3");
  802.  
  803. }
  804. |ID DIV NUM{
  805. string temp($<idi>1);
  806. string temp1(numToStr($<num>3));
  807. checkVariables(temp);
  808.  
  809. if(init[temp] == 0)
  810. {
  811. yyerror("Variable is not initialized!");
  812. exit(1);
  813. }
  814.  
  815. k++;
  816. assembler.push_back("RESET");
  817. k++;
  818. assembler.push_back("INC");
  819. k++;
  820. assembler.push_back("STORE " + numToStr(4));
  821.  
  822. k++;
  823. assembler.push_back("RESET");
  824. k++;
  825. assembler.push_back("STORE 3");
  826. k++;
  827. assembler.push_back("INC");
  828. k++;
  829. assembler.push_back("STORE 2");
  830.  
  831.  
  832. k++;
  833. assembler.push_back("RESET");
  834.  
  835. if(strToInt(temp1)>0)
  836. loadACU(strToInt(temp1));
  837.  
  838. k++;
  839. assembler.push_back("STORE 1");
  840.  
  841.  
  842.  
  843. k++;
  844. assembler.push_back("LOAD " + numToStr(variables[temp]));
  845. k++;
  846. assembler.push_back("STORE 0");
  847. k++;
  848. assembler.push_back("SUB 1");
  849. k++;
  850. assembler.push_back("JZERO " + numToStr(k+8));
  851. k++;
  852. assembler.push_back("LOAD 1");
  853. k++;
  854. assembler.push_back("SHL 4");
  855. k++;
  856. assembler.push_back("STORE 1");
  857. k++;
  858. assembler.push_back("LOAD 2");
  859. k++;
  860. assembler.push_back("SHL 4");
  861. k++;
  862. assembler.push_back("STORE 2");
  863. k++;
  864. assembler.push_back("LOAD 0");
  865. k++;
  866. assembler.push_back("JUMP " + numToStr(k-10));
  867.  
  868.  
  869. k++;
  870. assembler.push_back("LOAD 2");
  871. k++;
  872. assembler.push_back("JZERO " + numToStr(k+17));
  873. k++;
  874. assembler.push_back("LOAD 1");
  875. k++;
  876. assembler.push_back("SUB 0");
  877. k++;
  878. assembler.push_back("JZERO " + numToStr(k+1));
  879. k++;
  880. assembler.push_back("JUMP " + numToStr(k+6));
  881. k++;
  882. assembler.push_back("LOAD 3");
  883. k++;
  884. assembler.push_back("ADD 2");
  885. k++;
  886. assembler.push_back("STORE 3");
  887. k++;
  888. assembler.push_back("LOAD 0");
  889. k++;
  890. assembler.push_back("SUB 1");
  891. k++;
  892. assembler.push_back("STORE 0");
  893. k++;
  894. assembler.push_back("LOAD 1");
  895. k++;
  896. assembler.push_back("SHR 4");
  897. k++;
  898. assembler.push_back("STORE 1");
  899. k++;
  900. assembler.push_back("LOAD 2");
  901. k++;
  902. assembler.push_back("SHR 4");
  903. k++;
  904. assembler.push_back("STORE 2");
  905. k++;
  906. assembler.push_back("JUMP " + numToStr(k-18));
  907. k++;
  908. assembler.push_back("LOAD 3");
  909. }
  910. |NUM DIV ID{
  911. string temp(numToStr$<num>1);
  912. string temp1(($<idi>3));
  913. checkVariables(temp1);
  914.  
  915. if(init[temp1] == 0)
  916. {
  917. yyerror("Variable is not initialized!");
  918. exit(1);
  919. }
  920.  
  921. k++;
  922. assembler.push_back("RESET");
  923. k++;
  924. assembler.push_back("INC");
  925. k++;
  926. assembler.push_back("STORE " + numToStr(4));
  927.  
  928. k++;
  929. assembler.push_back("RESET");
  930. k++;
  931. assembler.push_back("STORE 3");
  932. k++;
  933. assembler.push_back("INC");
  934. k++;
  935. assembler.push_back("STORE 2");
  936. k++;
  937. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  938. k++;
  939. assembler.push_back("STORE 1");
  940.  
  941.  
  942.  
  943. if(strToInt(temp)>0)
  944. loadACU(strToInt(temp));
  945. k++;
  946. assembler.push_back("STORE 0");
  947.  
  948.  
  949.  
  950. k++;
  951. assembler.push_back("SUB 1");
  952. k++;
  953. assembler.push_back("JZERO " + numToStr(k+8));
  954. k++;
  955. assembler.push_back("LOAD 1");
  956. k++;
  957. assembler.push_back("SHL 4");
  958. k++;
  959. assembler.push_back("STORE 1");
  960. k++;
  961. assembler.push_back("LOAD 2");
  962. k++;
  963. assembler.push_back("SHL 4");
  964. k++;
  965. assembler.push_back("STORE 2");
  966. k++;
  967. assembler.push_back("LOAD 0");
  968. k++;
  969. assembler.push_back("JUMP " + numToStr(k-10));
  970.  
  971.  
  972. k++;
  973. assembler.push_back("LOAD 2");
  974. k++;
  975. assembler.push_back("JZERO " + numToStr(k+17));
  976. k++;
  977. assembler.push_back("LOAD 1");
  978. k++;
  979. assembler.push_back("SUB 0");
  980. k++;
  981. assembler.push_back("JZERO " + numToStr(k+1));
  982. k++;
  983. assembler.push_back("JUMP " + numToStr(k+6));
  984. k++;
  985. assembler.push_back("LOAD 3");
  986. k++;
  987. assembler.push_back("ADD 2");
  988. k++;
  989. assembler.push_back("STORE 3");
  990. k++;
  991. assembler.push_back("LOAD 0");
  992. k++;
  993. assembler.push_back("SUB 1");
  994. k++;
  995. assembler.push_back("STORE 0");
  996. k++;
  997. assembler.push_back("LOAD 1");
  998. k++;
  999. assembler.push_back("SHR 4");
  1000. k++;
  1001. assembler.push_back("STORE 1");
  1002. k++;
  1003. assembler.push_back("LOAD 2");
  1004. k++;
  1005. assembler.push_back("SHR 4");
  1006. k++;
  1007. assembler.push_back("STORE 2");
  1008. k++;
  1009. assembler.push_back("JUMP " + numToStr(k-18));
  1010. k++;
  1011. assembler.push_back("LOAD 3");
  1012. }
  1013. |NUM DIV NUM{
  1014. string temp(numToStr($<num>1));
  1015. string temp1(numToStr($<num>3));
  1016.  
  1017. k++;
  1018. assembler.push_back("RESET");
  1019.  
  1020. if(strToInt(temp) != 0 && strToInt(temp1) != 0)
  1021. {
  1022. long long number = strToInt(temp) / strToInt(temp1);
  1023. loadACU(number);
  1024. }
  1025. }
  1026. | ID MOD ID {
  1027. string temp($<idi>1);
  1028. string temp1($<idi>3);
  1029. checkVariables(temp);
  1030. checkVariables(temp1);
  1031.  
  1032. if(init[temp] == 0 || init[temp1] == 0)
  1033. {
  1034. yyerror("Variable is not initialized!");
  1035. exit(1);
  1036. }
  1037.  
  1038. k++;
  1039. assembler.push_back("RESET");
  1040. k++;
  1041. assembler.push_back("INC");
  1042. k++;
  1043. assembler.push_back("STORE 4");
  1044. k++;
  1045. assembler.push_back("RESET");
  1046. k++;
  1047. assembler.push_back("INC");
  1048. k++;
  1049. assembler.push_back("STORE 2");
  1050. k++;
  1051. assembler.push_back("LOAD "+ numToStr(variables[temp1]));
  1052. k++;
  1053. assembler.push_back("STORE "+ numToStr(1));
  1054. k++;
  1055. assembler.push_back("LOAD "+ numToStr(variables[temp]));
  1056. k++;
  1057. assembler.push_back("STORE "+ numToStr(0));
  1058.  
  1059. k++;
  1060. assembler.push_back("SUB "+ numToStr(1));
  1061. k++;
  1062. assembler.push_back("JZERO "+ numToStr( k+8));
  1063. k++;
  1064. assembler.push_back("LOAD "+ numToStr( 1));
  1065. k++;
  1066. assembler.push_back("SHL "+ numToStr(4));
  1067. k++;
  1068. assembler.push_back("STORE "+ numToStr(1));
  1069. k++;
  1070. assembler.push_back("LOAD "+ numToStr( 2));
  1071. k++;
  1072. assembler.push_back("SHL "+ numToStr(4));
  1073. k++;
  1074. assembler.push_back("STORE "+ numToStr(2));
  1075. k++;
  1076. assembler.push_back("LOAD "+ numToStr(0));
  1077. k++;
  1078. assembler.push_back("JUMP "+ numToStr(k-11));
  1079.  
  1080. k++;
  1081. assembler.push_back("LOAD "+ numToStr( 0));
  1082. k++;
  1083. assembler.push_back("INC ");
  1084. k++;
  1085. assembler.push_back("SUB "+ numToStr(1));
  1086. k++;
  1087. assembler.push_back("JZERO "+ numToStr(k+3));
  1088. k++;
  1089. assembler.push_back("LOAD "+ numToStr(0));
  1090. k++;
  1091. assembler.push_back("SUB "+ numToStr(1));
  1092. k++;
  1093. assembler.push_back("STORE "+ numToStr(0));
  1094. k++;
  1095. assembler.push_back("LOAD "+ numToStr( 1));
  1096. k++;
  1097. assembler.push_back("SHR "+ numToStr(4));
  1098. k++;
  1099. assembler.push_back("STORE "+ numToStr(1));
  1100. k++;
  1101. assembler.push_back("LOAD "+ numToStr( 2));
  1102. k++;
  1103. assembler.push_back("SHR "+ numToStr(4));
  1104. k++;
  1105. assembler.push_back("STORE "+ numToStr(2));
  1106. k++;
  1107. assembler.push_back("JZERO "+ numToStr(k+1));
  1108. k++;
  1109. assembler.push_back("JUMP "+ numToStr(k-15));
  1110. k++;
  1111. assembler.push_back("LOAD "+ numToStr(0));
  1112. }
  1113. | ID MOD NUM {
  1114. string temp($<idi>1);
  1115. string temp1(numToStr($<num>3));
  1116. checkVariables(temp);
  1117.  
  1118. if(init[temp] == 0)
  1119. {
  1120. yyerror("Variable is not initialized!");
  1121. exit(1);
  1122. }
  1123.  
  1124. k++;
  1125. assembler.push_back("RESET");
  1126. k++;
  1127. assembler.push_back("INC");
  1128. k++;
  1129. assembler.push_back("STORE 4");
  1130. k++;
  1131. assembler.push_back("RESET");
  1132. k++;
  1133. assembler.push_back("INC");
  1134. k++;
  1135. assembler.push_back("STORE 2");
  1136.  
  1137. k++;
  1138. assembler.push_back("RESET");
  1139. if(strToInt(temp1)>0)
  1140. loadACU(strToInt(temp1));
  1141.  
  1142. k++;
  1143. assembler.push_back("STORE "+ numToStr(1));
  1144. k++;
  1145. assembler.push_back("LOAD "+ numToStr(variables[temp]));
  1146. k++;
  1147. assembler.push_back("STORE "+ numToStr(0));
  1148.  
  1149. k++;
  1150. assembler.push_back("SUB "+ numToStr(1));
  1151. k++;
  1152. assembler.push_back("JZERO "+ numToStr( k+8));
  1153. k++;
  1154. assembler.push_back("LOAD "+ numToStr( 1));
  1155. k++;
  1156. assembler.push_back("SHL "+ numToStr(4));
  1157. k++;
  1158. assembler.push_back("STORE "+ numToStr(1));
  1159. k++;
  1160. assembler.push_back("LOAD "+ numToStr( 2));
  1161. k++;
  1162. assembler.push_back("SHL "+ numToStr(4));
  1163. k++;
  1164. assembler.push_back("STORE "+ numToStr(2));
  1165. k++;
  1166. assembler.push_back("LOAD "+ numToStr(0));
  1167. k++;
  1168. assembler.push_back("JUMP "+ numToStr(k-11));
  1169.  
  1170. k++;
  1171. assembler.push_back("LOAD "+ numToStr( 0));
  1172. k++;
  1173. assembler.push_back("INC ");
  1174. k++;
  1175. assembler.push_back("SUB "+ numToStr(1));
  1176. k++;
  1177. assembler.push_back("JZERO "+ numToStr(k+3));
  1178. k++;
  1179. assembler.push_back("LOAD "+ numToStr(0));
  1180. k++;
  1181. assembler.push_back("SUB "+ numToStr(1));
  1182. k++;
  1183. assembler.push_back("STORE "+ numToStr(0));
  1184. k++;
  1185. assembler.push_back("LOAD "+ numToStr( 1));
  1186. k++;
  1187. assembler.push_back("SHR "+ numToStr(4));
  1188. k++;
  1189. assembler.push_back("STORE "+ numToStr(1));
  1190. k++;
  1191. assembler.push_back("LOAD "+ numToStr( 2));
  1192. k++;
  1193. assembler.push_back("SHR "+ numToStr(4));
  1194. k++;
  1195. assembler.push_back("STORE "+ numToStr(2));
  1196. k++;
  1197. assembler.push_back("JZERO "+ numToStr(k+1));
  1198. k++;
  1199. assembler.push_back("JUMP "+ numToStr(k-15));
  1200. k++;
  1201. assembler.push_back("LOAD "+ numToStr(0));
  1202. }
  1203. | NUM MOD ID {
  1204. string temp(numToStr($<num>1));
  1205. string temp1(($<idi>3));
  1206. checkVariables(temp1);
  1207.  
  1208. if(init[temp1] == 0)
  1209. {
  1210. yyerror("Variable is not initialized!");
  1211. exit(1);
  1212. }
  1213.  
  1214. k++;
  1215. assembler.push_back("RESET");
  1216. k++;
  1217. assembler.push_back("INC");
  1218. k++;
  1219. assembler.push_back("STORE 4");
  1220. k++;
  1221. assembler.push_back("RESET");
  1222. k++;
  1223. assembler.push_back("INC");
  1224. k++;
  1225. assembler.push_back("STORE 2");
  1226. k++;
  1227. assembler.push_back("LOAD "+ numToStr(variables[temp1]));
  1228. k++;
  1229. assembler.push_back("STORE "+ numToStr(1));
  1230.  
  1231.  
  1232. k++;
  1233. assembler.push_back("RESET");
  1234. if(strToInt(temp)>0)
  1235. loadACU(strToInt(temp));
  1236.  
  1237. k++;
  1238. assembler.push_back("STORE "+ numToStr(0));
  1239.  
  1240. k++;
  1241. assembler.push_back("SUB "+ numToStr(1));
  1242. k++;
  1243. assembler.push_back("JZERO "+ numToStr( k+8));
  1244. k++;
  1245. assembler.push_back("LOAD "+ numToStr( 1));
  1246. k++;
  1247. assembler.push_back("SHL "+ numToStr(4));
  1248. k++;
  1249. assembler.push_back("STORE "+ numToStr(1));
  1250. k++;
  1251. assembler.push_back("LOAD "+ numToStr( 2));
  1252. k++;
  1253. assembler.push_back("SHL "+ numToStr(4));
  1254. k++;
  1255. assembler.push_back("STORE "+ numToStr(2));
  1256. k++;
  1257. assembler.push_back("LOAD "+ numToStr(0));
  1258. k++;
  1259. assembler.push_back("JUMP "+ numToStr(k-11));
  1260.  
  1261. k++;
  1262. assembler.push_back("LOAD "+ numToStr( 0));
  1263. k++;
  1264. assembler.push_back("INC ");
  1265. k++;
  1266. assembler.push_back("SUB "+ numToStr(1));
  1267. k++;
  1268. assembler.push_back("JZERO "+ numToStr(k+3));
  1269. k++;
  1270. assembler.push_back("LOAD "+ numToStr(0));
  1271. k++;
  1272. assembler.push_back("SUB "+ numToStr(1));
  1273. k++;
  1274. assembler.push_back("STORE "+ numToStr(0));
  1275. k++;
  1276. assembler.push_back("LOAD "+ numToStr( 1));
  1277. k++;
  1278. assembler.push_back("SHR "+ numToStr(4));
  1279. k++;
  1280. assembler.push_back("STORE "+ numToStr(1));
  1281. k++;
  1282. assembler.push_back("LOAD "+ numToStr( 2));
  1283. k++;
  1284. assembler.push_back("SHR "+ numToStr(4));
  1285. k++;
  1286. assembler.push_back("STORE "+ numToStr(2));
  1287. k++;
  1288. assembler.push_back("JZERO "+ numToStr(k+1));
  1289. k++;
  1290. assembler.push_back("JUMP "+ numToStr(k-15));
  1291. k++;
  1292. assembler.push_back("LOAD "+ numToStr(0));
  1293. }
  1294. | NUM MOD NUM {
  1295. string temp(numToStr($<num>1));
  1296. string temp1(numToStr($<num>3));
  1297.  
  1298. k++;
  1299. assembler.push_back("RESET");
  1300.  
  1301. if(strToInt(temp) != 0 && strToInt(temp1) != 0)
  1302. {
  1303. long long number = strToInt(temp) % strToInt(temp1);
  1304. loadACU(number);
  1305. }
  1306. }
  1307.  
  1308. value:
  1309. NUM {
  1310. string temp(numToStr($<num>1));
  1311.  
  1312. k++;
  1313. assembler.push_back("RESET");
  1314. if(strToInt(temp)>0)
  1315. loadACU(strToInt(temp));
  1316. }
  1317. | ID {
  1318. string temp($<idi>1);
  1319. checkVariables(temp);
  1320.  
  1321. if(init[temp] == 0)
  1322. {
  1323. yyerror("Variable is not initialized!");
  1324. exit(1);
  1325. }
  1326.  
  1327. k++;
  1328. assembler.push_back("LOAD "+numToStr(variables[temp]));
  1329. free($<idi>1);
  1330. }
  1331.  
  1332. condition:
  1333. ID EQ ID {
  1334. string temp($<idi>1);
  1335. string temp1($<idi>3);
  1336. checkVariables(temp);
  1337. checkVariables(temp1);
  1338.  
  1339. if(init[temp] == 0 || init[temp1] == 0)
  1340. {
  1341. yyerror("Variable is not initialized!");
  1342. exit(1);
  1343. }
  1344.  
  1345. stacks.push(assembler.size());
  1346.  
  1347. k++;
  1348. assembler.push_back("LOAD "+numToStr(variables[temp]));
  1349.  
  1350. k++;
  1351. assembler.push_back("SUB "+numToStr(variables[temp1]));
  1352.  
  1353. k++;
  1354. assembler.push_back("STORE 0");
  1355.  
  1356. k++;
  1357. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  1358.  
  1359. k++;
  1360. assembler.push_back("SUB "+numToStr(variables[temp]));
  1361.  
  1362. k++;
  1363. assembler.push_back("ADD 0");
  1364.  
  1365. k++;
  1366. assembler.push_back("JZERO " + numToStr(k+1));
  1367. stacks.push(assembler.size());
  1368. k++;
  1369. assembler.push_back("JUMP ");
  1370. }
  1371. | ID EQ NUM {
  1372. string temp($<idi>1);
  1373. string temp1(numToStr($<num>3));
  1374. checkVariables(temp);
  1375.  
  1376. if(init[temp] == 0)
  1377. {
  1378. yyerror("Variable is not initialized!");
  1379. exit(1);
  1380. }
  1381.  
  1382. stacks.push(assembler.size());
  1383. k++;
  1384. assembler.push_back("RESET");
  1385.  
  1386. if(strToInt(temp1)>0)
  1387. loadACU(strToInt(temp1));
  1388.  
  1389. k++;
  1390. assembler.push_back("STORE 0"); //tutaj jest liczba
  1391.  
  1392. k++;
  1393. assembler.push_back("SUB " + numToStr(variables[temp]));
  1394. k++;
  1395. assembler.push_back("STORE 1"); //wynik pierwszego odejmowania
  1396. k++;
  1397. assembler.push_back("LOAD " + numToStr(variables[temp]));
  1398. k++;
  1399. assembler.push_back("SUB 0");
  1400. k++;
  1401. assembler.push_back("ADD 1");
  1402. k++;
  1403. assembler.push_back("JZERO " + numToStr(k+1));
  1404. stacks.push(assembler.size());
  1405. k++;
  1406. assembler.push_back("JUMP ");
  1407.  
  1408. }
  1409. | NUM EQ ID {
  1410. string temp(numToStr($<num>1));
  1411. string temp1($<idi>3);
  1412. checkVariables(temp1);
  1413.  
  1414. if(init[temp1] == 0)
  1415. {
  1416. yyerror("Variable is not initialized!");
  1417. exit(1);
  1418. }
  1419.  
  1420. stacks.push(assembler.size());
  1421. k++;
  1422. assembler.push_back("RESET");
  1423.  
  1424. if(strToInt(temp)>0)
  1425. loadACU(strToInt(temp));
  1426.  
  1427. k++;
  1428. assembler.push_back("STORE 0"); //tutaj jest liczba- pierwsza
  1429.  
  1430. k++;
  1431. assembler.push_back("SUB " + numToStr(variables[temp1]));
  1432. k++;
  1433. assembler.push_back("STORE 1"); //wynik pierwszego odejmowania
  1434. k++;
  1435. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  1436. k++;
  1437. assembler.push_back("SUB 0");
  1438. k++;
  1439. assembler.push_back("ADD 1");
  1440. k++;
  1441. assembler.push_back("JZERO " + numToStr(k+1));
  1442. stacks.push(assembler.size());
  1443. k++;
  1444. assembler.push_back("JUMP ");
  1445.  
  1446. }
  1447. | NUM EQ NUM {
  1448. string temp(numToStr($<num>1));
  1449. string temp1(numToStr($<num>3));
  1450.  
  1451. if(!(strToInt(temp) == strToInt(temp1)))
  1452. {
  1453. k++;
  1454. assembler.push_back("RESET");
  1455.  
  1456. k++;
  1457. assembler.push_back("STORE 0");
  1458. }
  1459. stacks.push(assembler.size());
  1460.  
  1461. k++;
  1462. assembler.push_back("JZERO ");
  1463. }
  1464. | ID DIFF ID {
  1465. string temp($<idi>1);
  1466. string temp1($<idi>3);
  1467. checkVariables(temp);
  1468. checkVariables(temp1);
  1469.  
  1470. if(init[temp] == 0 || init[temp1] == 0)
  1471. {
  1472. yyerror("Variable is not initialized!");
  1473. exit(1);
  1474. }
  1475.  
  1476. stacks.push(assembler.size());
  1477. k++;
  1478. assembler.push_back("RESET ");
  1479. k++;
  1480. assembler.push_back("LOAD "+numToStr(variables[temp]));
  1481.  
  1482. k++;
  1483. assembler.push_back("SUB "+ numToStr(variables[temp1]));
  1484.  
  1485. k++;
  1486. assembler.push_back("STORE "+ numToStr(0));
  1487.  
  1488. k++;
  1489. assembler.push_back("LOAD "+numToStr(variables[temp1]));
  1490.  
  1491. k++;
  1492. assembler.push_back("SUB "+ numToStr(variables[temp]));
  1493.  
  1494. k++;
  1495. assembler.push_back("ADD "+numToStr(0));
  1496.  
  1497. stacks.push(assembler.size());
  1498. k++;
  1499. assembler.push_back("JZERO " );
  1500. }
  1501. | ID DIFF NUM {
  1502. string temp($<idi>1);
  1503. string temp1(numToStr($<num>3));
  1504.  
  1505. checkVariables(temp);
  1506.  
  1507. if(init[temp] == 0)
  1508. {
  1509. yyerror("Variable is not initialized!");
  1510. exit(1);
  1511. }
  1512.  
  1513. k++;
  1514. assembler.push_back("RESET");
  1515.  
  1516. if(strToInt(temp1)>0)
  1517. loadACU(strToInt(temp1));
  1518.  
  1519. k++;
  1520. assembler.push_back("STORE 1");
  1521.  
  1522. k++;
  1523. assembler.push_back("LOAD "+numToStr(variables[temp]));
  1524.  
  1525. k++;
  1526. assembler.push_back("SUB "+ numToStr(1));
  1527.  
  1528. k++;
  1529. assembler.push_back("STORE "+ numToStr(0));
  1530.  
  1531. k++;
  1532. assembler.push_back("LOAD "+numToStr(1));
  1533.  
  1534. k++;
  1535. assembler.push_back("SUB "+ numToStr(variables[temp]));
  1536.  
  1537. k++;
  1538. assembler.push_back("ADD "+numToStr(0));
  1539.  
  1540. stacks.push(assembler.size());
  1541. k++;
  1542. assembler.push_back("JZERO ");
  1543.  
  1544. }
  1545. | NUM DIFF ID {
  1546. string temp(numToStr($<num>1));
  1547. string temp1($<idi>3);
  1548. checkVariables(temp1);
  1549.  
  1550. if(init[temp1] == 0)
  1551. {
  1552. yyerror("Variable is not initialized!");
  1553. exit(1);
  1554. }
  1555.  
  1556.  
  1557. k++;
  1558. assembler.push_back("RESET");
  1559.  
  1560. if(strToInt(temp)>0)
  1561. loadACU(strToInt(temp));
  1562.  
  1563. k++;
  1564. assembler.push_back("STORE 1");
  1565.  
  1566. stacks.push(k);
  1567.  
  1568. k++;
  1569. assembler.push_back("SUB "+ numToStr(variables[temp1]));
  1570.  
  1571. k++;
  1572. assembler.push_back("STORE "+ numToStr(0));
  1573.  
  1574. k++;
  1575. assembler.push_back("LOAD "+numToStr(variables[temp1]));
  1576.  
  1577. k++;
  1578. assembler.push_back("SUB "+ numToStr(1));
  1579.  
  1580. k++;
  1581. assembler.push_back("ADD "+numToStr(0));
  1582.  
  1583. stacks.push(assembler.size());
  1584. k++;
  1585. assembler.push_back("JZERO ");
  1586. }
  1587.  
  1588. | NUM DIFF NUM {
  1589. string temp(numToStr($<num>1));
  1590. string temp1(numToStr($<num>3));
  1591.  
  1592. if(strToInt(temp) == strToInt(temp1))
  1593. {
  1594. k++;
  1595. assembler.push_back("RESET");
  1596.  
  1597. k++;
  1598. assembler.push_back("STORE 0");
  1599. }
  1600. stacks.push(assembler.size());
  1601.  
  1602. k++;
  1603. assembler.push_back("JZERO ");
  1604. }
  1605. | ID LE ID {
  1606. string temp($<idi>1);
  1607. string temp1($<idi>3);
  1608. checkVariables(temp);
  1609. checkVariables(temp1);
  1610.  
  1611. if(init[temp] == 0 || init[temp1] == 0)
  1612. {
  1613. yyerror("Variable is not initialized!");
  1614. exit(1);
  1615. }
  1616.  
  1617. stacks.push(assembler.size());
  1618. k++;
  1619. assembler.push_back("LOAD "+numToStr(variables[temp1]));
  1620.  
  1621. k++;
  1622. assembler.push_back("SUB " + numToStr(variables[temp]));
  1623. stacks.push(assembler.size());
  1624. k++;
  1625. assembler.push_back( "JZERO ");
  1626. }
  1627. | ID LE NUM{
  1628. string temp($<idi>1);
  1629. string temp1(numToStr($<num>3));
  1630. checkVariables(temp);
  1631.  
  1632. if(init[temp] == 0)
  1633. {
  1634. yyerror("Variable is not initialized!");
  1635. exit(1);
  1636. }
  1637.  
  1638. stacks.push(assembler.size());
  1639. k++;
  1640. assembler.push_back("RESET");
  1641.  
  1642. if(strToInt(temp1)>0)
  1643. loadACU(strToInt(temp1));
  1644.  
  1645. k++;
  1646. assembler.push_back("SUB " + numToStr(variables[temp]));
  1647. stacks.push(assembler.size());
  1648. k++;
  1649. assembler.push_back( "JZERO ");
  1650. }
  1651. | NUM LE ID{
  1652. string temp(numToStr($<num>1));
  1653. string temp1($<idi>3);
  1654. checkVariables(temp1);
  1655.  
  1656. if(init[temp1] == 0)
  1657. {
  1658. yyerror("Variable is not initialized!");
  1659. exit(1);
  1660. }
  1661.  
  1662. stacks.push(assembler.size());
  1663. k++;
  1664. assembler.push_back("RESET");
  1665.  
  1666. if(strToInt(temp)>0)
  1667. loadACU(strToInt(temp));
  1668.  
  1669. k++;
  1670. assembler.push_back("STORE " + numToStr(0));
  1671.  
  1672. k++;
  1673. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  1674.  
  1675. k++;
  1676. assembler.push_back("SUB "+numToStr(0));
  1677. stacks.push(assembler.size());
  1678. k++;
  1679. assembler.push_back( "JZERO ");
  1680. }
  1681. | NUM LE NUM {
  1682. string temp(numToStr($<num>1));
  1683. string temp1(numToStr($<num>3));
  1684.  
  1685. if(!(strToInt(temp) > strToInt(temp1)))
  1686. {
  1687. k++;
  1688. assembler.push_back("RESET");
  1689.  
  1690. k++;
  1691. assembler.push_back("STORE 0");
  1692. }
  1693. stacks.push(assembler.size());
  1694.  
  1695. k++;
  1696. assembler.push_back("JZERO ");
  1697. }
  1698. | ID GE ID {
  1699. string temp($<idi>1);
  1700. string temp1($<idi>3);
  1701. checkVariables(temp);
  1702. checkVariables(temp1);
  1703.  
  1704. if(init[temp] == 0 || init[temp1] == 0)
  1705. {
  1706. yyerror("Variable is not initialized!");
  1707. exit(1);
  1708. }
  1709.  
  1710. stacks.push(assembler.size());
  1711. k++;
  1712. assembler.push_back("RESET");
  1713.  
  1714. k++;
  1715. assembler.push_back("LOAD " +numToStr(variables[temp]));
  1716.  
  1717. k++;
  1718. assembler.push_back("SUB "+numToStr(variables[temp1]));
  1719.  
  1720. stacks.push(assembler.size());
  1721. k++;
  1722. assembler.push_back("JZERO ");
  1723. }
  1724. | ID GE NUM {
  1725. string temp($<idi>1);
  1726. string temp1(numToStr($<num>3));
  1727. checkVariables(temp);
  1728.  
  1729. if(init[temp] == 0)
  1730. {
  1731. yyerror("Variable is not initialized!");
  1732. exit(1);
  1733. }
  1734.  
  1735. stacks.push(assembler.size());
  1736. k++;
  1737. assembler.push_back("RESET");
  1738.  
  1739. if(strToInt(temp1)>0)
  1740. loadACU(strToInt(temp1));
  1741.  
  1742. k++;
  1743. assembler.push_back("STORE " + numToStr(0));
  1744.  
  1745. k++;
  1746. assembler.push_back("LOAD " + numToStr(variables[temp]));
  1747.  
  1748. k++;
  1749. assembler.push_back("SUB "+numToStr(0));
  1750. stacks.push(assembler.size());
  1751. k++;
  1752. assembler.push_back("JZERO ");
  1753. }
  1754. | NUM GE ID {
  1755. string temp(numToStr($<num>1));
  1756. string temp1($<idi>3);
  1757. checkVariables(temp1);
  1758.  
  1759. if(init[temp1] == 0)
  1760. {
  1761. yyerror("Variable is not initialized!");
  1762. exit(1);
  1763. }
  1764.  
  1765. stacks.push(assembler.size());
  1766.  
  1767. k++;
  1768. assembler.push_back("RESET");
  1769.  
  1770. if(strToInt(temp)>0)
  1771. loadACU(strToInt(temp));
  1772.  
  1773. k++;
  1774. assembler.push_back("SUB " + numToStr(variables[temp1]));
  1775.  
  1776. stacks.push(assembler.size());
  1777. k++;
  1778. assembler.push_back( "JZERO ");
  1779. }
  1780. | NUM GE NUM {
  1781. string temp(numToStr($<num>1));
  1782. string temp1(numToStr($<num>3));
  1783.  
  1784. if(!(strToInt(temp) < strToInt(temp1)))
  1785. {
  1786. k++;
  1787. assembler.push_back("RESET");
  1788.  
  1789. k++;
  1790. assembler.push_back("STORE 0");
  1791. }
  1792. stacks.push(assembler.size());
  1793.  
  1794. k++;
  1795. assembler.push_back("JZERO ");
  1796. }
  1797. | ID LEQ ID {
  1798. string temp($<idi>1);
  1799. string temp1($<idi>3);
  1800. checkVariables(temp);
  1801. checkVariables(temp1);
  1802.  
  1803. if(init[temp] == 0 || init[temp1] == 0)
  1804. {
  1805. yyerror("Variable is not initialized!");
  1806. exit(1);
  1807. }
  1808.  
  1809. stacks.push(assembler.size());
  1810. k++;
  1811. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  1812. k++;
  1813. assembler.push_back("INC ");
  1814. k++;
  1815. assembler.push_back("SUB " + numToStr(variables[temp]));
  1816.  
  1817. stacks.push(assembler.size());
  1818. k++;
  1819. assembler.push_back("JZERO ");
  1820.  
  1821. }
  1822. | ID LEQ NUM {
  1823. string temp($<idi>1);
  1824. string temp1(numToStr($<num>3));
  1825. checkVariables(temp);
  1826.  
  1827. if(init[temp] == 0)
  1828. {
  1829. yyerror("Variable is not initialized!");
  1830. exit(1);
  1831. }
  1832.  
  1833. stacks.push(assembler.size());
  1834. k++;
  1835. assembler.push_back("RESET");
  1836.  
  1837. if(strToInt(temp1)>=0)
  1838. loadACU(strToInt(temp1));
  1839.  
  1840. k++;
  1841. assembler.push_back("INC ");
  1842. k++;
  1843. assembler.push_back("SUB " + numToStr(variables[temp]));
  1844.  
  1845. stacks.push(assembler.size());
  1846. k++;
  1847. assembler.push_back("JZERO ");
  1848. }
  1849. | NUM LEQ ID {
  1850. string temp(numToStr($<num>1));
  1851. string temp1($<idi>3);
  1852. checkVariables(temp1);
  1853.  
  1854. if(init[temp1] == 0)
  1855. {
  1856. yyerror("Variable is not initialized!");
  1857. exit(1);
  1858. }
  1859.  
  1860. stacks.push(assembler.size());
  1861.  
  1862. k++;
  1863. assembler.push_back("RESET");
  1864. if(strToInt(temp)>=0)
  1865. loadACU(strToInt(temp));
  1866.  
  1867. k++;
  1868. assembler.push_back("STORE 0");
  1869.  
  1870. k++;
  1871. assembler.push_back("LOAD " + numToStr(variables[temp1]));
  1872. k++;
  1873. assembler.push_back("INC ");
  1874. k++;
  1875. assembler.push_back("SUB " + numToStr(0));
  1876. stacks.push(assembler.size());
  1877. k++;
  1878. assembler.push_back("JZERO ");
  1879. }
  1880.  
  1881. | NUM LEQ NUM {
  1882. string temp(numToStr($<num>1));
  1883. string temp1(numToStr($<num>3));
  1884.  
  1885. if(!(strToInt(temp) <= strToInt(temp1)))
  1886. {
  1887. k++;
  1888. assembler.push_back("RESET");
  1889.  
  1890. k++;
  1891. assembler.push_back("STORE 0");
  1892. }
  1893. stacks.push(assembler.size());
  1894.  
  1895. k++;
  1896. assembler.push_back("JZERO ");
  1897. }
  1898. | ID GEQ ID {
  1899. string temp($<idi>1);
  1900. string temp1($<idi>3);
  1901. checkVariables(temp);
  1902. checkVariables(temp1);
  1903.  
  1904. if(init[temp] == 0 || init[temp1] == 0)
  1905. {
  1906. yyerror("Variable is not initialized!");
  1907. exit(1);
  1908. }
  1909.  
  1910. stacks.push(assembler.size());
  1911. k++;
  1912. assembler.push_back("LOAD " + numToStr(variables[temp]));
  1913. k++;
  1914. assembler.push_back("INC ");
  1915.  
  1916. k++;
  1917. assembler.push_back("SUB " + numToStr(variables[temp1]));
  1918. stacks.push(assembler.size());
  1919. k++;
  1920. assembler.push_back("JZERO ");
  1921.  
  1922. }
  1923. | ID GEQ NUM {
  1924. string temp($<idi>1);
  1925. string temp1(numToStr($<num>3));
  1926. checkVariables(temp);
  1927.  
  1928. if(init[temp] == 0)
  1929. {
  1930. yyerror("Variable is not initialized!");
  1931. exit(1);
  1932. }
  1933.  
  1934. k++;
  1935. assembler.push_back("RESET");
  1936.  
  1937. if(strToInt(temp1)>0)
  1938. loadACU(strToInt(temp1));
  1939.  
  1940. k++;
  1941. assembler.push_back("STORE 0");
  1942. k++;
  1943. assembler.push_back("LOAD " + numToStr(variables[temp]));
  1944. k++;
  1945. assembler.push_back("INC ");
  1946. k++;
  1947. assembler.push_back("SUB " + numToStr(0));
  1948. stacks.push(assembler.size());
  1949.  
  1950. k++;
  1951. assembler.push_back("JZERO ");
  1952.  
  1953. }
  1954. | NUM GEQ ID {
  1955. string temp(numToStr($<num>1));
  1956. string temp1($<idi>3);
  1957. checkVariables(temp1);
  1958.  
  1959. if(init[temp1] == 0)
  1960. {
  1961. yyerror("Variable is not initialized!");
  1962. exit(1);
  1963. }
  1964.  
  1965. k++;
  1966. assembler.push_back("RESET");
  1967.  
  1968. if(strToInt(temp)>0)
  1969. loadACU(strToInt(temp));
  1970.  
  1971. k++;
  1972. assembler.push_back("INC ");
  1973.  
  1974. k++;
  1975. assembler.push_back("SUB " + numToStr(variables[temp1]));
  1976.  
  1977. stacks.push(assembler.size());
  1978.  
  1979. k++;
  1980. assembler.push_back("JZERO ");
  1981. }
  1982. | NUM GEQ NUM {
  1983. string temp(numToStr($<num>1));
  1984. string temp1(numToStr($<num>3));
  1985.  
  1986. if(!(strToInt(temp) >= strToInt(temp1)))
  1987. {
  1988. k++;
  1989. assembler.push_back("RESET");
  1990.  
  1991. k++;
  1992. assembler.push_back("STORE 0");
  1993. }
  1994. stacks.push(assembler.size());
  1995.  
  1996. k++;
  1997. assembler.push_back("JZERO ");
  1998. }
  1999. ;
  2000. %%
  2001.  
  2002. void yyerror(char const *s)
  2003. {
  2004. fprintf(stderr,"Error: %s\n", s);
  2005. assembler.clear();
  2006. }
  2007.  
  2008. int main()
  2009. {
  2010. yyparse();
  2011. int i;
  2012.  
  2013. for(i = 0; i<assembler.size(); i++)
  2014. {
  2015. cout << assembler[i] << endl;
  2016. }
  2017.  
  2018. return 0;
  2019. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement