知识卡片

用栈解析公式字符串并组装表达式树

普通读书笔记卡 · 1994.a.1

内容

[[解释器模式的定义与四个角色]]的Calculator展示公式字符串(如a+b-c)解析成表达式 树:逐字符扫描,遇变量包装成VarExpression压栈;遇运算符则弹出左表达式与新变量组合成 AddExpression/SubExpression再压栈;扫描结束栈顶即完整表达式树,调用interpreter传入 变量映射即递归求值。发散:这种用栈组装表达式树的手法是”移进-归约”思想的简化缩影。

参考来源

- 位置:《设计模式之禅(第2版)》第27章《解释器模式》(源文件:_epub-src/text/part0122.html) - 结论依据:原文给出Calculator类的完整实现,用Stack<Expression>逐字符扫描公式、遇到运算符时弹出左表达式与新建的右侧VarExpression组合成AddExpression/SubExpression再压栈,并解释"根据for循环,首先被压入栈中的应该是有a元素生成的VarExpression对象,然后判断到加号时,把a元素的对象VarExpression从栈中弹出,与右边的数组b进行相加"。 - 原始内容:定义一个栈,安排运算的先后顺序……case '+':加法结果放到栈中,left = stack.pop(); right=new VarExpression(...); stack.push(new AddExpression(left,right))……把运算结果抛出来 this.expression = stack.pop()。