code_generator.js 21 KB

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