我正在用JavaScript编写一个解析器来解决这个问题:
"(1 + 2 - (4 - 3))"
进入这个:
[1, "+", 2, "-", [4, "-", 3]]
我目前的代码是:
function parse(string) {
string = string.split(" ")
string = string.replace(/(/g, [).replace(/)/g, ]) //This part does not work
}
如果不使用第三方工具(如解析器生成器)以最有效的方式,我该如何做到这一点?
答案 0 :(得分:0)
这是你想要做的吗?
string = "(1 + 2 - (4 - 3))";
string = string.split(" ");
var newStr = [];
for (var i = 0;i < string.length; i++)
{
string[i] = string[i].replace(/\(/g,'[').replace(/\)/g,']');
newStr.push(string[i]);
}
alert(newStr);
答案 1 :(得分:0)
我没有对此进行测试,但这可能会让您大致了解一种方法:
function parse(str) {
var tokens = [];
var chars = str.split('');
var currToken, currChar;
chars = sanitize(chars); // remove invalid chars and whitespace
for (var i = 0; i < chars.length; i++) {
currChar = chars[i];
if (currChar === '(') {
currToken = parse(chars.slice(i + 1).join('')); // recurse
tokens.append(currToken);
i += currToken.length + 1; // skip '(' and characters covered by currToken
}
else if (currChar === ')') { // note that this assumes there is always one ')' for every '('
break; // base case, terminates recursion
}
else {
tokens.append(currChar);
}
}
return tokens;
}
我没有写sanitize
,但你可以自己写。请注意,如果每个左大括号没有匹配的闭括号,则上述函数会中断。您可以通过另一个事先验证或修复字符串的函数。