|
@@ -1,4 +1,5 @@
|
|
|
import { IVProgParser } from "../ast/ivprogParser";
|
|
|
+
|
|
|
import * as Expressions from "../ast/expressions";
|
|
|
import { Types } from "../typeSystem/types";
|
|
|
import { convertBoolToString } from "../typeSystem/parsers";
|
|
@@ -51,6 +52,82 @@ function getOpType (op) {
|
|
|
return TYPES.LOGIC;
|
|
|
}
|
|
|
}
|
|
|
+/**
|
|
|
+ * @param {Commands.Assign} assingment
|
|
|
+ * */
|
|
|
+function assignmentWalker (assingment) {
|
|
|
+ let variable = null
|
|
|
+ if (assingment instanceof Commands.ArrayIndexAssign) {
|
|
|
+ const line = expressionWalker(assingment.line);
|
|
|
+ let arrayClass = "vector";
|
|
|
+ let column = null;
|
|
|
+ if (assingment.column) {
|
|
|
+ arrayClass = "matrix";
|
|
|
+ column = expressionWalker(assingment.column);
|
|
|
+ }
|
|
|
+ variable = [
|
|
|
+ {
|
|
|
+ instance: "expression",
|
|
|
+ type: TYPES.VARIABLE,
|
|
|
+ class: arrayClass,
|
|
|
+ column: column,
|
|
|
+ line: line,
|
|
|
+ value: assingment.id,
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ } else {
|
|
|
+ variable = [
|
|
|
+ { instance: "expression", type: TYPES.VARIABLE, value: assingment.id },
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ const expression = expressionWalker(assingment.expression)
|
|
|
+ return {
|
|
|
+ type: "attribution",
|
|
|
+ variable,
|
|
|
+ expression
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @param {Command} command
|
|
|
+ * */
|
|
|
+function commandWalker (command) {
|
|
|
+ if (command instanceof Commands.FunctionCall) {
|
|
|
+ return functionCallWalker(command)
|
|
|
+ } else if (command instanceof Commands.Assign) {
|
|
|
+ return assignmentWalker(command)
|
|
|
+ }
|
|
|
+ throw new Error("not implemented")
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @param {Commands.FunctionCall} functionCall
|
|
|
+ * */
|
|
|
+function functionCallWalker (functionCall) {
|
|
|
+ let name = functionCall.id;
|
|
|
+ if (name.indexOf(".") !== -1) {
|
|
|
+ name = name.split(".")[1]
|
|
|
+ }
|
|
|
+ if (name === "$read") {
|
|
|
+ const variable = functionCall.actualParameters.map(expressionWalker)[0]
|
|
|
+ return {
|
|
|
+ type:"reader",
|
|
|
+ variable
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (name === "$write") {
|
|
|
+ const content = functionCall.actualParameters.map(expressionWalker)
|
|
|
+ const lastInput = content[content.length - 1][0];
|
|
|
+ // if lastInput is an object with value === '\n', newLine is true
|
|
|
+ const newLine = lastInput.value && lastInput.value.match(/\n/) !== null
|
|
|
+ return {
|
|
|
+ type:"writer",
|
|
|
+ newLine,
|
|
|
+ content
|
|
|
+ }
|
|
|
+ }
|
|
|
+ throw new Error("not implemented")
|
|
|
+}
|
|
|
/**
|
|
|
* @param {Commands.Function} func
|
|
|
* */
|
|
@@ -75,6 +152,7 @@ function functionWalker (func) {
|
|
|
funcDeclaration.variables_list = func.variablesDeclarations.map(
|
|
|
variableDeclarationWalker
|
|
|
);
|
|
|
+ funcDeclaration.commands = func.commands.map(commandWalker)
|
|
|
return funcDeclaration;
|
|
|
}
|
|
|
|