解释器模式 详解

来源:互联网 发布:爰淘宝 编辑:程序博客网 时间:2024/06/05 03:41

解释器模式 详解

定义

给定一种语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子;

行为型模式

角色

  • 上下文环境(Context):一般用来存放文法中各个终结符所对应的具体值;
  • 抽象表达式(Expression):声明一个所有的具体表达式角色都需要实现的抽象接口,这个接口主要是interpret方法,称作解释操作;
  • 终结符表达式(Terminal Expression): 实现了抽象表达式角色所要求的接口,文法中的每一个终结符都有具体终结表达式与之对应;
  • 非终结符表达式(Terminal Expression):文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字;

从网上找到的例图
enter image description here


适用场景

  • 当有一个语言需要解释执行,你可将语言中的句子表示为抽象语法树,可以使用解释器模式;
  • 该层次结构变得庞大而且难以管理,此时语法分析程序生成器这样的工具是最好的选择,它们无需构建抽象语法树即可解释表达式;

例子


实现代码

/** * Created by George on 16/7/12. */// 抽象表达式var Expression = function () {    // 以环境为主,本方法解释给定的任何一个表达式    this.interpret = function (context) {    };};// 具体表达式var Variable = function (value) {    this.value = value;};Variable.prototype = new Expression();Variable.prototype.interpret = function (context) {    return context.lookup(this);};// 具体表达式var Add = function (variable1, variable2) {    this.variable1 = variable1;    this.variable2 = variable2;};Add.prototype = new Expression();Add.prototype.interpret = function (context) {    return this.variable1.interpret(context) + this.variable2.interpret(context);};// 环境类定义出从变量到布尔值的一个映射var Context = function () {    this.map = new Array(2);};Context.prototype.assign = function (variable, value) {    this.map[variable.value] = value;};Context.prototype.lookup = function (variable) {    var value = this.map[variable.value];    if (value !== null)        return value;};//主函数var x = new Variable(0);var y = new Variable(1);var context = new Context(x, y);context.assign(x, "x");context.assign(y, "y");var result = new Add(x, y);console.log(result.interpret(context));

实现结果:
为xy
该程序实现了字符串的+表达式,其实就是”x” + “y” = “xy”


优缺点

  1. 可以将一个需要解释器执行的语言中的句子表示为一个抽象语法树;
  2. 一些重复出现的问题可以用简单的语言来进行表达;
  3. 一个语言的文法较为简单;
  4. 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数;

注意的是
1. 对于复杂文法难以维护;

0 0
原创粉丝点击