标签:png com ext ant jpg void 抽象语法树 img class
概述:
GOF定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂的业务语言进行翻译。
这种做法虽然效率相对较低,但可以允许用户使用自定义的业务语言来处理逻辑,因此在效率不是关键问题的场合还是较为有用的。
public class Context { //private Dictionary<string, int> dic = new Dictionary<string, int>(); //public void AddValue(string variable, int value) //{ // dic.Add(variable, value); //} //public int GetValue(string variable) //{ // if (dic.ContainsKey(variable)) // { // return dic[variable]; // } // return 0; //} }
因为我后续没有用到,就把这里面的代码注释掉了,这里可以根据需要在增加代码,一般用例储存上下文的环境等。
2.接口Expression
public interface Expression { int Interpreter(Context ctx); }
3.变量表达式 Variable
public class Variable : Expression { public int value { get; set; } public Variable(int value) { this.value = value; } public int Interpreter(Context ctx) { return this.value; } }
4.常量表达式
//常量 public class ConstantExpression : Expression { private int i; public ConstantExpression(int i) { this.i = i; } public int Interpreter(Context ctx) { return i; } }
5.增加表达式
public class AddExprestion : Expression { private Expression left, right; public AddExprestion(Expression left, Expression right) { this.left = left; this.right = right; } public int Interpreter(Context ctx) { return left.Interpreter(ctx) + right.Interpreter(ctx); } }
6.减法表达式
public class SubtractExprestion : Expression { private Expression left, right; public SubtractExprestion(Expression left, Expression right) { this.left = left; this.right = right; } public int Interpreter(Context ctx) { return left.Interpreter(ctx) - right.Interpreter(ctx); } }
7. 测试运行
static void Main(string[] args) { Context ctx = new Context(); Variable a = new Variable(1); Variable b = new Variable(2); Expression addExp = new SubtractExprestion(new ConstantExpression(10), new AddExprestion(b, a)); int result = addExp.Interpreter(ctx); Console.WriteLine("result=(10-(1+2))=" + result); }
8. 运行结果
标签:png com ext ant jpg void 抽象语法树 img class
原文地址:http://www.cnblogs.com/clc2008/p/6771856.html