解释器模式 c#

本文介绍了一个使用C#实现的计算器程序,该程序采用了解释器模式来解析和计算数学表达式。通过构建抽象语法树并定义不同的节点类型,如数值节点、乘法节点等,实现了对表达式的递归解析。

  解释器模是一种按照规定语法进行解析的方案。

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {

        public abstract class Node
        {
            public abstract double Interpret();
        }

      public class ValueNode : Node
      {
          private double value;

          public ValueNode(double value)
          {
              this.value = value;
          }

          public override double Interpret()
          {
              return this.value;
          }
      }


        public abstract class SymbolNode : Node
        {
            protected Node left;
            protected Node right;


            public SymbolNode(Node left, Node right)
            {
                this.left = left;
                this.right = right;
            }

        }

        public class MulNode : SymbolNode
        {
            public MulNode(Node left, Node right) : base(left, right)
            {

            }

            public override double Interpret()
            {
                return left.Interpret()*right.Interpret();
            }
        }

        public class ModNode : SymbolNode
        {
            public ModNode(Node left, Node right) : base(left, right)
            {
            }

            public override double Interpret()
            {
                return ((int)left.Interpret())%((int)right.Interpret());
            }
        }

        public class DivNode:SymbolNode
        {
            public DivNode(Node left, Node right) : base(left, right)
            {
            }

            public override double Interpret()
            {
                return left.Interpret()/right.Interpret();
            }
        }

        public class Calculator
        {
            private string statement;
            private Node node;

            public void Build(string statement)
            {
                Node left = null;
                Node right = null;
                Stack<Node> stack = new Stack<Node>();

                string[] statementArr = statement.Split(new char[] {' '});

                for (int i = 0; i < statementArr.Length; i++)
                {
                    if (statementArr[i].Equals("*"))
                    {
                        left = (Node) stack.Pop();
                        double val = Convert.ToDouble(statementArr[++i]);
                        right = new ValueNode(val);
                        stack.Push(new MulNode(left, right));
                    }
                    else if (statementArr[i].Equals("/"))
                    {
                        left = (Node)stack.Pop();
                        double val = Convert.ToDouble(statementArr[++i]);
                        right = new ValueNode(val);
                        stack.Push(new DivNode(left, right));
                    }
                    else if (statementArr[i].Equals("%"))
                    {
                        left = (Node)stack.Pop();
                        double val = Convert.ToDouble(statementArr[++i]);
                        right = new ValueNode(val);
                        stack.Push(new ModNode(left, right));
                    }
                    else
                    {
                        stack.Push(new ValueNode(Convert.ToDouble(statementArr[i])));
                    }
                }

                this.node = (Node) stack.Pop();
            }

            public double Compute()
            {
                return node.Interpret();
            }
        }

        static void Main(string[] args)
        {
            string statement = "3.5 * 4.5 / 2.6";

            Calculator cal = new Calculator();
            cal.Build(statement);

            Console.WriteLine(statement + "=" + cal.Compute());
        }
    }
}

 

转载于:https://www.cnblogs.com/zkzk945/p/5116912.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值