code_generator.js 24 KB

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