mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-06 13:38:30 +09:00
parsing of function call w/o paren
This commit is contained in:
@@ -720,12 +720,48 @@ for input "DEFUN sinc(x) = sin(x) / x"
|
|||||||
var parenEnd = -1;
|
var parenEnd = -1;
|
||||||
var separators = [];
|
var separators = [];
|
||||||
|
|
||||||
|
// initial scan
|
||||||
for (k = 0; k < tokens.length; k++) {
|
for (k = 0; k < tokens.length; k++) {
|
||||||
if (tokens[k] == "(") {
|
if (tokens[k] == "(" && states[k] != "quote") {
|
||||||
parenDepth += 1;
|
parenDepth += 1;
|
||||||
if (parenDepth == 1) parenStart = k;
|
if (parenDepth == 1) parenStart = k;
|
||||||
}
|
}
|
||||||
else if (tokens[k] == ")") {
|
else if (tokens[k] == ")" && states[k] != "quote") {
|
||||||
|
if (parenDepth == 1) parenEnd = k;
|
||||||
|
parenDepth -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parenDepth == 0) {
|
||||||
|
if (states[k] == "operator" && isSemanticLiteral(tokens[k-1], states[k-1]) && basicFunctions._operatorPrecedence[tokens[k].toUpperCase()] > topmostOpPrc) {
|
||||||
|
topmostOp = tokens[k].toUpperCase();
|
||||||
|
topmostOpPrc = basicFunctions._operatorPrecedence[tokens[k]];
|
||||||
|
operatorPos = k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parenDepth != 0) throw lang.syntaxfehler(lnum, lang.unmatchedBrackets);
|
||||||
|
|
||||||
|
// if there is no paren or paren does NOT start index 1
|
||||||
|
// e.g. negative three should NOT require to be written as "-(3)"
|
||||||
|
if ((parenStart > 1 || parenStart == -1) && (operatorPos != 1 && operatorPos != 0)) {
|
||||||
|
// make a paren!
|
||||||
|
tokens = [].concat(tokens[0], "(", tokens.slice(1, tokens.length), ")");
|
||||||
|
states = [].concat(states[0], "paren", states.slice(1, states.length), "paren");
|
||||||
|
|
||||||
|
if (_debugSyntaxAnalysis) println("inserting paren at right place");
|
||||||
|
if (_debugSyntaxAnalysis) println(tokens.join(","));
|
||||||
|
|
||||||
|
return basicFunctions._parseTokens(lnum, tokens, states, recDepth);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the position of parens and separators
|
||||||
|
for (k = 0; k < tokens.length; k++) {
|
||||||
|
if (tokens[k] == "(" && states[k] != "quote") {
|
||||||
|
parenDepth += 1;
|
||||||
|
if (parenDepth == 1) parenStart = k;
|
||||||
|
}
|
||||||
|
else if (tokens[k] == ")" && states[k] != "quote") {
|
||||||
if (parenDepth == 1) parenEnd = k;
|
if (parenDepth == 1) parenEnd = k;
|
||||||
parenDepth -= 1;
|
parenDepth -= 1;
|
||||||
}
|
}
|
||||||
@@ -779,20 +815,32 @@ for input "DEFUN sinc(x) = sin(x) / x"
|
|||||||
|
|
||||||
// if there is no paren or paren does NOT start index 1
|
// if there is no paren or paren does NOT start index 1
|
||||||
// e.g. negative three should NOT require to be written as "-(3)"
|
// e.g. negative three should NOT require to be written as "-(3)"
|
||||||
if (parenStart > 1 || parenStart == -1) {
|
/*if (parenStart > 1 || parenStart == -1) {
|
||||||
// make a paren!
|
// make a paren!
|
||||||
tokens = [].concat(tokens[0], "(", tokens.slice(1, tokens.length), ")");
|
tokens = [].concat(tokens[0], "(", tokens.slice(1, tokens.length), ")");
|
||||||
states = [].concat(states[0], "paren", states.slice(1, states.length), "paren");
|
states = [].concat(states[0], "paren", states.slice(1, states.length), "paren");
|
||||||
parenStart = 1;
|
parenStart = 1;
|
||||||
parenEnd = states.length - 1;
|
parenEnd = states.length - 1;
|
||||||
// increment position of separators by one
|
|
||||||
for (k = 0; k < separators.length; k++) {
|
// get the position of parens and separators AGAIN
|
||||||
separators[k] = separators[k] + 1;
|
for (k = 0; k < tokens.length; k++) {
|
||||||
|
if (tokens[k] == "(") {
|
||||||
|
parenDepth += 1;
|
||||||
|
if (parenDepth == 1) parenStart = k;
|
||||||
|
}
|
||||||
|
else if (tokens[k] == ")") {
|
||||||
|
if (parenDepth == 1) parenEnd = k;
|
||||||
|
parenDepth -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parenDepth == 1 && states[k] == "sep") {
|
||||||
|
separators.push(k);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_debugSyntaxAnalysis) println("inserting paren at right place");
|
if (_debugSyntaxAnalysis) println("inserting paren at right place");
|
||||||
if (_debugSyntaxAnalysis) println(tokens.join(","));
|
if (_debugSyntaxAnalysis) println(tokens.join(","));
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (parenEnd > parenStart) {
|
if (parenEnd > parenStart) {
|
||||||
separators = [parenStart].concat(separators, [parenEnd]);
|
separators = [parenStart].concat(separators, [parenEnd]);
|
||||||
|
|||||||
Reference in New Issue
Block a user