lang.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import { StoreObject } from '../store/storeObject';
  2. import * as Commands from './../../ast/commands';
  3. import { Types } from './../../typeSystem/types';
  4. import { toReal, convertBoolToString } from "./../../typeSystem/parsers";
  5. import { IVProgParser } from '../../ast/ivprogParser';
  6. import { RealLiteral, IntLiteral, BoolLiteral } from '../../ast/expressions';
  7. /**
  8. *
  9. * is_real
  10. * is_int
  11. * is_bool
  12. * cast_real
  13. * cast_int
  14. * cast_bool
  15. * cast_string
  16. */
  17. export function createIsRealFun () {
  18. const isRealFun = (sto, _) => {
  19. const str = sto.applyStore("str");
  20. const parser = IVProgParser.createParser(str.value);
  21. let result = false;
  22. try {
  23. const val = parser.parseTerm();
  24. if (val instanceof RealLiteral) {
  25. result = true;
  26. }
  27. } catch (error) { }
  28. const temp = new StoreObject(Types.BOOLEAN, result);
  29. return Promise.resolve(sto.updateStore("$", temp));
  30. }
  31. const block = new Commands.CommandBlock([], [new Commands.SysCall(isRealFun)]);
  32. const func = new Commands.Function('$isReal', Types.BOOLEAN,
  33. [new Commands.FormalParameter(Types.STRING, 'str', false)],
  34. block);
  35. return func;
  36. }
  37. export function createIsIntFun () {
  38. const isIntFun = (sto, _) => {
  39. const str = sto.applyStore("str");
  40. const parser = IVProgParser.createParser(str.value);
  41. let result = false;
  42. try {
  43. const val = parser.parseTerm();
  44. if (val instanceof IntLiteral) {
  45. result = true;
  46. }
  47. } catch (error) { }
  48. const temp = new StoreObject(Types.BOOLEAN, result);
  49. return Promise.resolve(sto.updateStore("$", temp));
  50. }
  51. const block = new Commands.CommandBlock([], [new Commands.SysCall(isIntFun)]);
  52. const func = new Commands.Function('$isInt', Types.BOOLEAN,
  53. [new Commands.FormalParameter(Types.STRING, 'str', false)],
  54. block);
  55. return func;
  56. }
  57. export function createIsBoolFun () {
  58. const isBoolFun = (sto, _) => {
  59. const str = sto.applyStore("str");
  60. const parser = IVProgParser.createParser(str.value);
  61. let result = false;
  62. try {
  63. const val = parser.parseTerm();
  64. if (val instanceof BoolLiteral) {
  65. result = true;
  66. }
  67. } catch (error) { }
  68. const temp = new StoreObject(Types.BOOLEAN, result);
  69. return Promise.resolve(sto.updateStore("$", temp));
  70. }
  71. const block = new Commands.CommandBlock([], [new Commands.SysCall(isBoolFun)]);
  72. const func = new Commands.Function('$isBool', Types.BOOLEAN,
  73. [new Commands.FormalParameter(Types.STRING, 'str', false)],
  74. block);
  75. return func;
  76. }
  77. export function createCastRealFun () {
  78. const castRealFun = (sto, _) => {
  79. const val = sto.applyStore("val");
  80. switch (val.type.ord) {
  81. case Types.INTEGER.ord: {
  82. const temp = new StoreObject(Types.REAL, toReal(val.number));
  83. return Promise.resolve(sto.updateStore("$", temp));
  84. }
  85. case Types.STRING.ord: {
  86. const parser = IVProgParser.createParser(val.value);
  87. try {
  88. const result = parser.parseTerm();
  89. if (result instanceof RealLiteral) {
  90. const temp = new StoreObject(Types.REAL, result.value);
  91. return Promise.resolve(sto.updateStore("$", temp));
  92. }
  93. } catch (error) {
  94. return Promise.reject("cannot convert string to real");
  95. }
  96. }
  97. }
  98. }
  99. const block = new Commands.CommandBlock([], [new Commands.SysCall(castRealFun)]);
  100. const func = new Commands.Function('$castReal', Types.REAL,
  101. [new Commands.FormalParameter(Types.ALL, 'val', false)],
  102. block);
  103. return func;
  104. }
  105. export function createCastIntFun () {
  106. const castIntFun = (sto, _) => {
  107. const val = sto.applyStore("val");
  108. switch (val.type.ord) {
  109. case Types.REAL.ord: {
  110. const temp = new StoreObject(Types.INTEGER, Math.floor(val.number));
  111. return Promise.resolve(sto.updateStore("$", temp));
  112. }
  113. case Types.STRING.ord: {
  114. const parser = IVProgParser.createParser(val.value);
  115. try {
  116. const result = parser.parseTerm();
  117. if (result instanceof IntLiteral) {
  118. const temp = new StoreObject(Types.INTEGER, result.value);
  119. return Promise.resolve(sto.updateStore("$", temp));
  120. }
  121. } catch (error) {
  122. return Promise.reject("cannot convert string to real");
  123. }
  124. }
  125. }
  126. }
  127. const block = new Commands.CommandBlock([], [new Commands.SysCall(castIntFun)]);
  128. const func = new Commands.Function('$castInt', Types.INTEGER,
  129. [new Commands.FormalParameter(Types.ALL, 'val', false)],
  130. block);
  131. return func;
  132. }
  133. export function createCastBoolFun () {
  134. const castBoolFun = (sto, _) => {
  135. const str = sto.applyStore("str");
  136. const parser = IVProgParser.createParser(str.value);
  137. try {
  138. const val = parser.parseTerm();
  139. if (val instanceof BoolLiteral) {
  140. const temp = new StoreObject(Types.BOOLEAN, val.value);
  141. return Promise.resolve(sto.updateStore("$", temp));
  142. }
  143. } catch (error) { }
  144. return Promise.reject("cannot convert " + str.value + " to boolean");
  145. }
  146. const block = new Commands.CommandBlock([], [new Commands.SysCall(castBoolFun)]);
  147. const func = new Commands.Function('$castBool', Types.BOOLEAN,
  148. [new Commands.FormalParameter(Types.STRING, 'str', false)],
  149. block);
  150. return func;
  151. }
  152. export function createCastStringFun () {
  153. const castStringFun = function (store, _) {
  154. const val = store.applyStore('str');
  155. if(val.type.isCompatible(Types.INTEGER)) {
  156. this.output.sendOutput(val.value.toString());
  157. } else if (val.type.isCompatible(Types.REAL)) {
  158. if (val.value.dp() <= 0) {
  159. this.output.sendOutput(val.value.toFixed(1));
  160. } else {
  161. this.output.sendOutput(val.value.toString());
  162. }
  163. } else {
  164. this.output.sendOutput(val.value);
  165. }
  166. let result = null;
  167. switch (val.type.ord) {
  168. case Types.INTEGER.ord:
  169. result = val.value.toString();
  170. break;
  171. case Types.REAL.ord: {
  172. if (val.value.dp() <= 0) {
  173. result = val.value.toFixed(1);
  174. } else {
  175. result = val.number;
  176. }
  177. break;
  178. }
  179. case Types.BOOLEAN.ord:
  180. result = convertBoolToString(val.value);
  181. break;
  182. default:
  183. result = val.value;
  184. break;
  185. }
  186. const temp = new StoreObject(Types.STRING, result);
  187. return Promise.resolve(sto.updateStore("$", temp));
  188. }
  189. const block = new Commands.CommandBlock([], [new Commands.SysCall(castStringFun)]);
  190. const func = new Commands.Function('$castString', Types.STRING,
  191. [new Commands.FormalParameter(Types.ALL, 'str', false)],
  192. block);
  193. return func;
  194. }