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

标签 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
}

在不使用解析器生成器等第三方工具的情况下,我该如何以最有效的方式做到这一点?

最佳答案

我还没有对此进行测试,但这可能会让您大致了解一种执行此操作的方法:

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/

相关文章:

javascript - 使下一列堆叠到其上方的列

java - SAX 解析器。如何停止 SAX 解析器连接到 Internet?

javascript - 如何根据区域设置确定年、月、日顺序?

javascript - 悬停时显示列描述

php - 在 php 中悬空的双分号

c - 在 C 中使用 strtok() 来换行具有多个分隔符的行

c - 解析带有空格的逗号分隔字符串

使用正则表达式的Java字符串拆分/解析问题

javascript - 如何在使用 HTML5 Web Audio API 的音频可视化工具上实现音频控件?

javascript - 使用setTimeout(fn, 0)和不使用的区别