mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 19:51:51 +09:00
if statement parsing
This commit is contained in:
@@ -302,3 +302,98 @@ if (!Array.prototype.map) {
|
||||
return A;
|
||||
};
|
||||
}
|
||||
// Production steps of ECMA-262, Edition 5, 15.4.4.21
|
||||
// Reference: http://es5.github.io/#x15.4.4.21
|
||||
// https://tc39.github.io/ecma262/#sec-array.prototype.reduce
|
||||
if (!Array.prototype.reduce) {
|
||||
Object.defineProperty(Array.prototype, 'reduce', {
|
||||
value: function(callback /*, initialValue*/) {
|
||||
if (this === null) {
|
||||
throw new TypeError( 'Array.prototype.reduce ' +
|
||||
'called on null or undefined' );
|
||||
}
|
||||
if (typeof callback !== 'function') {
|
||||
throw new TypeError( callback +
|
||||
' is not a function');
|
||||
}
|
||||
|
||||
// 1. Let O be ? ToObject(this value).
|
||||
var o = Object(this);
|
||||
|
||||
// 2. Let len be ? ToLength(? Get(O, "length")).
|
||||
var len = o.length >>> 0;
|
||||
|
||||
// Steps 3, 4, 5, 6, 7
|
||||
var k = 0;
|
||||
var value;
|
||||
|
||||
if (arguments.length >= 2) {
|
||||
value = arguments[1];
|
||||
} else {
|
||||
while (k < len && !(k in o)) {
|
||||
k++;
|
||||
}
|
||||
|
||||
// 3. If len is 0 and initialValue is not present,
|
||||
// throw a TypeError exception.
|
||||
if (k >= len) {
|
||||
throw new TypeError( 'Reduce of empty array ' +
|
||||
'with no initial value' );
|
||||
}
|
||||
value = o[k++];
|
||||
}
|
||||
|
||||
// 8. Repeat, while k < len
|
||||
while (k < len) {
|
||||
// a. Let Pk be ! ToString(k).
|
||||
// b. Let kPresent be ? HasProperty(O, Pk).
|
||||
// c. If kPresent is true, then
|
||||
// i. Let kValue be ? Get(O, Pk).
|
||||
// ii. Let accumulator be ? Call(
|
||||
// callbackfn, undefined,
|
||||
// « accumulator, kValue, k, O »).
|
||||
if (k in o) {
|
||||
value = callback(value, o[k], k, o);
|
||||
}
|
||||
|
||||
// d. Increase k by 1.
|
||||
k++;
|
||||
}
|
||||
|
||||
// 9. Return accumulator.
|
||||
return value;
|
||||
}
|
||||
});
|
||||
}
|
||||
// Production steps of ECMA-262, Edition 5, 15.4.4.22
|
||||
// Reference: http://es5.github.io/#x15.4.4.22
|
||||
if ('function' !== typeof Array.prototype.reduceRight) {
|
||||
Array.prototype.reduceRight = function(callback /*, initialValue*/) {
|
||||
'use strict';
|
||||
if (null === this || 'undefined' === typeof this) {
|
||||
throw new TypeError('Array.prototype.reduce called on null or undefined');
|
||||
}
|
||||
if ('function' !== typeof callback) {
|
||||
throw new TypeError(callback + ' is not a function');
|
||||
}
|
||||
var t = Object(this), len = t.length >>> 0, k = len - 1, value;
|
||||
if (arguments.length >= 2) {
|
||||
value = arguments[1];
|
||||
} else {
|
||||
while (k >= 0 && !(k in t)) {
|
||||
k--;
|
||||
}
|
||||
if (k < 0) {
|
||||
throw new TypeError('Reduce of empty array with no initial value');
|
||||
}
|
||||
value = t[k--];
|
||||
}
|
||||
for (; k >= 0; k--) {
|
||||
if (k in t) {
|
||||
value = callback(value, t[k], k, t);
|
||||
}
|
||||
}
|
||||
return value;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -649,6 +649,64 @@ for input "DEFUN sinc(x) = sin(x) / x"
|
||||
treeHead.value = ("quote" == states[0]) ? tokens[0] : tokens[0].toUpperCase();
|
||||
treeHead.type = "literal";
|
||||
}
|
||||
else if (tokens[0].toUpperCase() == "IF" && states[0] != "quote") {
|
||||
// find ELSE and THEN
|
||||
var indexElse = undefined;
|
||||
var indexThen = undefined;
|
||||
for (k = tokens.length - 1; k >= 1; k--) {
|
||||
if (indexElse === undefined && tokens[k].toUpperCase() == "ELSE" && states[k] != "quote") {
|
||||
indexElse = k;
|
||||
}
|
||||
else if (indexThen === undefined && tokens[k].toUpperCase() == "THEN" && states[k] != "quote") {
|
||||
indexThen = k;
|
||||
}
|
||||
}
|
||||
// find GOTO and use it as THEN
|
||||
var useGoto = false;
|
||||
if (indexThen === undefined) {
|
||||
for (k = (indexElse !== undefined) ? indexElse - 1 : tokens.length - 1; k >= 1; k--) {
|
||||
if (indexThen == undefined && tokens[k].toUpperCase() == "GOTO" && states[k] != "quote") {
|
||||
useGoto = true;
|
||||
indexThen = k;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// generate tree
|
||||
if (indexThen === undefined) throw lang.syntaxfehler(lnum);
|
||||
|
||||
treeHead.value = "if";
|
||||
treeHead.type = "function";
|
||||
treeHead.leaves[0] = basicFunctions._parseTokens(
|
||||
lnum,
|
||||
tokens.slice(1, indexThen),
|
||||
states.slice(1, indexThen),
|
||||
recDepth + 1
|
||||
);
|
||||
if (!useGoto)
|
||||
treeHead.leaves[1] = basicFunctions._parseTokens(
|
||||
lnum,
|
||||
tokens.slice(indexThen + 1, (indexElse !== undefined) ? indexElse : tokens.length),
|
||||
states.slice(indexThen + 1, (indexElse !== undefined) ? indexElse : tokens.length),
|
||||
recDepth + 1
|
||||
);
|
||||
else
|
||||
treeHead.leaves[1] = basicFunctions._parseTokens(
|
||||
lnum,
|
||||
[].concat("goto", tokens.slice(indexThen + 1, (indexElse !== undefined) ? indexElse : tokens.length)),
|
||||
[].concat("literal", states.slice(indexThen + 1, (indexElse !== undefined) ? indexElse : tokens.length)),
|
||||
recDepth + 1
|
||||
);
|
||||
if (indexElse !== undefined) {
|
||||
treeHead.leaves[2] = basicFunctions._parseTokens(
|
||||
lnum,
|
||||
tokens.slice(indexElse + 1, tokens.length),
|
||||
states.slice(indexElse + 1, tokens.length),
|
||||
recDepth + 1
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// scan for operators with highest precedence, use rightmost one if multiple were found
|
||||
var topmostOp;
|
||||
|
||||
Reference in New Issue
Block a user