123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import * as Commands from "./../../ast/commands";
- import { Modes } from "../modes";
- import * as Parsers 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 = async function (store, _) {
- const totalSV = store.applyStore("p1.0");
- const total = totalSV.get();
- for (let i = 1; i < total; i += 1) {
- const val = store.applyStore(`p1.${i}`);
- this.output.sendOutput(Parsers.convertToString(val.get(), val.type));
- }
- store.mode = Modes.RETURN;
- return 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, true)],
- block
- );
- return func;
- }
- export function createInputFun () {
- const readFunction = async function (store, _) {
- const text = await this.input.requestInput();
- const typeToConvert = store.applyStore("p1").type;
- let type = null;
- let result = null;
- try {
- if (typeToConvert.isCompatible(Types.INTEGER)) {
- result = Parsers.toInt(text.trim()).trunc();
- type = Types.INTEGER;
- } else if (typeToConvert.isCompatible(Types.REAL)) {
- result = Parsers.toReal(text.trim());
- type = Types.REAL;
- } else if (typeToConvert.isCompatible(Types.BOOLEAN)) {
- result = Parsers.toBool(text.trim());
- type = Types.BOOLEAN;
- } else if (typeToConvert.isCompatible(Types.STRING)) {
- result = Parsers.toString(text);
- type = Types.STRING;
- } else if (typeToConvert.isCompatible(Types.CHAR)) {
- result = Parsers.toChar(text);
- type = Types.CHAR;
- } else {
- throw new Error("!!!!Critical error: Unknown type in readFunction!!!!");
- }
- } catch (_) {
- if (this.mode == Modes.ABORT) {
- store.mode = Modes.RETURN;
- return 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();
- throw ProcessorErrorFactory.invalid_read_type_array(
- text,
- stringInfo.type,
- stringInfo.dim,
- realObject.getRefObj(),
- arrayInfo.type,
- dim,
- this.function_call_stack.pop()
- );
- }
- throw ProcessorErrorFactory.invalid_read_type(
- text,
- stringInfo.type,
- stringInfo.dim,
- realObject.getRefObj(),
- this.function_call_stack.pop()
- );
- }
- const stoValue = new StoreValue(type, result);
- store.updateStore("p1", stoValue);
- store.mode = Modes.RETURN;
- return 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;
- }
|