示例#1
0
        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);
        }
示例#2
0
        /// <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
     {
         //说明输入的是汉字数字,不做任何处理
     }
 }