code_generator.js 25 KB

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