//为了了解解析器这一设计模式,本文根据sunxing007的博客,实现了下c#版本的解释器,原文地址为:http://blog.csdn.net/sunxing007/article/details/5477634
可以实现简单的加减法数值顺序计算
using System;
using System.Collections.Generic;using System.Linq;
using System.Text;
namespace InterpreterPattern
{
public interface Expresssion
{
int interprete(Dictionary<string, int> var);
}
public class VarExpression : Expresssion
{
private string key;
public VarExpression(string key)
{
this.key = key;
}
#region Expresssion 成员
public int interprete(Dictionary<string, int> var)
{
int result;
var.TryGetValue(key, out result);
return result;
}
#endregion
}
public abstract class SymbolExpression : Expresssion
{
protected Expresssion leftExpression;
protected Expresssion rigntExpression;
public SymbolExpression(Expresssion left, Expresssion right)
{
leftExpression = left;
rigntExpression = right;
}
public virtual int interprete(Dictionary<string, int> var)
{
return 0;
}
}
public class AddExpression : SymbolExpression
{
public AddExpression(Expresssion left, Expresssion right)
:base(left,right)
{
}
public override int interprete(Dictionary<string, int> var)
{
return leftExpression.interprete(var)+rigntExpression.interprete(var);
}
}
public class SubExpression : SymbolExpression
{
public SubExpression(Expresssion left, Expresssion right)
: base(left, right)
{
}
public override int interprete(Dictionary<string, int> var)
{
return leftExpression.interprete(var) - rigntExpression.interprete(var);
}
}
public class Calculator
{
private string _expression;
public Calculator(string expression)
{
_expression = expression;
}
public int Calculate(Dictionary<string, int> var)
{
Stack<Expresssion> vExpressionStacks = new Stack<Expresssion>();
char[] charArray = _expression.ToCharArray();
Expresssion pLeft =null;
Expresssion pRight=null;
string curExp=string.Empty;
for (int nIndex = 0; nIndex < _expression.Length;nIndex++ )
{
switch (_expression[nIndex])
{
case '+':
pLeft = vExpressionStacks.Pop();
curExp = new string(_expression[++nIndex],1);
pRight =new VarExpression(curExp);
Expresssion pAddEx=new AddExpression(pLeft,pRight);
vExpressionStacks.Push(pAddEx);
break;
case '-':
pLeft = vExpressionStacks.Pop();
string varExp = new string(_expression[++nIndex],1);
pRight =new VarExpression(varExp);
Expresssion pSubEx=new SubExpression(pLeft,pRight);
vExpressionStacks.Push(pSubEx);
break;
default:
curExp = new string(_expression[nIndex],1);
Expresssion pVarExpression = new VarExpression(curExp);
vExpressionStacks.Push(pVarExpression);
break;
}
}
Expresssion pResult = vExpressionStacks.Pop();
return pResult.interprete(var);
}
}
//客户端调用
private void btnCalculate_Click(object sender, EventArgs e)
{
Dictionary<string, int> valueDic = new Dictionary<string, int>();
valueDic.Add("a",10);
valueDic.Add("b", 20);
valueDic.Add("c", 30);
Calculator pCal = new Calculator(inputTextBox.Text);
int nResult = pCal.Calculate(valueDic);
outputTextBox.Text = nResult.ToString();
}