0Pricing
JavaScript Academy · 课时

E1——表达式求值器(第 1 部分:+ 和 -,从左到右)

实现一个按从左到右顺序处理 + 和 - 的小型求值器。标记化处理数字和运算符,忽略空格,并添加简单的守卫

E1——表达式求值器(第 1 部分:+ 和 -,从左到右) 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 3 节课。

我们要构建的内容

目标:只使用+和-计算简短的数学字符串。

  • 将数字和运算符标记化
  • 忽略空格
  • 从左到右计算
  • 添加简单的错误防护
E1——表达式求值器(第 1 部分:+ 和 -,从左到右) — 插图 1

词法分析器:数字和运算符

词法分析器从数字中构建数字,并返回类似 [12, "+", 3, "-", 4] 的数组。

// Tokenize: split into numbers and operators; ignore spaces
function tokenize(expr) {
  if (typeof expr !== "string") return null;

  const tokens = [];
  let num = "";

  for (let i = 0; i < expr.length; i = i + 1) {
    const ch = expr[i];

    if (ch === " ") {
      // skip spaces
      continue;
    }

    if (ch >= "0" && ch <= "9") {
      // build number
      num = num + ch;
    } else if (ch === "+" || ch === "-") {
      // flush pending number
      if (num.length > 0) {
        tokens.push(Number(num));
        num = "";
      }
      tokens.push(ch);
    } else {
      // unsupported character
      return null;
    }
  }

  if (num.length > 0) tokens.push(Number(num));
  return tokens;
}

console.log("tokens:", tokenize("12 + 3 - 4"));
E1——表达式求值器(第 1 部分:+ 和 -,从左到右) — 插图 2

从左到右求值

请从左到右计算。目前还不处理运算优先级或括号。

// Evaluate tokens left-to-right for + and - only
function evalPlusMinus(tokens) {
  if (!Array.isArray(tokens) || tokens.length === 0) return null;

  // result starts with first number
  let acc = tokens[0];
  if (typeof acc !== "number") return null;

  // step through [op, num] pairs
  for (let i = 1; i < tokens.length; i = i + 2) {
    const op = tokens[i];
    const val = tokens[i + 1];

    if ((op !== "+" && op !== "-") || typeof val !== "number") {
      return null;
    }

    if (op === "+") acc = acc + val;
    else acc = acc - val;
  }

  return acc;
}

console.log("eval 10-3-2:", evalPlusMinus([10, "-", 3, "-", 2]));
E1——表达式求值器(第 1 部分:+ 和 -,从左到右) — 插图 3

安全包装器

创建一个安全包装器,为初学者返回一个值或简短的错误字符串。

// Glue the pieces: from string to result
function evalExprSimple(expr) {
  const tokens = tokenize(expr);
  if (tokens === null) {
    return { ok: false, error: "Invalid character" };
  }
  const result = evalPlusMinus(tokens);
  if (typeof result !== "number") {
    return { ok: false, error: "Invalid sequence" };
  }
  return { ok: true, value: result };
}

console.log("12 + 3 - 4 =", evalExprSimple("12 + 3 - 4"));
console.log("bad char   =", evalExprSimple("2 + a"));
E1——表达式求值器(第 1 部分:+ 和 -,从左到右) — 插图 4

运行小型示例

让示例保持简短。我们会在后续部分添加运算优先级、括号和一元减号。

// A few quick checks
const cases = [
  "0-3",
  "7+5",
  "10-3-2",
  "2 + 2 + 2",
  "9 - 1 + 1"
];

for (const c of cases) {
  const r = evalExprSimple(c);
  console.log(c, "=>", r.ok ? r.value : r.error);
}

// Note: unary minus (like "-3+2") not handled yet
// This simple version expects a number first
E1——表达式求值器(第 1 部分:+ 和 -,从左到右) — 插图 5

初学者指南

提示:

  • 从小范围开始(只支持 + 和 -)。
  • 返回简短错误,不要抛出异常。
  • 编写小型辅助函数(tokenize、eval)。
  • 逐步添加功能。
E1——表达式求值器(第 1 部分:+ 和 -,从左到右) — 插图 6

从左到右行为测验

快速检查:从左到右的结果。

E1——表达式求值器(第 1 部分:+ 和 -,从左到右) — 插图 7

总结

总结:将数字和 +/- 标记化,忽略空格,并从左到右求值。返回简短错误。下一步:运算优先级和括号。

E1——表达式求值器(第 1 部分:+ 和 -,从左到右) — 插图 8

常见问题解答

「E1——表达式求值器(第 1 部分:+ 和 -,从左到右)」课时是免费的吗?

是的 — 「E1——表达式求值器(第 1 部分:+ 和 -,从左到右)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 3 节课。

「E1——表达式求值器(第 1 部分:+ 和 -,从左到右)」这节课中我会学到什么?

实现一个按从左到右顺序处理 + 和 - 的小型求值器。标记化处理数字和运算符,忽略空格,并添加简单的守卫 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 JavaScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「E1——表达式求值器(第 1 部分:+ 和 -,从左到右)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 JavaScript Academy 课中编写并运行代码吗?

能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. E1——表达式求值器(第 1 部分:+ 和 -,从左到右)
  2. E2——日志分析器(简单筛选与计数器)
  3. E3——Promise 池/队列(异步并发)
← 返回 JavaScript Academy