1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import * as Commands from './../../ast/commands';
- import { Modes } from '../modes';
- import {toInt, toString, toBool, toReal, convertToString} from './../../typeSystem/parsers';
- import { Types } from './../../typeSystem/types';
- import { ProcessorErrorFactory } from "./../error/processorErrorFactory";
- import { StoreValue } from '../store/value/store_value';
- export function createOutputFun () {
- const writeFunction = function (store, _) {
- const val = store.applyStore('p1');
- this.output.sendOutput(convertToString(val.get(), val.type));
- store.mode = Modes.RETURN;
- return Promise.resolve(store);
- }
- const block = new Commands.CommandBlock([], [new Commands.SysCall(writeFunction)]);
- const func = new Commands.Function('$write', Types.VOID,
- [new Commands.FormalParameter(Types.ALL, 'p1', false)],
- block);
- return func;
- }
- export function createInputFun () {
- const readFunction = function (store, _) {
- const request = new Promise((resolve, _) => {
- this.input.requestInput(resolve);
- });
- return request.then(text => {
- const typeToConvert = store.applyStore('p1').type;
- let type = null
- let result = null;
- try {
- if (typeToConvert.isCompatible(Types.INTEGER)) {
- result = toInt(text).trunc();
- type = Types.INTEGER;
- } else if (typeToConvert.isCompatible(Types.REAL)) {
- result = toReal(text)
- type = Types.REAL;
- } else if (typeToConvert.isCompatible(Types.BOOLEAN)) {
- result = toBool(text)
- type = Types.BOOLEAN;
- } else if (typeToConvert.isCompatible(Types.STRING)) {
- result = toString(text)
- type = Types.STRING;
- } else {
- return Promise.reject(new Error("!!!!Critical error: Unknown type in readFunction!!!!"));
- }
- } catch (_) {
- if(this.mode == Modes.ABORT) {
- store.mode = Modes.RETURN;
- return Promise.resolve(store);
- }
- const stringInfo = typeToConvert.stringInfo()[0]
- const realObject = store.getStoreObject("p1");
- if (realObject.getReferenceDimension() > 0) {
- const arrayInfo = realObject.type.stringInfo()[0];
- const dim = realObject.getReferenceDimension();
- const error = ProcessorErrorFactory.invalid_read_type_array(text, stringInfo.type, stringInfo.dim, realObject.getRefObj(), arrayInfo.type, dim, this.function_call_stack.pop());
- return Promise.reject(error);
- }
- const error = ProcessorErrorFactory.invalid_read_type(text, stringInfo.type, stringInfo.dim, realObject.getRefObj(), this.function_call_stack.pop());
- return Promise.reject(error);
- }
- const stoValue = new StoreValue(type, result);
- store.updateStore('p1', stoValue);
- store.mode = Modes.RETURN;
- return Promise.resolve(store);
- });
- }
- const block = new Commands.CommandBlock([], [new Commands.SysCall(readFunction)]);
- const func = new Commands.Function('$read', Types.VOID,
- [new Commands.FormalParameter(Types.ALL, 'p1', true)],
- block);
- return func;
- }
|