|
@@ -90,6 +90,66 @@ const FlowControl = {
|
|
|
},
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * Register operation.
|
|
|
+ *
|
|
|
+ * @param {Object} state - The current state of the recipe.
|
|
|
+ * @param {number} state.progress - The current position in the recipe.
|
|
|
+ * @param {Dish} state.dish - The Dish being operated on.
|
|
|
+ * @param {Operation[]} state.opList - The list of operations in the recipe.
|
|
|
+ * @returns {Object} The updated state of the recipe.
|
|
|
+ */
|
|
|
+ runRegister: function(state) {
|
|
|
+ const ings = state.opList[state.progress].getIngValues(),
|
|
|
+ extractorStr = ings[0],
|
|
|
+ i = ings[1],
|
|
|
+ m = ings[2];
|
|
|
+
|
|
|
+ let modifiers = "";
|
|
|
+ if (i) modifiers += "i";
|
|
|
+ if (m) modifiers += "m";
|
|
|
+
|
|
|
+ const extractor = new RegExp(extractorStr, modifiers),
|
|
|
+ input = state.dish.get(Dish.STRING),
|
|
|
+ registers = input.match(extractor);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Replaces references to registers (e.g. $R0) with the contents of those registers.
|
|
|
+ *
|
|
|
+ * @param {string} str
|
|
|
+ * @returns {string}
|
|
|
+ */
|
|
|
+ function replaceRegister(str) {
|
|
|
+ // Replace references to registers ($Rn) with contents of registers
|
|
|
+ str = str.replace(/((?:^|[^\\])(?:\\.|[^\\])*?)\$R(\d{1,2})/g, (match, pre, regNum) => {
|
|
|
+ const index = parseInt(regNum, 10) + 1;
|
|
|
+ return (index >= registers.length) ? match : pre + registers[index];
|
|
|
+ });
|
|
|
+
|
|
|
+ // Unescape remaining register references
|
|
|
+ return str.replace(/\\\$R(\d{1,2})/, "$R$1");
|
|
|
+ }
|
|
|
+
|
|
|
+ // Step through all subsequent ops and replace registers in args with extracted content
|
|
|
+ for (let i = state.progress + 1; i < state.opList.length; i++) {
|
|
|
+ let args = state.opList[i].getIngValues();
|
|
|
+ args = args.map(arg => {
|
|
|
+ if (typeof arg !== "string" && typeof arg !== "object") return arg;
|
|
|
+
|
|
|
+ if (typeof arg === "object" && arg.string) {
|
|
|
+ arg.string = replaceRegister(arg.string);
|
|
|
+ return arg;
|
|
|
+ }
|
|
|
+
|
|
|
+ return replaceRegister(arg);
|
|
|
+ });
|
|
|
+ state.opList[i].setIngValues(args);
|
|
|
+ }
|
|
|
+
|
|
|
+ return state;
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* Jump operation.
|
|
|
*
|