解释器模式(Interpreter)

定义

解释器模式(Interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

类图

描述

Expression:抽象表达式,声明一个所有的具体表达式都需要实现的抽象接口;这个接口主要是一个interpret()方法,称做解释操作。

Terminal Expression:终结符表达式,实现了抽象表达式所要求的接口;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如公式R=R1+R2,R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

Nonterminal Expression:非终结符表达式,文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。

Context:环境,它的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,给R1赋值100,给R2赋值200,这些信息需要存放到环境中。

应用场景

首先输入一个加减或乘除的运算公式,比如a+b-c+a或a*b/c*a,再给每个参数赋值,最后根据公式完成运算并得到结果。

    /// <summary>
/// 环境
/// </summary>
public class Context
{
private Dictionary<char, double> variable;
public Dictionary<char, double> Variable
{
get
{
if (this.variable == null)
{
this.variable = new Dictionary<char, double>();
}
return this.variable;
}
}
} /// <summary>
/// 抽象表达式
/// </summary>
public abstract class Expression
{
public abstract double Interpret(Context context);
} /// <summary>
/// 变量,终结符表达式
/// </summary>
public class VariableExpression : Expression
{
private char key;
public VariableExpression(char key)
{
this.key = key;
} public override double Interpret(Context context)
{
return context.Variable[this.key];
}
} /// <summary>
/// 操作符,非终结符表达式
/// </summary>
public abstract class OperatorExpression : Expression
{
protected Expression left;
protected Expression right; public OperatorExpression(Expression left, Expression right)
{
this.left = left;
this.right = right;
}
} public class AddExpression : OperatorExpression
{
public AddExpression(Expression left, Expression right)
: base(left, right)
{ } public override double Interpret(Context context)
{
return this.left.Interpret(context) + this.right.Interpret(context);
}
} public class SubExpression : OperatorExpression
{
public SubExpression(Expression left, Expression right)
: base(left, right)
{ } public override double Interpret(Context context)
{
return this.left.Interpret(context) - this.right.Interpret(context);
}
} public class MulExpression: OperatorExpression
{
public MulExpression(Expression left, Expression right)
: base(left, right)
{ } public override double Interpret(Context context)
{
return this.left.Interpret(context) * this.right.Interpret(context);
}
} public class DivExpression: OperatorExpression
{
public DivExpression(Expression left, Expression right)
: base(left, right)
{ } public override double Interpret(Context context)
{
return this.left.Interpret(context) / this.right.Interpret(context);
}
} public class Calculator
{
private string expression;
private Context context; public Calculator(string expression)
{
this.expression = expression;
this.context = new Context();
} public double Calculate()
{
char[] vars = this.expression.ToCharArray();
foreach (char c in vars)
{
if (c == '+' || c == '-' || c == '*' || c == '/')
{
continue;
}
if (!this.context.Variable.ContainsKey(c))
{
Console.Write(c + "=");
this.context.Variable.Add(c, double.Parse(Console.ReadLine()));
}
}
Expression left = new VariableExpression(vars[]);
Expression right = null;
Stack<Expression> stack = new Stack<Expression>();
stack.Push(left);
for (int i = ; i < vars.Length; i += )
{
left = stack.Pop();
right = new VariableExpression(vars[i + ]);
switch (vars[i])
{
case '+':
stack.Push(new AddExpression(left, right));
break;
case '-':
stack.Push(new SubExpression(left, right));
break;
case '*':
stack.Push(new MulExpression(left, right));
break;
case '/':
stack.Push(new DivExpression(left, right));
break;
}
}
double value = stack.Pop().Interpret(this.context);
stack.Clear();
return value;
}
}

输入公式:a+b-c+a

赋值:

a=10
b=5
c=3

运算结果:22

设计模式之笔记--解释器模式(Interpreter)的更多相关文章

  1. 设计模式 笔记 解释器模式 Interpreter

    //---------------------------15/04/26---------------------------- //Interpreter 解释器模式----类行为型模式 /* 1 ...

  2. 《JAVA设计模式》之解释器模式(Interpreter)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述解释器(Interpreter)模式的: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个 ...

  3. 学习笔记——解释器模式Interpreter

    解释器模式,其实就是编译原理中的语法解释器,如果用在项目中,可以用于实现动态脚本的解析,也就是说项目可以支持用户脚本扩展. 但实际上,这种运行时解释,效率很慢,如果不是很需要的话,不建议使用. 一种简 ...

  4. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

  5. 解释器模式 Interpreter 行为型 设计模式(十九)

      解释器模式(Interpreter)   考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做?    你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...

  6. C#设计模式:解释器模式(Interpreter Pattern)

    一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...

  7. 二十四种设计模式:解释器模式(Interpreter Pattern)

    解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的 ...

  8. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  9. Java设计模式之九 ----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

随机推荐

  1. 【bzoj3203】[Sdoi2013]保护出题人 凸包+二分

    题目描述 输入 第一行两个空格隔开的正整数n和d,分别表示关数和相邻僵尸间的距离.接下来n行每行两个空格隔开的正整数,第i + 1行为Ai和 Xi,分别表示相比上一关在僵尸队列排头增加血量为Ai 点的 ...

  2. Astronauts UVALive - 3713(2-SAT)

    大白书例题 #include <iostream> #include <cstdio> #include <sstream> #include <cstrin ...

  3. 【CodeChef PREFIXOR】Prefix XOR

    https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692 网上搜到的题解: http://blog.csdn. ...

  4. Linux系统启动详解(二)

    上节讲到了Linux启动大体流程,及grub的作用,本节主要扯扯initramfs的那些事,并且通过简单修改initramfs,将整体操作系统运行到了内存中. 3       initramfs 3. ...

  5. Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)

    这破题调了我一天...错了一大堆细节T T 首先显然可以将边权先排序,然后逐个加进图中. 加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑. 倍增的时候要预处理出h[i]表示转移矩阵的2^0~ ...

  6. IT(然而其实是。。hdu5244?)

    Time Limit: 3000 ms Memory Limit: 256 MB Description IT = Inverse Transform 两个长度为 \(2^n\) 的序列 \(a,b\ ...

  7. python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)

    一.isinstance(obj,cls)和issubclass(sub,super)                                isinstance(obj,cls)检查是否ob ...

  8. 形态学及其他集合运算(Morphological and Other Set Operations)

    摘    要:本实验主要实现形态学图像处理.主要验证图像集合的交并补运算.膨胀和腐蚀处理并利用图像集合的运算,实现形态学边界抽取算法并进行特征边界抽取.同时将膨胀和腐蚀扩展至灰度图像,编写函数实现灰度 ...

  9. 关于OpenCV的stitching使用

    配置环境:VS2010+OpenCV2.4.9 为了使用OpenCV实现图像拼接头痛了好长时间,一直都没时间做,今天下定决心去实现基本的图像拼接. 首先,看一看使用OpenCV进行拼接的方法 基本都是 ...

  10. Codeforces 543.B Destroying Roads

    B. Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard ...