适用性
如果某种语言可以表示为足够简单的抽象语法树,而且效率不是最重要因素,就可以使用解释器模式。
结构
参与者
• AbstractExpression (抽象表达式,如Expr) —声明抽象的解释操作,这个操作被所有的子类共享。
•NonterminalExpression (非终结符表达式,如AdditiveExpr、MultiplicativeExpr等) — 文法中所有可以分解为下级语法节点组合的语法节点都需要一个NonterminalExpression类来实现其功能。 —NonterminalExpression为下级语法节点维护一个AbstractExpression类型的列表。 — 实现解释 (Interpret) 操作。解释 (Interpret) 除了要递归调用表示下级语法节点的解释操作之外,也可以对各个节点的解释结果进行进一步计算。例如AdditiveExpr需要对每个MultiplicativeExpr的解释结果进行广义(加或减)的加法计算。
• TerminalExpression (终结符表达式,如IntegerLiteral等)
— 直接实现文法中的简单操作或计算。 • Context(上下文) — 包含解释器之外的一些全局信息。 • Client(客户)
— 构建语法树。
— 调用解释操作。
协作
• Client构建一个抽象语法树. 然后初始化上下文并调用解释操作。构建语法树也可以作为语法节点类的功能来实现。毕竟最熟悉语法节点的就是语法节点类自己。
• 每一非终结符表达式节点调用相应子表达式的解释操作并合成处理结果。而各终结符表达式负责进行不依赖其他节点的简单处理或计算。 • 每一节点的解释操作可以通过上下文来存储和访问解释器的状态。例如取得或储存的计算结果、取得事先定义的常量、调用预先登录的函数等都需要通过上下文来实现。
文中类图来自《设计模式》一书。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】
