设计模式之解释器模式
时间:2022-07-22
本文章向大家介绍设计模式之解释器模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
设计模式之解释器模式
结构
说明
Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
适用条件
当有一个语言需要解释执行, 并且可以将语言中的句子表示为一个抽象的表达式树时, 可以使用解释器模式。
实现
以逆波兰表示法为例, 其语法为:
expression ::= plus | minus | variable | number
plus ::= expression expression '+'
minus ::= expression expression '-'
variable ::= 'a' | 'b' | 'c' | ... | 'z'
digit = '0' | '1' | ... '9'
number ::= digit | digit number
波兰表示法的例子:
a b +
a b c + -
a b + c a - -
以下是逆波兰表示法的解释器实现 :
public interface IExpression {
int Interpret(Dictionary<string, IExpression> variables);
}
public class Number : IExpression {
private readonly int _number;
public Number(int number) {
this._number = number;
}
public int Interpret(Dictionary<string, IExpression> variables) {
return this._number;
}
}
public class Variable : IExpression {
private readonly string _name;
public Variable(string name) {
this._name = name;
}
public int Interpret(Dictionary<string, IExpression> variables) {
if (string.IsNullOrEmpty(this._name)) {
return 0;
}
return variables[this._name].Interpret(variables);
}
}
public class Plus : IExpression {
private readonly IExpression _leftOperand;
private readonly IExpression _rightOperand;
public Plus(IExpression leftOperand, IExpression rightOperand) {
this._leftOperand = leftOperand;
this._rightOperand = rightOperand;
}
public int Interpret(Dictionary<string, IExpression> variables) {
return this._leftOperand.Interpret(variables) + this._rightOperand.Interpret(variables);
}
}
public class Minus : IExpression {
private readonly IExpression _leftOperand;
private readonly IExpression _rightOperand;
public Minus(IExpression leftOperand, IExpression rightOperand) {
this._leftOperand = leftOperand;
this._rightOperand = rightOperand;
}
public int Interpret(Dictionary<string, IExpression> variables) {
return this._leftOperand.Interpret(variables) - this._rightOperand.Interpret(variables);
}
}
public class Evaluator : IExpression {
private readonly IExpression _expressionTree;
public Evaluator(string expression) {
var stack = new Stack<IExpression>();
foreach (var token in expression.Split(' ')) {
if (token == "+") {
stack.Push(new Plus(stack.Pop(), stack.Pop()));
}
else if (token == "-") {
var right = stack.Pop();
var left = stack.Pop();
stack.Push(new Minus(left, right));
}
else {
stack.Push(new Variable(token));
}
}
this._expressionTree = stack.Pop();
}
public int Interpret(Dictionary<string, IExpression> variables) {
return this._expressionTree.Interpret(variables);
}
}
class Client {
static void Main(string[] args) {
const string expression = "w x z - +";
var evaluator = new Evaluator(expression);
var sentence = new Dictionary<string, IExpression>();
sentence["w"] = new Number(5);
sentence["x"] = new Number(10);
sentence["z"] = new Number(42);
var result = evaluator.Interpret(sentence);
Console.WriteLine(result);
Console.ReadKey();
}
}
- Android新手之旅(7) RadioButton的自定义
- Flash/Flex学习笔记(4):如何打开网页及Get/Post数据
- Flash/Flex学习笔记(5):捕获摄像头(续)--在线抓屏并保存到客户端本地
- 分布式监控系统Zabbix--使用Grafana进行图形展示
- Silverlight在线创建PDF(支持中文)
- Flash/Flex学习笔记(3):动态添加组件
- Flash/Flex学习笔记(1):Hello World!
- 数据库常规操作
- 不伦不类的Action Script 3.0
- Asp.Net Mvc中的一些初级问题整理
- Pandas Series笔记
- Asp.Net4.0/VS2010新变化(6):内置的图表控件
- Asp.Net4.0/VS2010新变化(5):可扩展的(分布式)缓存
- Pandas对行情数据的预处理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 大白话java多线程,高手勿入
- R语言小数定律的保险业应用:泊松分布模拟索赔次数
- R语言中自编基尼系数的CART回归决策树的实现
- ArrayList的删除姿势你都掌握了吗
- sas神经网络:构建人工神经网络模型来识别垃圾邮件
- R语言多分类logistic逻辑回归模型在混合分布模拟单个风险损失值评估的应用
- 10分钟带你入门git到github
- 微服务[学成在线] day18:基于oauth2实现RBAC认证授权、微服务间认证实现
- 【TBase开源版测评】分布式事务全局一致性
- R语言进阶之主成分分析
- 二胖写参数校验的坎坷之路
- 图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
- R语言时间序列数据指数平滑法分析交互式动态可视化
- R语言进阶之图形的合并
- R语言广义线性模型索赔频率预测:过度分散、风险暴露数和树状图可视化