code_generator.js 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  1. /* eslint-disable @typescript-eslint/no-use-before-define */
  2. /* globals $*/
  3. import { Types } from "./types";
  4. import * as Models from "./ivprog_elements";
  5. import { LocalizedStrings } from "./../services/localizedStringsService";
  6. import * as Utils from "./utils";
  7. export function generate () {
  8. $(".ivprog_visual_panel")
  9. .find(".error_icon")
  10. .remove();
  11. let code = LocalizedStrings.getUI("program") + " { ";
  12. code += globalsCode();
  13. code += "\n";
  14. let has_error = false;
  15. for (let i = 0; i < window.program_obj.functions.length; i++) {
  16. const n_code = functionsCode(window.program_obj.functions[i]);
  17. if (n_code == null) {
  18. has_error = true;
  19. }
  20. code += n_code;
  21. code += "\n";
  22. }
  23. code += "\n}";
  24. if (has_error) {
  25. return null;
  26. } else {
  27. return code;
  28. }
  29. }
  30. function functionsCode (function_obj) {
  31. let ret = "\n\t" + LocalizedStrings.getUI("function") + " ";
  32. const has_error = false;
  33. switch (function_obj.return_type) {
  34. case Types.INTEGER:
  35. ret += LocalizedStrings.getUI("type_integer");
  36. break;
  37. case Types.REAL:
  38. ret += LocalizedStrings.getUI("type_real");
  39. break;
  40. case Types.TEXT:
  41. ret += LocalizedStrings.getUI("type_text");
  42. break;
  43. case Types.BOOLEAN:
  44. ret += LocalizedStrings.getUI("type_boolean");
  45. break;
  46. case Types.CHAR:
  47. ret += LocalizedStrings.getUI("type_char");
  48. break;
  49. case Types.VOID:
  50. ret += LocalizedStrings.getUI("type_void");
  51. break;
  52. }
  53. ret += " ";
  54. if (function_obj.return_dimensions == 1) {
  55. ret += "[] ";
  56. } else if (function_obj.return_dimensions == 2) {
  57. ret += "[][] ";
  58. }
  59. if (function_obj.is_main) {
  60. ret += LocalizedStrings.getUI("start");
  61. } else {
  62. ret += function_obj.name;
  63. }
  64. ret += " ( ";
  65. for (let j = 0; j < function_obj.parameters_list.length; j++) {
  66. ret += parametersCode(function_obj.parameters_list[j]);
  67. if (j + 1 < function_obj.parameters_list.length) {
  68. ret += ", ";
  69. }
  70. }
  71. ret += " ) {";
  72. for (let j = 0; j < function_obj.variables_list.length; j++) {
  73. ret += variablesCode(function_obj.variables_list[j]);
  74. }
  75. for (let j = 0; j < function_obj.commands.length; j++) {
  76. //try {
  77. ret += commandsCode(function_obj.commands[j]);
  78. /*} catch (err) {
  79. has_error = true;
  80. console.error(err.message);
  81. var todos = $('body').find('.command_container');
  82. for (var i = 0; i < todos.length; i++) {
  83. if ($(todos[i]).data('command') == function_obj.commands[j]) {
  84. $( todos[i] ).prepend( ' <i class="ui icon red exclamation triangle error_icon"></i> ' );
  85. break;
  86. }
  87. }
  88. }*/
  89. }
  90. ret += "\n\t}";
  91. if (has_error) {
  92. return null;
  93. } else {
  94. return ret;
  95. }
  96. }
  97. function commandsCode (command_obj, indentation = 2) {
  98. switch (command_obj.type) {
  99. case Models.COMMAND_TYPES.break:
  100. return breaksCode(command_obj, indentation);
  101. case Models.COMMAND_TYPES.comment:
  102. return commentsCode(command_obj, indentation);
  103. case Models.COMMAND_TYPES.reader:
  104. return readersCode(command_obj, indentation);
  105. case Models.COMMAND_TYPES.writer:
  106. return writersCode(command_obj, indentation);
  107. case Models.COMMAND_TYPES.functioncall:
  108. return functioncallsCode(command_obj, indentation);
  109. case Models.COMMAND_TYPES.attribution:
  110. return attributionsCode(command_obj, indentation);
  111. case Models.COMMAND_TYPES.whiletrue:
  112. return whiletruesCode(command_obj, indentation);
  113. case Models.COMMAND_TYPES.dowhiletrue:
  114. return doWhilesCode(command_obj, indentation);
  115. case Models.COMMAND_TYPES.iftrue:
  116. return iftruesCode(command_obj, indentation);
  117. case Models.COMMAND_TYPES.repeatNtimes:
  118. return repeatNtimesCode(command_obj, indentation);
  119. case Models.COMMAND_TYPES.switch:
  120. return switchsCode(command_obj, indentation);
  121. case Models.COMMAND_TYPES.return:
  122. return returnsCode(command_obj, indentation);
  123. }
  124. }
  125. function returnsCode (command_obj, indentation) {
  126. let ret = "\n";
  127. for (let i = 0; i < indentation; i++) {
  128. ret += "\t";
  129. }
  130. ret += LocalizedStrings.getUI("text_return");
  131. if (command_obj.variable_value_menu) {
  132. try {
  133. ret += " " + elementExpressionCode(command_obj.variable_value_menu);
  134. //ret += ' ' + variableValueMenuCode(command_obj.variable_value_menu, true);
  135. } catch (err) {
  136. //Empty block
  137. }
  138. }
  139. return ret;
  140. }
  141. function breaksCode (_command_obj, indentation) {
  142. let ret = "\n";
  143. for (let i = 0; i < indentation; i++) {
  144. ret += "\t";
  145. }
  146. ret += LocalizedStrings.getUI("text_break");
  147. return ret;
  148. }
  149. function switchsCode (command_obj, indentation) {
  150. let ret = "\n";
  151. for (let i = 0; i < indentation; i++) {
  152. ret += "\t";
  153. }
  154. ret += LocalizedStrings.getUI("text_code_switch") + " ( ";
  155. ret += variableValueMenuCode(command_obj.variable);
  156. ret += " ) { ";
  157. if (command_obj.cases) {
  158. for (let i = 0; i < command_obj.cases.length; i++) {
  159. ret += switchcasesCode(command_obj.cases[i], indentation + 1);
  160. }
  161. }
  162. ret += "\n";
  163. for (let i = 0; i < indentation; i++) {
  164. ret += "\t";
  165. }
  166. ret += "} ";
  167. return ret;
  168. }
  169. function switchcasesCode (switchcase, indentation) {
  170. let ret = "\n";
  171. for (let i = 0; i < indentation; i++) {
  172. ret += "\t";
  173. }
  174. ret += LocalizedStrings.getUI("text_code_case") + " ";
  175. ret += variableValueMenuCode(switchcase.variable_value_menu);
  176. ret += " :";
  177. if (switchcase.commands_block) {
  178. for (let i = 0; i < switchcase.commands_block.length; i++) {
  179. ret += commandsCode(switchcase.commands_block[i], indentation + 1);
  180. }
  181. }
  182. return ret;
  183. }
  184. export function repeatNtimesHeader (command_obj) {
  185. let ret = "";
  186. if (command_obj.var_attribution) {
  187. ret += '<span class="repeatN_text_par_1">';
  188. ret += variableValueMenuCode(command_obj.var_attribution);
  189. ret += '</span>';
  190. ret += ` ${LocalizedStrings.getUI("text_code_for_from")} `;
  191. ret += '<span class="repeatN_text_par_2">';
  192. ret += variableValueMenuCode(command_obj.expression1);
  193. ret += '</span>';
  194. }
  195. if (command_obj.expression2) {
  196. ret += ` ${LocalizedStrings.getUI("text_code_for_to")} `;
  197. ret += '<span class="repeatN_text_par_3">';
  198. ret += variableValueMenuCode(command_obj.expression2);
  199. ret += '</span>';
  200. }
  201. if (command_obj.expression3) {
  202. ret += ` ${LocalizedStrings.getUI("text_code_for_pass")} `;
  203. ret += '<span class="repeatN_text_par_4">';
  204. switch (command_obj.expression3.itens[1]) {
  205. case Models.ARITHMETIC_TYPES.plus:
  206. ret += " +";
  207. break;
  208. case Models.ARITHMETIC_TYPES.minus:
  209. ret += " -";
  210. break;
  211. }
  212. ret += variableValueMenuCode(command_obj.expression3.itens[2]);
  213. ret += '</span>';
  214. }
  215. return ret;
  216. }
  217. function repeatNtimesCode (command_obj, indentation) {
  218. let ret = "\n";
  219. for (let i = 0; i < indentation; i++) {
  220. ret += "\t";
  221. }
  222. ret += LocalizedStrings.getUI("text_for") + " ";
  223. if (command_obj.var_attribution) {
  224. ret += variableValueMenuCode(command_obj.var_attribution);
  225. ret += ` ${LocalizedStrings.getUI("text_code_for_from")} `;
  226. ret += variableValueMenuCode(command_obj.expression1);
  227. }
  228. if (command_obj.expression2) {
  229. ret += ` ${LocalizedStrings.getUI("text_code_for_to")} `;
  230. ret += variableValueMenuCode(command_obj.expression2);
  231. }
  232. if (command_obj.expression3) {
  233. ret += ` ${LocalizedStrings.getUI("text_code_for_pass")} `;
  234. switch (command_obj.expression3.itens[1]) {
  235. case Models.ARITHMETIC_TYPES.plus:
  236. ret += " +";
  237. break;
  238. case Models.ARITHMETIC_TYPES.minus:
  239. ret += " -";
  240. break;
  241. }
  242. ret += variableValueMenuCode(command_obj.expression3.itens[2]);
  243. }
  244. ret += " { ";
  245. if (command_obj.commands_block) {
  246. for (let i = 0; i < command_obj.commands_block.length; i++) {
  247. ret += commandsCode(command_obj.commands_block[i], indentation + 1);
  248. }
  249. }
  250. ret += "\n";
  251. for (let i = 0; i < indentation; i++) {
  252. ret += "\t";
  253. }
  254. ret += "}";
  255. return ret;
  256. }
  257. function iftruesCode (command_obj, indentation) {
  258. let ret = "\n";
  259. for (let i = 0; i < indentation; i++) {
  260. ret += "\t";
  261. }
  262. ret += LocalizedStrings.getUI("text_if");
  263. if (!command_obj.expression) {
  264. Utils.renderErrorMessage(
  265. command_obj.expression.dom_object,
  266. LocalizedStrings.getUI("inform_valid_expression")
  267. );
  268. } else {
  269. ret += " ( ";
  270. ret += elementExpressionCode(command_obj.expression);
  271. ret += " ) ";
  272. }
  273. /*switch (command_obj.expression.expression.type) {
  274. case Models.EXPRESSION_TYPES.exp_logic:
  275. ret += logicExpressionCode(command_obj.expression.expression);
  276. break;
  277. case Models.EXPRESSION_TYPES.exp_arithmetic:
  278. ret += arithmeticExpressionCode(command_obj.expression.expression);
  279. break;
  280. }*/
  281. ret += " { ";
  282. if (command_obj.commands_block) {
  283. for (let i = 0; i < command_obj.commands_block.length; i++) {
  284. ret += commandsCode(command_obj.commands_block[i], indentation + 1);
  285. }
  286. }
  287. ret += "\n";
  288. for (let i = 0; i < indentation; i++) {
  289. ret += "\t";
  290. }
  291. ret += "} " + LocalizedStrings.getUI("text_else") + " {";
  292. if (command_obj.commands_else) {
  293. for (let i = 0; i < command_obj.commands_else.length; i++) {
  294. ret += commandsCode(command_obj.commands_else[i], indentation + 1);
  295. }
  296. }
  297. ret += "\n";
  298. for (let i = 0; i < indentation; i++) {
  299. ret += "\t";
  300. }
  301. ret += "}";
  302. return ret;
  303. }
  304. function doWhilesCode (command_obj, indentation) {
  305. let ret = "\n";
  306. for (let i = 0; i < indentation; i++) {
  307. ret += "\t";
  308. }
  309. ret += LocalizedStrings.getUI("text_code_do") + " { ";
  310. if (command_obj.commands_block) {
  311. for (let i = 0; i < command_obj.commands_block.length; i++) {
  312. ret += commandsCode(command_obj.commands_block[i], indentation + 1);
  313. }
  314. }
  315. ret += "\n";
  316. for (let i = 0; i < indentation; i++) {
  317. ret += "\t";
  318. }
  319. ret += "} " + LocalizedStrings.getUI("text_code_do_until");
  320. if (!command_obj.expression) {
  321. Utils.renderErrorMessage(
  322. command_obj.expression.dom_object,
  323. LocalizedStrings.getUI("inform_valid_expression")
  324. );
  325. }
  326. /*switch (command_obj.expression.expression.type) {
  327. case Models.EXPRESSION_TYPES.exp_logic:
  328. ret += logicExpressionCode(command_obj.expression.expression);
  329. break;
  330. case Models.EXPRESSION_TYPES.exp_arithmetic:
  331. ret += arithmeticExpressionCode(command_obj.expression.expression);
  332. break;
  333. }*/
  334. if (command_obj.expression) {
  335. ret += " ( ";
  336. ret += elementExpressionCode(command_obj.expression);
  337. ret += " ) ";
  338. }
  339. return ret;
  340. }
  341. function whiletruesCode (command_obj, indentation) {
  342. let ret = "\n";
  343. for (let i = 0; i < indentation; i++) {
  344. ret += "\t";
  345. }
  346. ret += LocalizedStrings.getUI("text_code_while");
  347. if (!command_obj.expression) {
  348. Utils.renderErrorMessage(
  349. command_obj.expression.dom_object,
  350. LocalizedStrings.getUI("inform_valid_expression")
  351. );
  352. }
  353. /*switch (command_obj.expression.expression.type) {
  354. case Models.EXPRESSION_TYPES.exp_logic:
  355. ret += logicExpressionCode(command_obj.expression.expression);
  356. break;
  357. case Models.EXPRESSION_TYPES.exp_arithmetic:
  358. ret += arithmeticExpressionCode(command_obj.expression.expression);
  359. break;
  360. }*/
  361. if (command_obj.expression) {
  362. ret += " ( ";
  363. ret += elementExpressionCode(command_obj.expression);
  364. ret += " ) ";
  365. }
  366. ret += " { ";
  367. if (command_obj.commands_block) {
  368. for (let i = 0; i < command_obj.commands_block.length; i++) {
  369. ret += commandsCode(command_obj.commands_block[i], indentation + 1);
  370. }
  371. }
  372. ret += "\n";
  373. for (let i = 0; i < indentation; i++) {
  374. ret += "\t";
  375. }
  376. ret += "}";
  377. return ret;
  378. }
  379. function logicExpressionCode (expression) {
  380. let ret = " ( ";
  381. if (expression.first_operand.type == Models.EXPRESSION_TYPES.exp_logic) {
  382. ret += logicExpressionCode(expression.first_operand);
  383. } else if (
  384. expression.first_operand.type == Models.EXPRESSION_TYPES.exp_arithmetic
  385. ) {
  386. ret += arithmeticExpressionCode(expression.first_operand);
  387. } else {
  388. ret += variableValueMenuCode(expression.first_operand);
  389. }
  390. if (expression.operator) {
  391. switch (expression.operator) {
  392. case Models.LOGIC_COMPARISON.equals_to:
  393. ret += " == ";
  394. break;
  395. case Models.LOGIC_COMPARISON.not_equals_to:
  396. ret += " != ";
  397. break;
  398. case Models.LOGIC_COMPARISON.and:
  399. ret += " && ";
  400. break;
  401. case Models.LOGIC_COMPARISON.or:
  402. ret += " || ";
  403. break;
  404. }
  405. if (expression.second_operand.type == Models.EXPRESSION_TYPES.exp_logic) {
  406. ret += logicExpressionCode(expression.second_operand);
  407. } else if (
  408. expression.second_operand.type == Models.EXPRESSION_TYPES.exp_arithmetic
  409. ) {
  410. ret += arithmeticExpressionCode(expression.second_operand);
  411. } else {
  412. ret += variableValueMenuCode(expression.second_operand);
  413. }
  414. }
  415. ret += " ) ";
  416. return ret;
  417. }
  418. function arithmeticExpressionCode (expression) {
  419. let ret = " ( ";
  420. if (expression.first_operand.type == Models.EXPRESSION_TYPES.exp_logic) {
  421. ret += logicExpressionCode(expression.first_operand);
  422. } else if (
  423. expression.first_operand.type == Models.EXPRESSION_TYPES.exp_arithmetic
  424. ) {
  425. ret += arithmeticExpressionCode(expression.first_operand);
  426. } else {
  427. ret += variableValueMenuCode(expression.first_operand);
  428. }
  429. switch (expression.operator) {
  430. case Models.ARITHMETIC_COMPARISON.greater_than:
  431. ret += " > ";
  432. break;
  433. case Models.ARITHMETIC_COMPARISON.less_than:
  434. ret += " < ";
  435. break;
  436. case Models.ARITHMETIC_COMPARISON.equals_to:
  437. ret += " == ";
  438. break;
  439. case Models.ARITHMETIC_COMPARISON.not_equals_to:
  440. ret += " != ";
  441. break;
  442. case Models.ARITHMETIC_COMPARISON.greater_than_or_equals_to:
  443. ret += " >= ";
  444. break;
  445. case Models.ARITHMETIC_COMPARISON.less_than_or_equals_to:
  446. ret += " <= ";
  447. break;
  448. }
  449. if (expression.second_operand.type == Models.EXPRESSION_TYPES.exp_logic) {
  450. ret += logicExpressionCode(expression.second_operand);
  451. } else if (
  452. expression.second_operand.type == Models.EXPRESSION_TYPES.exp_arithmetic
  453. ) {
  454. ret += arithmeticExpressionCode(expression.second_operand);
  455. } else {
  456. ret += variableValueMenuCode(expression.second_operand);
  457. }
  458. ret += " ) ";
  459. return ret;
  460. }
  461. function attributionsCode (command_obj, indentation) {
  462. let ret = "\n";
  463. for (let i = 0; i < indentation; i++) {
  464. ret += "\t";
  465. }
  466. ret += variableValueMenuCode(command_obj.variable) + " <- ";
  467. /*for (var i = 0; i < command_obj.expression.length; i++) {
  468. ret += elementExpressionCode(command_obj.expression[i]);
  469. }*/
  470. ret += elementExpressionCode(command_obj.expression);
  471. return ret;
  472. }
  473. export function elementExpressionCode (expression_obj) {
  474. let ret = "";
  475. for (let i = 0; i < expression_obj.length; i++) {
  476. if (expression_obj[i].type) {
  477. ret += variableValueMenuCode(expression_obj[i]);
  478. } else if (expression_obj[i].type_op) {
  479. console.log('veja', expression_obj[i].item)
  480. switch (expression_obj[i].item) {
  481. case Models.ARITHMETIC_TYPES.plus:
  482. ret += " + ";
  483. break;
  484. case Models.ARITHMETIC_TYPES.minus:
  485. ret += " - ";
  486. break;
  487. case Models.ARITHMETIC_TYPES.multiplication:
  488. ret += " * ";
  489. break;
  490. case Models.ARITHMETIC_TYPES.division:
  491. ret += " / ";
  492. break;
  493. case Models.ARITHMETIC_TYPES.module:
  494. ret += " % ";
  495. break;
  496. case Models.LOGIC_COMPARISON.equals_to:
  497. ret += " == ";
  498. break;
  499. case Models.LOGIC_COMPARISON.not_equals_to:
  500. ret += " != ";
  501. break;
  502. case Models.LOGIC_COMPARISON.and:
  503. ret += " " + LocalizedStrings.getUI("logic_operator_and") + " ";
  504. break;
  505. case Models.LOGIC_COMPARISON.or:
  506. ret += " " + LocalizedStrings.getUI("logic_operator_or") + " ";
  507. break;
  508. case Models.LOGIC_COMPARISON.not:
  509. ret += " " + LocalizedStrings.getUI("logic_operator_not") + " ";
  510. break;
  511. case Models.ARITHMETIC_COMPARISON.greater_than:
  512. ret += " > ";
  513. break;
  514. case Models.ARITHMETIC_COMPARISON.less_than:
  515. ret += " < ";
  516. break;
  517. case Models.ARITHMETIC_COMPARISON.greater_than_or_equals_to:
  518. ret += " >= ";
  519. break;
  520. case Models.ARITHMETIC_COMPARISON.less_than_or_equals_to:
  521. ret += " <= ";
  522. break;
  523. case Models.EXPRESSION_TYPES.write_sep:
  524. ret += ', " ", ';
  525. break;
  526. }
  527. } else {
  528. ret += " " + expression_obj[i] + " ";
  529. }
  530. }
  531. return ret;
  532. }
  533. function functioncallsCode (command_obj, indentation) {
  534. let ret = "\n";
  535. for (let i = 0; i < indentation; i++) {
  536. ret += "\t";
  537. }
  538. ret += variableValueMenuCode(command_obj.function_called);
  539. return ret;
  540. }
  541. function readersCode (command_obj, indentation) {
  542. let ret = "\n";
  543. for (let i = 0; i < indentation; i++) {
  544. ret += "\t";
  545. }
  546. ret += LocalizedStrings.getUI("text_command_read") + " ( ";
  547. ret += variableValueMenuCode(command_obj.variable_value_menu);
  548. ret += " ) ";
  549. return ret;
  550. }
  551. export function variableValueMenuCode (variable_obj, is_return = false) {
  552. let ret = "";
  553. try {
  554. if (variable_obj.function_called) {
  555. if (variable_obj.function_called.name) {
  556. ret += variable_obj.function_called.name + " ( ";
  557. } else {
  558. ret +=
  559. LocalizedStrings.translateInternalFunction(
  560. variable_obj.function_called.identifier,
  561. variable_obj.function_called.category
  562. ) + " ( ";
  563. }
  564. if (variable_obj.parameters_list) {
  565. for (let i = 0; i < variable_obj.parameters_list.length; i++) {
  566. ret += variableValueMenuCode(variable_obj.parameters_list[i]);
  567. if (i + 1 < variable_obj.parameters_list.length) {
  568. ret += ", ";
  569. }
  570. }
  571. }
  572. ret += " )";
  573. } else if (variable_obj.content.type) {
  574. ret += variable_obj.content.name;
  575. if (
  576. variable_obj.content.dimensions == 1 &&
  577. variable_obj.dimensions != 1
  578. ) {
  579. ret += " [ " + variableValueMenuCode(variable_obj.column) + " ] ";
  580. }
  581. if (
  582. variable_obj.content.dimensions == 2 &&
  583. variable_obj.dimensions != 2
  584. ) {
  585. ret += " [ " + variableValueMenuCode(variable_obj.row) + " ] ";
  586. ret += " [ " + variableValueMenuCode(variable_obj.column) + " ] ";
  587. }
  588. } else {
  589. const content = String(variable_obj.content);
  590. if (isNaN(content)) {
  591. // console.debug("Content length: ", content.length);
  592. // console.debug("Char code at 0", content.charCodeAt(0));
  593. const isBackslash = content.charCodeAt(0) === 92;
  594. if (content.length === 1 || (content.length === 2 && isBackslash)) {
  595. ret += `'${content}'`;
  596. } else {
  597. ret += '"' + variable_obj.content + '"';
  598. }
  599. } else if (content.length == 0) {
  600. ret += '""';
  601. } else if (content.trim().length == 0) {
  602. ret += '"' + content + '"';
  603. } else {
  604. ret += variable_obj.content;
  605. }
  606. }
  607. } catch (err) {
  608. if (!is_return) {
  609. Utils.renderErrorMessage(
  610. variable_obj.dom_object,
  611. LocalizedStrings.getUI("inform_valid_content")
  612. );
  613. throw err;
  614. }
  615. }
  616. return ret;
  617. }
  618. function writersCode (command_obj, indentation) {
  619. let ret = "\n";
  620. for (let i = 0; i < indentation; i++) {
  621. ret += "\t";
  622. }
  623. ret += LocalizedStrings.getUI("text_command_write") + " ( ";
  624. /*for (var i = 0; i < command_obj.content.length; i++) {
  625. ret += variableValueMenuCode(command_obj.content[i]);
  626. if ((i + 1) < command_obj.content.length) {
  627. ret += ' + ';
  628. }
  629. }*/
  630. ret += elementExpressionCode(command_obj.content);
  631. if (command_obj.newline) {
  632. ret += ', "\\n"';
  633. }
  634. ret += " ) ";
  635. return ret;
  636. }
  637. function commentsCode (command_obj, indentation) {
  638. let ret = "\n";
  639. for (let i = 0; i < indentation; i++) {
  640. ret += "\t";
  641. }
  642. ret += "// ";
  643. ret += command_obj.comment_text.content;
  644. return ret;
  645. }
  646. function parametersCode (parameter_obj) {
  647. let ret = "";
  648. switch (parameter_obj.type) {
  649. case Types.INTEGER:
  650. ret += " " + LocalizedStrings.getUI("type_integer") + " ";
  651. break;
  652. case Types.REAL:
  653. ret += " " + LocalizedStrings.getUI("type_real") + " ";
  654. break;
  655. case Types.TEXT:
  656. ret += " " + LocalizedStrings.getUI("type_text") + " ";
  657. break;
  658. case Types.BOOLEAN:
  659. ret += " " + LocalizedStrings.getUI("type_boolean") + " ";
  660. break;
  661. case Types.CHAR:
  662. ret += " " + LocalizedStrings.getUI("type_char") + " ";
  663. break;
  664. }
  665. ret += parameter_obj.name + "";
  666. if (parameter_obj.dimensions == 1) {
  667. ret += " []";
  668. } else if (parameter_obj.dimensions == 2) {
  669. ret += " [][]";
  670. }
  671. return ret;
  672. }
  673. function variablesCode (variable_obj) {
  674. let ret = "";
  675. const temp = variable_obj;
  676. ret += "\n\t\t";
  677. if (temp.is_constant) {
  678. ret += "const ";
  679. }
  680. switch (temp.type) {
  681. case Types.INTEGER:
  682. ret += LocalizedStrings.getUI("type_integer") + " ";
  683. break;
  684. case Types.REAL:
  685. ret += LocalizedStrings.getUI("type_real") + " ";
  686. break;
  687. case Types.TEXT:
  688. ret += LocalizedStrings.getUI("type_text") + " ";
  689. break;
  690. case Types.BOOLEAN:
  691. ret += LocalizedStrings.getUI("type_boolean") + " ";
  692. break;
  693. case Types.CHAR:
  694. ret += LocalizedStrings.getUI("type_char") + " ";
  695. break;
  696. }
  697. ret += temp.name + " ";
  698. if (temp.dimensions == 1) {
  699. ret += "[" + temp.columns + "] ";
  700. switch (temp.type) {
  701. case Types.INTEGER:
  702. ret += "<- {";
  703. for (let j = 0; j < temp.value.length; j++) {
  704. ret += temp.value[j];
  705. if (j + 1 < temp.value.length) {
  706. ret += ", ";
  707. }
  708. }
  709. ret += "}";
  710. break;
  711. case Types.REAL:
  712. ret += "<- {";
  713. for (let j = 0; j < temp.value.length; j++) {
  714. ret += temp.value[j].toFixed(2);
  715. if (j + 1 < temp.value.length) {
  716. ret += ", ";
  717. }
  718. }
  719. ret += "}";
  720. break;
  721. case Types.TEXT:
  722. ret += "<- {";
  723. for (let j = 0; j < temp.value.length; j++) {
  724. ret += '"' + temp.value[j] + '"';
  725. if (j + 1 < temp.value.length) {
  726. ret += ", ";
  727. }
  728. }
  729. ret += "}";
  730. break;
  731. case Types.BOOLEAN:
  732. ret += "<- {";
  733. for (let j = 0; j < temp.value.length; j++) {
  734. if (temp.value[j]) {
  735. ret += LocalizedStrings.getUI("logic_value_true");
  736. } else {
  737. ret += LocalizedStrings.getUI("logic_value_false");
  738. }
  739. if (j + 1 < temp.value.length) {
  740. ret += ", ";
  741. }
  742. }
  743. ret += "}";
  744. break;
  745. case Types.CHAR:
  746. ret += "<- {";
  747. for (let j = 0; j < temp.value.length; j++) {
  748. ret += "'" + temp.value[j] + "'";
  749. if (j + 1 < temp.value.length) {
  750. ret += ", ";
  751. }
  752. }
  753. ret += "}";
  754. break;
  755. }
  756. } else if (temp.dimensions == 2) {
  757. ret += "[" + temp.rows + "][" + temp.columns + "] ";
  758. switch (temp.type) {
  759. case Types.INTEGER:
  760. ret += "<- {";
  761. for (let j = 0; j < temp.rows; j++) {
  762. ret += "{";
  763. for (let k = 0; k < temp.columns; k++) {
  764. ret += temp.value[j][k];
  765. if (k + 1 < temp.columns) {
  766. ret += ", ";
  767. }
  768. }
  769. ret += "}";
  770. if (j + 1 < temp.rows) {
  771. ret += ", ";
  772. }
  773. }
  774. ret += "}";
  775. break;
  776. case Types.REAL:
  777. ret += "<- {";
  778. for (let j = 0; j < temp.rows; j++) {
  779. ret += "{";
  780. for (let k = 0; k < temp.columns; k++) {
  781. ret += temp.value[j][k].toFixed(2);
  782. if (k + 1 < temp.columns) {
  783. ret += ", ";
  784. }
  785. }
  786. ret += "}";
  787. if (j + 1 < temp.rows) {
  788. ret += ", ";
  789. }
  790. }
  791. ret += "}";
  792. break;
  793. case Types.TEXT:
  794. ret += "<- {";
  795. for (let j = 0; j < temp.rows; j++) {
  796. ret += "{";
  797. for (let k = 0; k < temp.columns; k++) {
  798. ret += '"' + temp.value[j][k] + '"';
  799. if (k + 1 < temp.columns) {
  800. ret += ", ";
  801. }
  802. }
  803. ret += "}";
  804. if (j + 1 < temp.rows) {
  805. ret += ", ";
  806. }
  807. }
  808. ret += "}";
  809. break;
  810. case Types.BOOLEAN:
  811. ret += "<- {";
  812. for (let j = 0; j < temp.rows; j++) {
  813. ret += "{";
  814. for (let k = 0; k < temp.columns; k++) {
  815. if (temp.value[j][k]) {
  816. ret += LocalizedStrings.getUI("logic_value_true");
  817. } else {
  818. ret += LocalizedStrings.getUI("logic_value_false");
  819. }
  820. if (k + 1 < temp.columns) {
  821. ret += ", ";
  822. }
  823. }
  824. ret += "}";
  825. if (j + 1 < temp.rows) {
  826. ret += ", ";
  827. }
  828. }
  829. ret += "}";
  830. break;
  831. case Types.CHAR:
  832. ret += "<- {";
  833. for (let j = 0; j < temp.rows; j++) {
  834. ret += "{";
  835. for (let k = 0; k < temp.columns; k++) {
  836. ret += "'" + temp.value[j][k] + "'";
  837. if (k + 1 < temp.columns) {
  838. ret += ", ";
  839. }
  840. }
  841. ret += "}";
  842. if (j + 1 < temp.rows) {
  843. ret += ", ";
  844. }
  845. }
  846. ret += "}";
  847. break;
  848. }
  849. } else {
  850. switch (temp.type) {
  851. case Types.INTEGER:
  852. ret += "<- " + temp.value;
  853. break;
  854. case Types.REAL:
  855. ret += "<- " + temp.value.toFixed(2);
  856. break;
  857. case Types.TEXT:
  858. ret += '<- "' + temp.value + '"';
  859. break;
  860. case Types.BOOLEAN:
  861. ret += "<- ";
  862. if (temp.value) {
  863. ret += LocalizedStrings.getUI("logic_value_true");
  864. } else {
  865. ret += LocalizedStrings.getUI("logic_value_false");
  866. }
  867. break;
  868. case Types.CHAR:
  869. ret += "<- '" + temp.value + "'";
  870. break;
  871. }
  872. }
  873. return ret;
  874. }
  875. function globalsCode () {
  876. let ret = "";
  877. if (window.program_obj.globals) {
  878. for (let i = 0; i < window.program_obj.globals.length; i++) {
  879. const temp = window.program_obj.globals[i];
  880. ret += "\n\t";
  881. if (temp.is_constant) {
  882. ret += "const ";
  883. }
  884. switch (temp.type) {
  885. case Types.INTEGER:
  886. ret += LocalizedStrings.getUI("type_integer");
  887. break;
  888. case Types.REAL:
  889. ret += LocalizedStrings.getUI("type_real");
  890. break;
  891. case Types.TEXT:
  892. ret += LocalizedStrings.getUI("type_text");
  893. break;
  894. case Types.BOOLEAN:
  895. ret += LocalizedStrings.getUI("type_boolean");
  896. break;
  897. case Types.CHAR:
  898. ret += LocalizedStrings.getUI("type_char");
  899. break;
  900. }
  901. ret += " " + temp.name + " ";
  902. if (temp.dimensions == 1) {
  903. ret += "[" + temp.columns + "] ";
  904. switch (temp.type) {
  905. case Types.INTEGER:
  906. ret += "<- {";
  907. for (let j = 0; j < temp.value.length; j++) {
  908. ret += temp.value[j];
  909. if (j + 1 < temp.value.length) {
  910. ret += ", ";
  911. }
  912. }
  913. ret += "}";
  914. break;
  915. case Types.REAL:
  916. ret += "<- {";
  917. for (let j = 0; j < temp.value.length; j++) {
  918. ret += temp.value[j].toFixed(2);
  919. if (j + 1 < temp.value.length) {
  920. ret += ", ";
  921. }
  922. }
  923. ret += "}";
  924. break;
  925. case Types.TEXT:
  926. ret += "<- {";
  927. for (let j = 0; j < temp.value.length; j++) {
  928. ret += '"' + temp.value[j] + '"';
  929. if (j + 1 < temp.value.length) {
  930. ret += ", ";
  931. }
  932. }
  933. ret += "}";
  934. break;
  935. case Types.BOOLEAN:
  936. ret += "<- {";
  937. for (let j = 0; j < temp.value.length; j++) {
  938. if (temp.value[j]) {
  939. ret += LocalizedStrings.getUI("logic_value_true");
  940. } else {
  941. ret += LocalizedStrings.getUI("logic_value_false");
  942. }
  943. if (j + 1 < temp.value.length) {
  944. ret += ", ";
  945. }
  946. }
  947. ret += "}";
  948. break;
  949. case Types.CHAR:
  950. ret += "<- {";
  951. for (let j = 0; j < temp.value.length; j++) {
  952. ret += "'" + temp.value[j] + "'";
  953. if (j + 1 < temp.value.length) {
  954. ret += ", ";
  955. }
  956. }
  957. ret += "}";
  958. break;
  959. }
  960. } else if (temp.dimensions == 2) {
  961. ret += "[" + temp.rows + "][" + temp.columns + "] ";
  962. switch (temp.type) {
  963. case Types.INTEGER:
  964. ret += "<- {";
  965. for (let j = 0; j < temp.rows; j++) {
  966. ret += "{";
  967. for (let k = 0; k < temp.columns; k++) {
  968. ret += temp.value[j][k];
  969. if (k + 1 < temp.columns) {
  970. ret += ", ";
  971. }
  972. }
  973. ret += "}";
  974. if (j + 1 < temp.rows) {
  975. ret += ", ";
  976. }
  977. }
  978. ret += "}";
  979. break;
  980. case Types.REAL:
  981. ret += "<- {";
  982. for (let j = 0; j < temp.rows; j++) {
  983. ret += "{";
  984. for (let k = 0; k < temp.columns; k++) {
  985. ret += temp.value[j][k].toFixed(2);
  986. if (k + 1 < temp.columns) {
  987. ret += ", ";
  988. }
  989. }
  990. ret += "}";
  991. if (j + 1 < temp.rows) {
  992. ret += ", ";
  993. }
  994. }
  995. ret += "}";
  996. break;
  997. case Types.TEXT:
  998. ret += "<- {";
  999. for (let j = 0; j < temp.rows; j++) {
  1000. ret += "{";
  1001. for (let k = 0; k < temp.columns; k++) {
  1002. ret += '"' + temp.value[j][k] + '"';
  1003. if (k + 1 < temp.columns) {
  1004. ret += ", ";
  1005. }
  1006. }
  1007. ret += "}";
  1008. if (j + 1 < temp.rows) {
  1009. ret += ", ";
  1010. }
  1011. }
  1012. ret += "}";
  1013. break;
  1014. case Types.BOOLEAN:
  1015. ret += "<- {";
  1016. for (let j = 0; j < temp.rows; j++) {
  1017. ret += "{";
  1018. for (let k = 0; k < temp.columns; k++) {
  1019. if (temp.value[j][k]) {
  1020. ret += LocalizedStrings.getUI("logic_value_true");
  1021. } else {
  1022. ret += LocalizedStrings.getUI("logic_value_false");
  1023. }
  1024. if (k + 1 < temp.columns) {
  1025. ret += ", ";
  1026. }
  1027. }
  1028. ret += "}";
  1029. if (j + 1 < temp.rows) {
  1030. ret += ", ";
  1031. }
  1032. }
  1033. ret += "}";
  1034. break;
  1035. case Types.CHAR:
  1036. ret += "<- {";
  1037. for (let j = 0; j < temp.rows; j++) {
  1038. ret += "{";
  1039. for (let k = 0; k < temp.columns; k++) {
  1040. ret += "'" + temp.value[j][k] + "'";
  1041. if (k + 1 < temp.columns) {
  1042. ret += ", ";
  1043. }
  1044. }
  1045. ret += "}";
  1046. if (j + 1 < temp.rows) {
  1047. ret += ", ";
  1048. }
  1049. }
  1050. ret += "}";
  1051. break;
  1052. }
  1053. } else {
  1054. switch (temp.type) {
  1055. case Types.INTEGER:
  1056. ret += "<- " + temp.value;
  1057. break;
  1058. case Types.REAL:
  1059. ret += "<- " + temp.value.toFixed(2);
  1060. break;
  1061. case Types.TEXT:
  1062. ret += '<- "' + temp.value + '"';
  1063. break;
  1064. case Types.BOOLEAN:
  1065. ret += "<- ";
  1066. if (temp.value) {
  1067. ret += LocalizedStrings.getUI("logic_value_true");
  1068. } else {
  1069. ret += LocalizedStrings.getUI("logic_value_false");
  1070. }
  1071. break;
  1072. case Types.CHAR:
  1073. ret += "<- '" + temp.value + "'";
  1074. break;
  1075. }
  1076. }
  1077. }
  1078. }
  1079. return ret;
  1080. }