解释器模是一种按照规定语法进行解析的方案。
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()); } } }