InterpreterPattern

 

//为了了解解析器这一设计模式,本文根据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();

        }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值