code_generator.js 28 KB

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