E1——表达式求值器(第 1 部分:+ 和 -,从左到右)
实现一个按从左到右顺序处理 + 和 - 的小型求值器。标记化处理数字和运算符,忽略空格,并添加简单的守卫
E1——表达式求值器(第 1 部分:+ 和 -,从左到右) 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 3 节课。
我们要构建的内容
目标:只使用+和-计算简短的数学字符串。
- 将数字和运算符标记化
- 忽略空格
- 从左到右计算
- 添加简单的错误防护

词法分析器:数字和运算符
词法分析器从数字中构建数字,并返回类似 [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"));
从左到右求值
请从左到右计算。目前还不处理运算优先级或括号。
// 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]));
安全包装器
创建一个安全包装器,为初学者返回一个值或简短的错误字符串。
// 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"));

运行小型示例
让示例保持简短。我们会在后续部分添加运算优先级、括号和一元减号。
// 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

初学者指南
提示:
- 从小范围开始(只支持 + 和 -)。
- 返回简短错误,不要抛出异常。
- 编写小型辅助函数(tokenize、eval)。
- 逐步添加功能。

从左到右行为测验
快速检查:从左到右的结果。

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

常见问题解答
「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 反馈 — 无需本地设置。
此课程中的所有课时
- E1——表达式求值器(第 1 部分:+ 和 -,从左到右)
- E2——日志分析器(简单筛选与计数器)
- E3——Promise 池/队列(异步并发)