将字符串解析为嵌套的操作数和运算符数组

时间:2014-02-12 17:08:23

标签: javascript parsing

我正在用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
}

如果不使用第三方工具(如解析器生成器)以最有效的方式,我该如何做到这一点?

2 个答案:

答案 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);

fiddle

答案 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,但你可以自己写。请注意,如果每个左大括号没有匹配的闭括号,则上述函数会中断。您可以通过另一个事先验证或修复字符串的函数。