code_generator.js 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300
  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. if (parameter_obj.reference)
  666. ret += "&";
  667. ret += parameter_obj.name + "";
  668. if (parameter_obj.dimensions == 1) {
  669. ret += " []";
  670. } else if (parameter_obj.dimensions == 2) {
  671. ret += " [][]";
  672. }
  673. return ret;
  674. }
  675. function variablesCode (variable_obj) {
  676. let ret = "";
  677. const temp = variable_obj;
  678. ret += "\n\t\t";
  679. if (temp.is_constant) {
  680. ret += "const ";
  681. }
  682. switch (temp.type) {
  683. case Types.INTEGER:
  684. ret += LocalizedStrings.getUI("type_integer") + " ";
  685. break;
  686. case Types.REAL:
  687. ret += LocalizedStrings.getUI("type_real") + " ";
  688. break;
  689. case Types.TEXT:
  690. ret += LocalizedStrings.getUI("type_text") + " ";
  691. break;
  692. case Types.BOOLEAN:
  693. ret += LocalizedStrings.getUI("type_boolean") + " ";
  694. break;
  695. case Types.CHAR:
  696. ret += LocalizedStrings.getUI("type_char") + " ";
  697. break;
  698. }
  699. ret += temp.name + " ";
  700. if (temp.dimensions == 1) {
  701. ret += "[" + temp.columns + "] ";
  702. switch (temp.type) {
  703. case Types.INTEGER:
  704. ret += "<- {";
  705. for (let j = 0; j < temp.value.length; j++) {
  706. ret += temp.value[j];
  707. if (j + 1 < temp.value.length) {
  708. ret += ", ";
  709. }
  710. }
  711. ret += "}";
  712. break;
  713. case Types.REAL:
  714. ret += "<- {";
  715. for (let j = 0; j < temp.value.length; j++) {
  716. ret += temp.value[j].toFixed(2);
  717. if (j + 1 < temp.value.length) {
  718. ret += ", ";
  719. }
  720. }
  721. ret += "}";
  722. break;
  723. case Types.TEXT:
  724. ret += "<- {";
  725. for (let j = 0; j < temp.value.length; j++) {
  726. ret += '"' + temp.value[j] + '"';
  727. if (j + 1 < temp.value.length) {
  728. ret += ", ";
  729. }
  730. }
  731. ret += "}";
  732. break;
  733. case Types.BOOLEAN:
  734. ret += "<- {";
  735. for (let j = 0; j < temp.value.length; j++) {
  736. if (temp.value[j]) {
  737. ret += LocalizedStrings.getUI("logic_value_true");
  738. } else {
  739. ret += LocalizedStrings.getUI("logic_value_false");
  740. }
  741. if (j + 1 < temp.value.length) {
  742. ret += ", ";
  743. }
  744. }
  745. ret += "}";
  746. break;
  747. case Types.CHAR:
  748. ret += "<- {";
  749. for (let j = 0; j < temp.value.length; j++) {
  750. ret += "'" + temp.value[j] + "'";
  751. if (j + 1 < temp.value.length) {
  752. ret += ", ";
  753. }
  754. }
  755. ret += "}";
  756. break;
  757. }
  758. } else if (temp.dimensions == 2) {
  759. ret += "[" + temp.rows + "][" + temp.columns + "] ";
  760. switch (temp.type) {
  761. case Types.INTEGER:
  762. ret += "<- {";
  763. for (let j = 0; j < temp.rows; j++) {
  764. ret += "{";
  765. for (let k = 0; k < temp.columns; k++) {
  766. ret += temp.value[j][k];
  767. if (k + 1 < temp.columns) {
  768. ret += ", ";
  769. }
  770. }
  771. ret += "}";
  772. if (j + 1 < temp.rows) {
  773. ret += ", ";
  774. }
  775. }
  776. ret += "}";
  777. break;
  778. case Types.REAL:
  779. ret += "<- {";
  780. for (let j = 0; j < temp.rows; j++) {
  781. ret += "{";
  782. for (let k = 0; k < temp.columns; k++) {
  783. ret += temp.value[j][k].toFixed(2);
  784. if (k + 1 < temp.columns) {
  785. ret += ", ";
  786. }
  787. }
  788. ret += "}";
  789. if (j + 1 < temp.rows) {
  790. ret += ", ";
  791. }
  792. }
  793. ret += "}";
  794. break;
  795. case Types.TEXT:
  796. ret += "<- {";
  797. for (let j = 0; j < temp.rows; j++) {
  798. ret += "{";
  799. for (let k = 0; k < temp.columns; k++) {
  800. ret += '"' + temp.value[j][k] + '"';
  801. if (k + 1 < temp.columns) {
  802. ret += ", ";
  803. }
  804. }
  805. ret += "}";
  806. if (j + 1 < temp.rows) {
  807. ret += ", ";
  808. }
  809. }
  810. ret += "}";
  811. break;
  812. case Types.BOOLEAN:
  813. ret += "<- {";
  814. for (let j = 0; j < temp.rows; j++) {
  815. ret += "{";
  816. for (let k = 0; k < temp.columns; k++) {
  817. if (temp.value[j][k]) {
  818. ret += LocalizedStrings.getUI("logic_value_true");
  819. } else {
  820. ret += LocalizedStrings.getUI("logic_value_false");
  821. }
  822. if (k + 1 < temp.columns) {
  823. ret += ", ";
  824. }
  825. }
  826. ret += "}";
  827. if (j + 1 < temp.rows) {
  828. ret += ", ";
  829. }
  830. }
  831. ret += "}";
  832. break;
  833. case Types.CHAR:
  834. ret += "<- {";
  835. for (let j = 0; j < temp.rows; j++) {
  836. ret += "{";
  837. for (let k = 0; k < temp.columns; k++) {
  838. ret += "'" + temp.value[j][k] + "'";
  839. if (k + 1 < temp.columns) {
  840. ret += ", ";
  841. }
  842. }
  843. ret += "}";
  844. if (j + 1 < temp.rows) {
  845. ret += ", ";
  846. }
  847. }
  848. ret += "}";
  849. break;
  850. }
  851. } else {
  852. switch (temp.type) {
  853. case Types.INTEGER:
  854. ret += "<- " + temp.value;
  855. break;
  856. case Types.REAL:
  857. ret += "<- " + temp.value.toFixed(2);
  858. break;
  859. case Types.TEXT:
  860. ret += '<- "' + temp.value + '"';
  861. break;
  862. case Types.BOOLEAN:
  863. ret += "<- ";
  864. if (temp.value) {
  865. ret += LocalizedStrings.getUI("logic_value_true");
  866. } else {
  867. ret += LocalizedStrings.getUI("logic_value_false");
  868. }
  869. break;
  870. case Types.CHAR:
  871. ret += "<- '" + temp.value + "'";
  872. break;
  873. }
  874. }
  875. return ret;
  876. }
  877. function globalsCode () {
  878. let ret = "";
  879. if (window.program_obj.globals) {
  880. for (let i = 0; i < window.program_obj.globals.length; i++) {
  881. const temp = window.program_obj.globals[i];
  882. ret += "\n\t";
  883. if (temp.is_constant) {
  884. ret += "const ";
  885. }
  886. switch (temp.type) {
  887. case Types.INTEGER:
  888. ret += LocalizedStrings.getUI("type_integer");
  889. break;
  890. case Types.REAL:
  891. ret += LocalizedStrings.getUI("type_real");
  892. break;
  893. case Types.TEXT:
  894. ret += LocalizedStrings.getUI("type_text");
  895. break;
  896. case Types.BOOLEAN:
  897. ret += LocalizedStrings.getUI("type_boolean");
  898. break;
  899. case Types.CHAR:
  900. ret += LocalizedStrings.getUI("type_char");
  901. break;
  902. }
  903. ret += " " + temp.name + " ";
  904. if (temp.dimensions == 1) {
  905. ret += "[" + temp.columns + "] ";
  906. switch (temp.type) {
  907. case Types.INTEGER:
  908. ret += "<- {";
  909. for (let j = 0; j < temp.value.length; j++) {
  910. ret += temp.value[j];
  911. if (j + 1 < temp.value.length) {
  912. ret += ", ";
  913. }
  914. }
  915. ret += "}";
  916. break;
  917. case Types.REAL:
  918. ret += "<- {";
  919. for (let j = 0; j < temp.value.length; j++) {
  920. ret += temp.value[j].toFixed(2);
  921. if (j + 1 < temp.value.length) {
  922. ret += ", ";
  923. }
  924. }
  925. ret += "}";
  926. break;
  927. case Types.TEXT:
  928. ret += "<- {";
  929. for (let j = 0; j < temp.value.length; j++) {
  930. ret += '"' + temp.value[j] + '"';
  931. if (j + 1 < temp.value.length) {
  932. ret += ", ";
  933. }
  934. }
  935. ret += "}";
  936. break;
  937. case Types.BOOLEAN:
  938. ret += "<- {";
  939. for (let j = 0; j < temp.value.length; j++) {
  940. if (temp.value[j]) {
  941. ret += LocalizedStrings.getUI("logic_value_true");
  942. } else {
  943. ret += LocalizedStrings.getUI("logic_value_false");
  944. }
  945. if (j + 1 < temp.value.length) {
  946. ret += ", ";
  947. }
  948. }
  949. ret += "}";
  950. break;
  951. case Types.CHAR:
  952. ret += "<- {";
  953. for (let j = 0; j < temp.value.length; j++) {
  954. ret += "'" + temp.value[j] + "'";
  955. if (j + 1 < temp.value.length) {
  956. ret += ", ";
  957. }
  958. }
  959. ret += "}";
  960. break;
  961. }
  962. } else if (temp.dimensions == 2) {
  963. ret += "[" + temp.rows + "][" + temp.columns + "] ";
  964. switch (temp.type) {
  965. case Types.INTEGER:
  966. ret += "<- {";
  967. for (let j = 0; j < temp.rows; j++) {
  968. ret += "{";
  969. for (let k = 0; k < temp.columns; k++) {
  970. ret += temp.value[j][k];
  971. if (k + 1 < temp.columns) {
  972. ret += ", ";
  973. }
  974. }
  975. ret += "}";
  976. if (j + 1 < temp.rows) {
  977. ret += ", ";
  978. }
  979. }
  980. ret += "}";
  981. break;
  982. case Types.REAL:
  983. ret += "<- {";
  984. for (let j = 0; j < temp.rows; j++) {
  985. ret += "{";
  986. for (let k = 0; k < temp.columns; k++) {
  987. ret += temp.value[j][k].toFixed(2);
  988. if (k + 1 < temp.columns) {
  989. ret += ", ";
  990. }
  991. }
  992. ret += "}";
  993. if (j + 1 < temp.rows) {
  994. ret += ", ";
  995. }
  996. }
  997. ret += "}";
  998. break;
  999. case Types.TEXT:
  1000. ret += "<- {";
  1001. for (let j = 0; j < temp.rows; j++) {
  1002. ret += "{";
  1003. for (let k = 0; k < temp.columns; k++) {
  1004. ret += '"' + temp.value[j][k] + '"';
  1005. if (k + 1 < temp.columns) {
  1006. ret += ", ";
  1007. }
  1008. }
  1009. ret += "}";
  1010. if (j + 1 < temp.rows) {
  1011. ret += ", ";
  1012. }
  1013. }
  1014. ret += "}";
  1015. break;
  1016. case Types.BOOLEAN:
  1017. ret += "<- {";
  1018. for (let j = 0; j < temp.rows; j++) {
  1019. ret += "{";
  1020. for (let k = 0; k < temp.columns; k++) {
  1021. if (temp.value[j][k]) {
  1022. ret += LocalizedStrings.getUI("logic_value_true");
  1023. } else {
  1024. ret += LocalizedStrings.getUI("logic_value_false");
  1025. }
  1026. if (k + 1 < temp.columns) {
  1027. ret += ", ";
  1028. }
  1029. }
  1030. ret += "}";
  1031. if (j + 1 < temp.rows) {
  1032. ret += ", ";
  1033. }
  1034. }
  1035. ret += "}";
  1036. break;
  1037. case Types.CHAR:
  1038. ret += "<- {";
  1039. for (let j = 0; j < temp.rows; j++) {
  1040. ret += "{";
  1041. for (let k = 0; k < temp.columns; k++) {
  1042. ret += "'" + temp.value[j][k] + "'";
  1043. if (k + 1 < temp.columns) {
  1044. ret += ", ";
  1045. }
  1046. }
  1047. ret += "}";
  1048. if (j + 1 < temp.rows) {
  1049. ret += ", ";
  1050. }
  1051. }
  1052. ret += "}";
  1053. break;
  1054. }
  1055. } else {
  1056. switch (temp.type) {
  1057. case Types.INTEGER:
  1058. ret += "<- " + temp.value;
  1059. break;
  1060. case Types.REAL:
  1061. ret += "<- " + temp.value.toFixed(2);
  1062. break;
  1063. case Types.TEXT:
  1064. ret += '<- "' + temp.value + '"';
  1065. break;
  1066. case Types.BOOLEAN:
  1067. ret += "<- ";
  1068. if (temp.value) {
  1069. ret += LocalizedStrings.getUI("logic_value_true");
  1070. } else {
  1071. ret += LocalizedStrings.getUI("logic_value_false");
  1072. }
  1073. break;
  1074. case Types.CHAR:
  1075. ret += "<- '" + temp.value + "'";
  1076. break;
  1077. }
  1078. }
  1079. }
  1080. }
  1081. return ret;
  1082. }