1
0

code_generator.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. import $ from 'jquery';
  2. import { Types } from './types';
  3. import * as Models from './ivprog_elements';
  4. import { LocalizedStrings } from './../services/localizedStringsService';
  5. import * as GlobalsManagement from './globals';
  6. import * as VariablesManagement from './variables';
  7. import * as CommandsManagement from './commands';
  8. export function generate () {
  9. var code = 'programa \n{ ';
  10. code += globalsCode();
  11. code += '\n';
  12. for (var i = 0; i < window.program_obj.functions.length; i ++) {
  13. code += functionsCode(window.program_obj.functions[i]);
  14. code += '\n';
  15. }
  16. code += '\n}';
  17. return code;
  18. }
  19. function functionsCode (function_obj) {
  20. var ret = '\n\tfuncao ';
  21. switch (function_obj.return_type) {
  22. case Types.INTEGER:
  23. ret += 'inteiro ';
  24. break;
  25. case Types.REAL:
  26. ret += 'real ';
  27. break;
  28. case Types.TEXT:
  29. ret += 'texto ';
  30. break;
  31. case Types.BOOLEAN:
  32. ret += 'booleano ';
  33. break;
  34. case Types.VOID:
  35. ret += 'vazio ';
  36. break;
  37. }
  38. if (function_obj.return_dimensions == 1) {
  39. ret += '[] '
  40. } else if (function_obj.return_dimensions == 2) {
  41. ret += '[][] '
  42. }
  43. ret += function_obj.name + ' ( ';
  44. for (var j = 0; j < function_obj.parameters_list.length; j++) {
  45. ret += parametersCode(function_obj.parameters_list[j]);
  46. if ((j + 1) < function_obj.parameters_list.length) {
  47. ret += ',';
  48. }
  49. }
  50. ret += ' ) ';
  51. ret += '\n\t{';
  52. for (var j = 0; j < function_obj.variables_list.length; j++) {
  53. ret += variablesCode(function_obj.variables_list[j]);
  54. }
  55. for (var j = 0; j < function_obj.commands.length; j++) {
  56. ret += commandsCode(function_obj.commands[j]);
  57. }
  58. ret += '\n\t}';
  59. return ret;
  60. }
  61. function commandsCode (command_obj) {
  62. switch (command_obj.type) {
  63. case Models.COMMAND_TYPES.comment:
  64. return commentsCode(command_obj);
  65. case Models.COMMAND_TYPES.reader:
  66. return readersCode(command_obj);
  67. case Models.COMMAND_TYPES.writer:
  68. return writersCode(command_obj);
  69. }
  70. }
  71. function readersCode (command_obj) {
  72. var ret = '\n\t\tleia ( ';
  73. ret += command_obj.variable_value_menu.content.name;
  74. if (command_obj.variable_value_menu.content.dimensions == 1) {
  75. ret += ' [ ' + command_obj.column + ' ] ';
  76. } else if (command_obj.variable_value_menu.content.dimensions == 2) {
  77. ret += ' [ ' + command_obj.row + ' ] [ ' + command_obj.column + ' ]';
  78. }
  79. ret += ' ) ';
  80. return ret;
  81. }
  82. function writersCode (command_obj) {
  83. var ret = '\n\t\tescreva ( ';
  84. ret += command_obj.content[0].content.name;
  85. if (command_obj.content[0].content.dimensions == 1) {
  86. ret += ' [ ' + command_obj.content[0].column + ' ] ';
  87. } else if (command_obj.content[0].dimensions == 2) {
  88. ret += ' [ ' + command_obj.content[0].row + ' ] [ ' + command_obj.content[0].column + ' ]';
  89. }
  90. ret += ' ) ';
  91. return ret;
  92. }
  93. function commentsCode (command_obj) {
  94. var ret = '\n\t\t// ';
  95. ret += command_obj.comment_text.content;
  96. return ret;
  97. }
  98. function parametersCode (parameter_obj) {
  99. var ret = '';
  100. switch (parameter_obj.type) {
  101. case Types.INTEGER:
  102. ret += ' inteiro ';
  103. break;
  104. case Types.REAL:
  105. ret += ' real ';
  106. break;
  107. case Types.TEXT:
  108. ret += ' texto ';
  109. break;
  110. case Types.BOOLEAN:
  111. ret += ' booleano ';
  112. break;
  113. }
  114. ret += parameter_obj.name + '';
  115. if (parameter_obj.dimensions == 1) {
  116. ret += ' []'
  117. } else if (parameter_obj.dimensions == 2) {
  118. ret += ' [][]'
  119. }
  120. return ret;
  121. }
  122. function variablesCode (variable_obj) {
  123. var ret = '';
  124. var temp = variable_obj;
  125. ret += '\n\t\t';
  126. if (temp.is_constant) {
  127. ret += 'const ';
  128. }
  129. switch (temp.type) {
  130. case Types.INTEGER:
  131. ret += 'inteiro ';
  132. break;
  133. case Types.REAL:
  134. ret += 'real ';
  135. break;
  136. case Types.TEXT:
  137. ret += 'texto ';
  138. break;
  139. case Types.BOOLEAN:
  140. ret += 'booleano ';
  141. break;
  142. }
  143. ret += temp.name + ' ';
  144. if (temp.dimensions == 1) {
  145. ret += '[' + temp.columns + '] ';
  146. switch (temp.type) {
  147. case Types.INTEGER:
  148. case Types.REAL:
  149. ret += '= {' + temp.value + '}';
  150. break;
  151. case Types.TEXT:
  152. ret += '= {';
  153. for (var j = 0; j < temp.value.length; j++) {
  154. ret += '"'+temp.value[j]+'"';
  155. if ((j + 1) < temp.value.length) {
  156. ret += ',';
  157. }
  158. }
  159. ret += '}';
  160. break;
  161. case Types.BOOLEAN:
  162. ret += '= {';
  163. for (var j = 0; j < temp.value.length; j++) {
  164. if (temp.value[j]) {
  165. ret += "verdadeiro";
  166. } else {
  167. ret += "falso";
  168. }
  169. if ((j + 1) < temp.value.length) {
  170. ret += ',';
  171. }
  172. }
  173. ret += '}';
  174. break;
  175. }
  176. } else if (temp.dimensions == 2) {
  177. ret += '[' + temp.rows + '][' + temp.columns + '] ';
  178. switch (temp.type) {
  179. case Types.INTEGER:
  180. case Types.REAL:
  181. ret += '= {';
  182. for (var j = 0; j < temp.rows; j++) {
  183. ret += '{' + temp.value[j] + '}';
  184. if ((j + 1) < temp.rows) {
  185. ret += ',';
  186. }
  187. }
  188. ret += '}';
  189. break;
  190. case Types.TEXT:
  191. ret += '= {';
  192. for (var j = 0; j < temp.rows; j++) {
  193. ret += '{';
  194. for (var k = 0; k < temp.columns; k++) {
  195. ret += '"' + temp.value[j][k] + '"';
  196. if ((k + 1) < temp.columns) {
  197. ret += ',';
  198. }
  199. }
  200. ret += '}';
  201. if ((j + 1) < temp.rows) {
  202. ret += ',';
  203. }
  204. }
  205. ret += '}';
  206. break;
  207. case Types.BOOLEAN:
  208. ret += '= {';
  209. for (var j = 0; j < temp.rows; j++) {
  210. ret += '{';
  211. for (var k = 0; k < temp.columns; k++) {
  212. if (temp.value[j][k]) {
  213. ret += "verdadeiro";
  214. } else {
  215. ret += "falso";
  216. }
  217. if ((k + 1) < temp.columns) {
  218. ret += ',';
  219. }
  220. }
  221. ret += '}';
  222. if ((j + 1) < temp.rows) {
  223. ret += ',';
  224. }
  225. }
  226. ret += '}';
  227. break;
  228. }
  229. } else {
  230. switch (temp.type) {
  231. case Types.INTEGER:
  232. case Types.REAL:
  233. ret += '= ' + temp.value;
  234. break;
  235. case Types.TEXT:
  236. ret += '= "' + temp.value + '"';
  237. break;
  238. case Types.BOOLEAN:
  239. ret += '= ';
  240. if (temp.value) {
  241. ret += "verdadeiro";
  242. } else {
  243. ret += "falso";
  244. }
  245. break;
  246. }
  247. }
  248. return ret;
  249. }
  250. function globalsCode () {
  251. var ret = '';
  252. if (window.program_obj.globals) {
  253. for (var i = 0; i < window.program_obj.globals.length; i++) {
  254. var temp = window.program_obj.globals[i];
  255. ret += '\n\t';
  256. if (temp.is_constant) {
  257. ret += 'const ';
  258. }
  259. switch (temp.type) {
  260. case Types.INTEGER:
  261. ret += 'inteiro ';
  262. break;
  263. case Types.REAL:
  264. ret += 'real ';
  265. break;
  266. case Types.TEXT:
  267. ret += 'texto ';
  268. break;
  269. case Types.BOOLEAN:
  270. ret += 'booleano ';
  271. break;
  272. }
  273. ret += temp.name + ' ';
  274. if (temp.dimensions == 1) {
  275. ret += '[' + temp.columns + '] ';
  276. switch (temp.type) {
  277. case Types.INTEGER:
  278. case Types.REAL:
  279. ret += '= {' + temp.value + '}';
  280. break;
  281. case Types.TEXT:
  282. ret += '= {';
  283. for (var j = 0; j < temp.value.length; j++) {
  284. ret += '"'+temp.value[j]+'"';
  285. if ((j + 1) < temp.value.length) {
  286. ret += ',';
  287. }
  288. }
  289. ret += '}';
  290. break;
  291. case Types.BOOLEAN:
  292. ret += '= {';
  293. for (var j = 0; j < temp.value.length; j++) {
  294. if (temp.value[j]) {
  295. ret += "verdadeiro";
  296. } else {
  297. ret += "falso";
  298. }
  299. if ((j + 1) < temp.value.length) {
  300. ret += ',';
  301. }
  302. }
  303. ret += '}';
  304. break;
  305. }
  306. } else if (temp.dimensions == 2) {
  307. ret += '[' + temp.rows + '][' + temp.columns + '] ';
  308. switch (temp.type) {
  309. case Types.INTEGER:
  310. case Types.REAL:
  311. ret += '= {';
  312. for (var j = 0; j < temp.rows; j++) {
  313. ret += '{' + temp.value[j] + '}';
  314. if ((j + 1) < temp.rows) {
  315. ret += ',';
  316. }
  317. }
  318. ret += '}';
  319. break;
  320. case Types.TEXT:
  321. ret += '= {';
  322. for (var j = 0; j < temp.rows; j++) {
  323. ret += '{';
  324. for (var k = 0; k < temp.columns; k++) {
  325. ret += '"' + temp.value[j][k] + '"';
  326. if ((k + 1) < temp.columns) {
  327. ret += ',';
  328. }
  329. }
  330. ret += '}';
  331. if ((j + 1) < temp.rows) {
  332. ret += ',';
  333. }
  334. }
  335. ret += '}';
  336. break;
  337. case Types.BOOLEAN:
  338. ret += '= {';
  339. for (var j = 0; j < temp.rows; j++) {
  340. ret += '{';
  341. for (var k = 0; k < temp.columns; k++) {
  342. if (temp.value[j][k]) {
  343. ret += "verdadeiro";
  344. } else {
  345. ret += "falso";
  346. }
  347. if ((k + 1) < temp.columns) {
  348. ret += ',';
  349. }
  350. }
  351. ret += '}';
  352. if ((j + 1) < temp.rows) {
  353. ret += ',';
  354. }
  355. }
  356. ret += '}';
  357. break;
  358. }
  359. } else {
  360. switch (temp.type) {
  361. case Types.INTEGER:
  362. case Types.REAL:
  363. ret += '= ' + temp.value;
  364. break;
  365. case Types.TEXT:
  366. ret += '= "' + temp.value + '"';
  367. break;
  368. case Types.BOOLEAN:
  369. ret += '= ';
  370. if (temp.value) {
  371. ret += "verdadeiro";
  372. } else {
  373. ret += "falso";
  374. }
  375. break;
  376. }
  377. }
  378. }
  379. }
  380. return ret;
  381. }