1
0

code_generator.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  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. var code = LocalizedStrings.getUI('program') + ' { ';
  10. code += globalsCode();
  11. code += '\n';
  12. for (var i = 0; i < window.program_obj.functions.length; i ++) {
  13. code += functionsCode(window.program_obj.functions[i]);
  14. code += '\n';
  15. }
  16. code += '\n}';
  17. return code;
  18. }
  19. function functionsCode (function_obj) {
  20. var ret = '\n\t' + LocalizedStrings.getUI('function') + ' ';
  21. switch (function_obj.return_type) {
  22. case Types.INTEGER:
  23. ret += LocalizedStrings.getUI('integer');
  24. break;
  25. case Types.REAL:
  26. ret += LocalizedStrings.getUI('real');
  27. break;
  28. case Types.TEXT:
  29. ret += LocalizedStrings.getUI('text');
  30. break;
  31. case Types.BOOLEAN:
  32. ret += LocalizedStrings.getUI('boolean');
  33. break;
  34. case Types.VOID:
  35. ret += LocalizedStrings.getUI('void');
  36. break;
  37. }
  38. ret += ' ';
  39. if (function_obj.return_dimensions == 1) {
  40. ret += '[] '
  41. } else if (function_obj.return_dimensions == 2) {
  42. ret += '[][] '
  43. }
  44. ret += function_obj.name + ' ( ';
  45. for (var j = 0; j < function_obj.parameters_list.length; j++) {
  46. ret += parametersCode(function_obj.parameters_list[j]);
  47. if ((j + 1) < function_obj.parameters_list.length) {
  48. ret += ',';
  49. }
  50. }
  51. ret += ' ) {';
  52. for (var j = 0; j < function_obj.variables_list.length; j++) {
  53. ret += variablesCode(function_obj.variables_list[j]);
  54. }
  55. for (var j = 0; j < function_obj.commands.length; j++) {
  56. ret += commandsCode(function_obj.commands[j]);
  57. }
  58. ret += '\n\t}';
  59. return ret;
  60. }
  61. function commandsCode (command_obj) {
  62. switch (command_obj.type) {
  63. case Models.COMMAND_TYPES.comment:
  64. return commentsCode(command_obj);
  65. case Models.COMMAND_TYPES.reader:
  66. return readersCode(command_obj);
  67. case Models.COMMAND_TYPES.writer:
  68. return writersCode(command_obj);
  69. case Models.COMMAND_TYPES.functioncall:
  70. return functioncallsCode(command_obj);
  71. }
  72. }
  73. function functioncallsCode (command_obj) {
  74. var ret = '\n\t\t';
  75. ret += variableValueMenuCode(command_obj.function_called);
  76. return ret;
  77. }
  78. function readersCode (command_obj) {
  79. var ret = '\n\t\t' + LocalizedStrings.getUI('text_command_read') + ' ( ';
  80. ret += variableValueMenuCode(command_obj.variable_value_menu);
  81. ret += ' ) ';
  82. return ret;
  83. }
  84. function variableValueMenuCode (variable_obj) {
  85. var ret = '';
  86. if (variable_obj.function_called) {
  87. ret += variable_obj.function_called.name + ' ( ';
  88. if (variable_obj.parameters_list) {
  89. for (var i = 0; i < variable_obj.parameters_list.length; i++) {
  90. ret += variableValueMenuCode(variable_obj.parameters_list[i]);
  91. if ((i + 1) < variable_obj.parameters_list.length) {
  92. ret += ', ';
  93. }
  94. }
  95. }
  96. ret += ' )';
  97. } else if (variable_obj.content.type) {
  98. ret += variable_obj.content.name;
  99. if (variable_obj.content.dimensions == 1) {
  100. ret += ' [ ' + variableValueMenuCode(variable_obj.column) + ' ] ';
  101. }
  102. if (variable_obj.content.dimensions == 2) {
  103. ret += ' [ ' + variableValueMenuCode(variable_obj.row) + ' ] ';
  104. ret += ' [ ' + variableValueMenuCode(variable_obj.column) + ' ] ';
  105. }
  106. } else {
  107. ret += variable_obj.content;
  108. }
  109. return ret;
  110. }
  111. function writersCode (command_obj) {
  112. var ret = '\n\t\t' + LocalizedStrings.getUI('text_command_write') + ' ( ';
  113. for (var i = 0; i < command_obj.content.length; i++) {
  114. ret += variableValueMenuCode(command_obj.content[i]);
  115. if ((i + 1) < command_obj.content.length) {
  116. ret += ' + ';
  117. }
  118. }
  119. ret += ' ) ';
  120. return ret;
  121. }
  122. function commentsCode (command_obj) {
  123. var ret = '\n\t\t// ';
  124. ret += command_obj.comment_text.content;
  125. return ret;
  126. }
  127. function parametersCode (parameter_obj) {
  128. var ret = '';
  129. switch (parameter_obj.type) {
  130. case Types.INTEGER:
  131. ret += ' '+LocalizedStrings.getUI('integer')+' ';
  132. break;
  133. case Types.REAL:
  134. ret += ' '+LocalizedStrings.getUI('real')+' ';
  135. break;
  136. case Types.TEXT:
  137. ret += ' '+LocalizedStrings.getUI('text')+' ';
  138. break;
  139. case Types.BOOLEAN:
  140. ret += ' '+LocalizedStrings.getUI('boolean')+' ';
  141. break;
  142. }
  143. ret += parameter_obj.name + '';
  144. if (parameter_obj.dimensions == 1) {
  145. ret += ' []'
  146. } else if (parameter_obj.dimensions == 2) {
  147. ret += ' [][]'
  148. }
  149. return ret;
  150. }
  151. function variablesCode (variable_obj) {
  152. var ret = '';
  153. var temp = variable_obj;
  154. ret += '\n\t\t';
  155. if (temp.is_constant) {
  156. ret += 'const ';
  157. }
  158. switch (temp.type) {
  159. case Types.INTEGER:
  160. ret += LocalizedStrings.getUI('integer')+' ';
  161. break;
  162. case Types.REAL:
  163. ret += LocalizedStrings.getUI('real')+' ';
  164. break;
  165. case Types.TEXT:
  166. ret += LocalizedStrings.getUI('text')+' ';
  167. break;
  168. case Types.BOOLEAN:
  169. ret += LocalizedStrings.getUI('boolean')+' ';
  170. break;
  171. }
  172. ret += temp.name + ' ';
  173. if (temp.dimensions == 1) {
  174. ret += '[' + temp.columns + '] ';
  175. switch (temp.type) {
  176. case Types.INTEGER:
  177. case Types.REAL:
  178. ret += '= {' + temp.value + '}';
  179. break;
  180. case Types.TEXT:
  181. ret += '= {';
  182. for (var j = 0; j < temp.value.length; j++) {
  183. ret += '"'+temp.value[j]+'"';
  184. if ((j + 1) < temp.value.length) {
  185. ret += ',';
  186. }
  187. }
  188. ret += '}';
  189. break;
  190. case Types.BOOLEAN:
  191. ret += '= {';
  192. for (var j = 0; j < temp.value.length; j++) {
  193. if (temp.value[j]) {
  194. ret += LocalizedStrings.getUI("true");
  195. } else {
  196. ret += LocalizedStrings.getUI("false");
  197. }
  198. if ((j + 1) < temp.value.length) {
  199. ret += ',';
  200. }
  201. }
  202. ret += '}';
  203. break;
  204. }
  205. } else if (temp.dimensions == 2) {
  206. ret += '[' + temp.rows + '][' + temp.columns + '] ';
  207. switch (temp.type) {
  208. case Types.INTEGER:
  209. case Types.REAL:
  210. ret += '= {';
  211. for (var j = 0; j < temp.rows; j++) {
  212. ret += '{' + temp.value[j] + '}';
  213. if ((j + 1) < temp.rows) {
  214. ret += ',';
  215. }
  216. }
  217. ret += '}';
  218. break;
  219. case Types.TEXT:
  220. ret += '= {';
  221. for (var j = 0; j < temp.rows; j++) {
  222. ret += '{';
  223. for (var k = 0; k < temp.columns; k++) {
  224. ret += '"' + temp.value[j][k] + '"';
  225. if ((k + 1) < temp.columns) {
  226. ret += ',';
  227. }
  228. }
  229. ret += '}';
  230. if ((j + 1) < temp.rows) {
  231. ret += ',';
  232. }
  233. }
  234. ret += '}';
  235. break;
  236. case Types.BOOLEAN:
  237. ret += '= {';
  238. for (var j = 0; j < temp.rows; j++) {
  239. ret += '{';
  240. for (var k = 0; k < temp.columns; k++) {
  241. if (temp.value[j][k]) {
  242. ret += LocalizedStrings.getUI("true");
  243. } else {
  244. ret += LocalizedStrings.getUI("false");
  245. }
  246. if ((k + 1) < temp.columns) {
  247. ret += ',';
  248. }
  249. }
  250. ret += '}';
  251. if ((j + 1) < temp.rows) {
  252. ret += ',';
  253. }
  254. }
  255. ret += '}';
  256. break;
  257. }
  258. } else {
  259. switch (temp.type) {
  260. case Types.INTEGER:
  261. case Types.REAL:
  262. ret += '= ' + temp.value;
  263. break;
  264. case Types.TEXT:
  265. ret += '= "' + temp.value + '"';
  266. break;
  267. case Types.BOOLEAN:
  268. ret += '= ';
  269. if (temp.value) {
  270. ret += LocalizedStrings.getUI("true");
  271. } else {
  272. ret += LocalizedStrings.getUI("false");
  273. }
  274. break;
  275. }
  276. }
  277. return ret;
  278. }
  279. function globalsCode () {
  280. var ret = '';
  281. if (window.program_obj.globals) {
  282. for (var i = 0; i < window.program_obj.globals.length; i++) {
  283. var temp = window.program_obj.globals[i];
  284. ret += '\n\t';
  285. if (temp.is_constant) {
  286. ret += 'const ';
  287. }
  288. switch (temp.type) {
  289. case Types.INTEGER:
  290. ret += LocalizedStrings.getUI('integer');
  291. break;
  292. case Types.REAL:
  293. ret += LocalizedStrings.getUI('real');
  294. break;
  295. case Types.TEXT:
  296. ret += LocalizedStrings.getUI('text');
  297. break;
  298. case Types.BOOLEAN:
  299. ret += LocalizedStrings.getUI('boolean');
  300. break;
  301. }
  302. ret += ' ' + temp.name + ' ';
  303. if (temp.dimensions == 1) {
  304. ret += '[' + temp.columns + '] ';
  305. switch (temp.type) {
  306. case Types.INTEGER:
  307. case Types.REAL:
  308. ret += '= {' + temp.value + '}';
  309. break;
  310. case Types.TEXT:
  311. ret += '= {';
  312. for (var j = 0; j < temp.value.length; j++) {
  313. ret += '"'+temp.value[j]+'"';
  314. if ((j + 1) < temp.value.length) {
  315. ret += ',';
  316. }
  317. }
  318. ret += '}';
  319. break;
  320. case Types.BOOLEAN:
  321. ret += '= {';
  322. for (var j = 0; j < temp.value.length; j++) {
  323. if (temp.value[j]) {
  324. ret += LocalizedStrings.getUI("true");
  325. } else {
  326. ret += LocalizedStrings.getUI("false");
  327. }
  328. if ((j + 1) < temp.value.length) {
  329. ret += ',';
  330. }
  331. }
  332. ret += '}';
  333. break;
  334. }
  335. } else if (temp.dimensions == 2) {
  336. ret += '[' + temp.rows + '][' + temp.columns + '] ';
  337. switch (temp.type) {
  338. case Types.INTEGER:
  339. case Types.REAL:
  340. ret += '= {';
  341. for (var j = 0; j < temp.rows; j++) {
  342. ret += '{' + temp.value[j] + '}';
  343. if ((j + 1) < temp.rows) {
  344. ret += ',';
  345. }
  346. }
  347. ret += '}';
  348. break;
  349. case Types.TEXT:
  350. ret += '= {';
  351. for (var j = 0; j < temp.rows; j++) {
  352. ret += '{';
  353. for (var k = 0; k < temp.columns; k++) {
  354. ret += '"' + temp.value[j][k] + '"';
  355. if ((k + 1) < temp.columns) {
  356. ret += ',';
  357. }
  358. }
  359. ret += '}';
  360. if ((j + 1) < temp.rows) {
  361. ret += ',';
  362. }
  363. }
  364. ret += '}';
  365. break;
  366. case Types.BOOLEAN:
  367. ret += '= {';
  368. for (var j = 0; j < temp.rows; j++) {
  369. ret += '{';
  370. for (var k = 0; k < temp.columns; k++) {
  371. if (temp.value[j][k]) {
  372. ret += LocalizedStrings.getUI("true");
  373. } else {
  374. ret += LocalizedStrings.getUI("false");
  375. }
  376. if ((k + 1) < temp.columns) {
  377. ret += ',';
  378. }
  379. }
  380. ret += '}';
  381. if ((j + 1) < temp.rows) {
  382. ret += ',';
  383. }
  384. }
  385. ret += '}';
  386. break;
  387. }
  388. } else {
  389. switch (temp.type) {
  390. case Types.INTEGER:
  391. case Types.REAL:
  392. ret += '= ' + temp.value;
  393. break;
  394. case Types.TEXT:
  395. ret += '= "' + temp.value + '"';
  396. break;
  397. case Types.BOOLEAN:
  398. ret += '= ';
  399. if (temp.value) {
  400. ret += LocalizedStrings.getUI("true");;
  401. } else {
  402. ret += LocalizedStrings.getUI("false");;
  403. }
  404. break;
  405. }
  406. }
  407. }
  408. }
  409. return ret;
  410. }