public static void ShowDemo() { Console.WriteLine("===== 处理 汉字数字大小写转换 的例子 ====="); string roman = "伍千肆百参拾贰"; //5432 ContextcnNum context = new ContextcnNum(roman); //构造抽象语法树 List<Expression> tree = new List<Expression>(); //加入终结符表达式 //如果能直接转换成数字则直接返回 tree.Add(new NumTerminalExpression()); //非终结符,处理个位数 tree.Add(new NonterminalOneExpression()); //非终结符,处理十位数 tree.Add(new NonterminalTenExpression()); //非终结符,处理百位数 tree.Add(new NonterminalHundredExpression()); //非终结器,处理千位数 tree.Add(new NonterminalThousandExpression()); //对抽象语法树的每个枝节进行解释操作 foreach (Expression exp in tree) { exp.Interpret(context); } Console.WriteLine("{0} = {1}", roman, context.data); }
/// <summary> /// 所有的具体表达式角色都需要实现的抽象方法 /// 这个方法为虚方法,并非抽象方法,为了代码复用 /// </summary> /// <param name="context">环境角色</param> public virtual void Interpret(ContextcnNum context) { //如果要处理的字符串长度为0则返回 if (context.statement.Length == 0) { return; } foreach (string key in table.Keys) { int value = table[key]; if (context.statement.EndsWith(key + GetPostifix())) { context.data += value * Multiplier(); context.statement = context.statement.Substring(0, context.statement.Length - this.GetLength()); break; } if (context.statement.EndsWith("零")) { context.statement = context.statement.Substring(0, context.statement.Length - 1); break; } if (context.statement.Length == 0) { return; } } }
/// <summary> /// 重写解释方法 /// </summary> /// <param name="context">环境角色</param> public override void Interpret(ContextcnNum context) { int i = 0; try { i = int.Parse(context.statement); //如果是数字则说明能够直接转换 //也就是说用不到非终结表达式角色 context.statement = ""; context.data = i; } catch { //说明输入的是汉字数字,不做任何处理 } }