我正在用 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
}
在不使用解析器生成器等第三方工具的情况下,我该如何以最有效的方式做到这一点?
最佳答案
我还没有对此进行测试,但这可能会让您大致了解一种执行此操作的方法:
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
,但你可以自己写。请注意,如果每个左大括号没有匹配的右大括号,则上述函数将中断。不过,您可以将其放入另一个预先验证或修复字符串的函数中。
关于javascript - 将字符串解析为操作数和运算符的嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21734710/